Извлечение лиц из видео с помощью AWS Rekognition

С помощью AWS Rekognition я смог обнаружить лица в видео mp4 с помощью следующих узлов:

var AWS = require("aws-sdk");                                                                                              
AWS.config.update({                                                                                                        
  region: "us-east-1"                                                                                                      
});                                                                                                                        

var rekognition = new AWS.Rekognition();                                                                                   



var params = {                                                                                                             
  Video: { /* required */                                                                                                  
    S3Object: {                                                                                                            
      Bucket: 'videobucket',                                                                                          
      Name: 'testvideo.mp4'                                                                                                
    }                                                                                                                      
  },                                                                                                                       
  FaceAttributes: "ALL",                                                                                                   
  NotificationChannel: {                                                                                                   
    RoleArn: 'arn:aws:iam::xxx:role/xxx', /* required */                                                     
    SNSTopicArn: 'arn:aws:sns:us-east-1:xxx:alerts' /* required */                                                
  }                                                                                                                        
};                                                                                                                         
rekognition.startFaceDetection(params, function(err, data) {                                                               
  if (err) console.log(err, err.stack); // an error occurred                                                               
  else     console.log(data);           // successful response                                                             
});    

И смог получить результаты с помощью следующего cli,

aws rekognition get-face-detection - идентификатор задания xxxxxxx

и выводит лица в следующем формате json,

{                                                                                                                          
    "Faces": [                                                                                                             
        {                                                                                                                  
            "Timestamp": 0,                                                                                                
            "Face": {                                                                                                      
                "BoundingBox": {                                                                                           
                    "Width": 0.029999999329447746,                                                                         
                    "Top": 0.2588889002799988,                                                                             
                    "Left": 0.29374998807907104,                                                                           
                    "Height": 0.052222222089767456                                                                         
                },                                                                                                         
                "Landmarks": [                                                                                             
                    {                                                                                                      
                        "Y": 0.28277161717414856,                                                                          
                        "X": 0.3052537739276886,                                                                           
                        "Type": "eyeLeft"                                                                                  
                    },                                                                                                     
                    {                                                                                                      
                        "Y": 0.27957838773727417,                                                                          
                        "X": 0.3085327744483948,                                                                           
                        "Type": "eyeRight"    

Как извлечь эти лица как изображения и выгрузить их в ведро s3?

Спасибо


person Kannaiyan    schedule 21.12.2017    source источник
comment
Как ты решил свою проблему?   -  person Jiūtas Brólickaitis    schedule 11.06.2018
comment
Еще не решено.   -  person Kannaiyan    schedule 11.06.2018
comment
Почему бы вам просто не взять кадр с меткой времени, предоставленной aws, обрезать область (опять же, предоставленную aws) и сбрасывать грани одну за другой?   -  person Jiūtas Brólickaitis    schedule 11.06.2018
comment
Как выбрать рамку и вырезать из нее изображение?   -  person Kannaiyan    schedule 11.06.2018


Ответы (2)


на ваш вопрос, вы можете получить только лица, обрезав части лица из исходного изображения с помощью ограничивающих рамок, возвращаемых из aws rekognition. Я покончил с питоном

     widtho = 717 #width of the given image
     heighto = 562 #height of the given image
     counter = 0
     facecount = 1
     s3 = boto3.resource('s3')
     bucket = s3.Bucket('rek')
     if __name__ == "__main__":
     #Choosing the file in s3 bucket
         photo = 'sl.jpg'
         bucket = 'rek'
     #Intilization of rekognition and performing detect_faces 
     client = boto3.client('rekognition', region_name='eu-west-1')
     response = client.detect_faces(
     Image={'S3Object': {'Bucket': bucket, 'Name': photo}}, Attributes=['ALL'])
     print('Detected faces for ' + photo)
     print('The faces are detected and labled from left to right')
     for faceDetail in response['FaceDetails']:
         print('Face Detected= ', i)
         #To mark a bounding box of the image using coordinates
         print('Bounding Box')
         bboxlen = len(faceDetail['BoundingBox'])
         print(bboxlen)
         width = faceDetail['BoundingBox'].get('Width')
         height = faceDetail['BoundingBox'].get('Height')
         left = faceDetail['BoundingBox'].get('Left')
         top = faceDetail['BoundingBox'].get('Top')
         w = int(width * widtho)
         h = int(height * heighto)
         x = int(left * widtho)
         y = int(top * heighto)
         img2 = image_np[y:h, x:w]
         #now you can push the img2 which is one of the face in the single frame
person Naveenkumar    schedule 12.09.2018
comment
Все, что у меня есть, это файл mp4 и результаты распознавания. Как мне получить кадры из видео и извлечь изображения? Похоже, ваш код извлекает лицо из изображения. - person Kannaiyan; 12.09.2018
comment
вам нужно создать другой скрипт, который использует OpenCV для чтения видеокадра в определенные временные метки, когда обнаруживаются лица, затем обрезать лица каждого кадра и сохранять в локальном или s3 из ограничивающей рамки лица в соответствии с вышеуказанным методом - person Naveenkumar; 12.09.2018
comment
Спасибо за предложение. Если у вас есть сценарий, не могли бы вы поделиться, это мой вопрос. Подайте видео, извлеките лица и сохраните в s3. - person Kannaiyan; 12.09.2018
comment
Точно у меня нет кода .... но вы должны думать умно, не во всех кадрах видео есть лица ... если вы хотите сэкономить деньги на распознавании aws, сделайте локальный opencv для обнаружения лиц в кадре , если обнаружено, отправьте кадр в корзину s3 ... затем выполните повторное распознавание изображений в корзине, убедитесь, что изображения сохранены с соответствующим именем времени кадра ... так, чтобы, возвращая координаты для конкретного кадра, вы могли сделать cv2 . rectangle с полученными координатами для обнаруженных кадров в видео - person Naveenkumar; 14.09.2018
comment
Спасибо. Преобразование видео в изображения - громоздкий процесс и занимает больше времени при чтении и записи. распознавание должно уметь делать это на лету. Все еще не было времени на это посмотреть. Буду держать в курсе. - person Kannaiyan; 14.09.2018

Вот шаги, которые нужно выполнить для извлечения лиц. Используя выходные данные AWS rekognition, создайте выходные данные сценария оболочки для извлечения лиц с помощью ffmpeg. Добавлена ​​дополнительная прокладка к лицу, чтобы получить волосы, подбородок и боковые уши. Вы можете настроить его в соответствии с вашими потребностями.

var faces = require('./output1.json');                                                                                     

var oldtimestamp = -1;                                                                                                     
var sequence = 1;                                                                                                          



faces.Faces.forEach(function(element) {                                                                                    
    var size = element.Face.BoundingBox;                                                                                   
    var vheight = 576;                                                                                                     
    var vwidth = 720;                                                                                                      
    size.Width = parseInt(size.Width * 1.25 *  vwidth);                                                                    
    size.Left = parseInt(size.Left * vwidth);                                                                              
    size.Top = parseInt(size.Top * 0.5  * vheight)  ;                                                                      
    size.Height = parseInt(size.Height * 1.75 * vheight);                                                                  

  var newtimestamp = element.Timestamp;                                                                                    
  if( oldtimestamp != newtimestamp ) {                                                                                     
        console.log('ffmpeg  -i f1.vob  -ss 00:00:' + (element.Timestamp/1000) + '   -qmin 1 -q:v 1 -frames:v 1 ./pictures/frame' + element.Timestamp + '.png ');                                                                                     
     oldtimestamp = newtimestamp;                                                                                          
     sequence = 1;                                                                                                         
        }                                                                                                                  
  console.log('ffmpeg -i ./pictures/frame' + element.Timestamp + '.png -vf  "crop=' + size.Width + ':' + size.Height + ':' + size.Left + ':' + size.Top +  '"  ./faces/frame' + element.Timestamp + '' + sequence + '.png');                          
     sequence++;                                                                                                           
}); 

Используется докер для ffmpeg, нулевая установка, пикап и запуск.

docker run -it --rm --entrypoint = 'bash' -v $ {PWD}: / tmp / workdir jrottenberg / ffmpeg

Отметка времени, которую нужно разделить на 1000, чтобы преобразовать миллисекунды в секунды. добавил #! / bin / sh вручную.

#!/bin/sh                                                                                                                  
ffmpeg  -i f1.vob  -ss 00:00:0   -qmin 1 -q:v 1 -frames:v 1 ./pictures/frame0.png                                          
ffmpeg -i ./pictures/frame0.png -vf  "crop=171:200:446:70"  ./faces/frame01.png                                            
ffmpeg -i ./pictures/frame0.png -vf  "crop=170:198:168:43"  ./faces/frame02.png                                            
ffmpeg -i ./pictures/frame0.png -vf  "crop=192:224:532:23"  ./faces/frame03.png                                            
ffmpeg -i ./pictures/frame0.png -vf  "crop=151:176:82:85"  ./faces/frame04.png                                             
ffmpeg  -i f1.vob  -ss 00:00:0.2   -qmin 1 -q:v 1 -frames:v 1 ./pictures/frame200.png                                      
ffmpeg -i ./pictures/frame200.png -vf  "crop=170:198:446:71"  ./faces/frame2001.png                                        
ffmpeg -i ./pictures/frame200.png -vf  "crop=174:203:167:43"  ./faces/frame2002.png                                        
ffmpeg -i ./pictures/frame200.png -vf  "crop=194:226:531:22"  ./faces/frame2003.png                                        
ffmpeg -i ./pictures/frame200.png -vf  "crop=152:176:81:86"  ./faces/frame2004.png                                         
ffmpeg  -i f1.vob  -ss 00:00:0.4   -qmin 1 -q:v 1 -frames:v 1 ./pictures/frame400.png                                      
ffmpeg -i ./pictures/frame400.png -vf  "crop=170:197:446:71"  ./faces/frame4001.png                                        
ffmpeg -i ./pictures/frame400.png -vf  "crop=174:203:167:43"  ./faces/frame4002.png                                        
ffmpeg -i ./pictures/frame400.png -vf  "crop=194:226:531:22"  ./faces/frame4003.png                                        
ffmpeg -i ./pictures/frame400.png -vf  "crop=152:176:81:86"  ./faces/frame4004.png                                         
ffmpeg  -i f1.vob  -ss 00:00:0.6   -qmin 1 -q:v 1 -frames:v 1 ./pictures/frame600.png 

Скопируйте вывод в S3:

aws s3 cp faces s3: // outputbucket / faces / --recursive

Надеюсь, это поможет.

person Kannaiyan    schedule 25.09.2018