https://github.com/desmond-ong/cheem-omg-empathy
Revision c40537d0b74edd6468a9be6b6cde11cb02b9f927 authored by Xuan on 07 December 2018, 10:50:06 UTC, committed by Xuan on 07 December 2018, 10:50:06 UTC
1 parent f85039f
Raw File
Tip revision: c40537d0b74edd6468a9be6b6cde11cb02b9f927 authored by Xuan on 07 December 2018, 10:50:06 UTC
Updated main README.md
Tip revision: c40537d
OMG_empathy_extract_faces.py
import cv2
import os
import dlib

import subprocess
import shutil
from shutil import copyfile
import sys


def progressBar(value, endvalue, bar_length=20):
    percent = float(value) / endvalue
    arrow = '-' * int(round(percent * bar_length) - 1) + '>'
    spaces = ' ' * (bar_length - len(arrow))

    sys.stdout.write("\rPercent: [{0}] {1}%".format(arrow + spaces, int(round(percent * 100))))
    sys.stdout.flush()


def extractFramesFromVideo(path,savePath, faceDetectorPrecision):
    videos = os.listdir(path + "/")

    for video in videos:

        videoPath = path + "/" + video
        print "- Processing Video:", videoPath + " ..."
        detector = dlib.get_frontal_face_detector()
        dataX = []

        copyTarget = "/data/datasets/OMG-Empathy/clip1.mp4"
        print "--- Copying file:", videoPath + " ..."
        copyfile(videoPath, copyTarget)
        cap = cv2.VideoCapture(copyTarget)

        #cap = cv2.VideoCapture(videoPath)
        totalFrames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
        numberOfImages = 0
        check = True
        flag = True
        imageNumber = 0
        lastImageWithFaceDetected = 0
        print "- Extracting Faces:", str(totalFrames) + " Frames ..."

        savePathActor = savePath + "/" + video + "/Actor/"
        savePathSubject = savePath + "/" + video + "/Subject/"

        if not os.path.exists(savePathActor):
            os.makedirs(savePathActor)
            os.makedirs(savePathSubject)
            while (check):
                    check, img = cap.read()
                    if img is not None:


                        #Extract actor face
                        imageActor = img[0:720, 0:1080]
                        if lastImageWithFaceDetected == 0 or lastImageWithFaceDetected > faceDetectorPrecision:
                            dets = detector(imageActor, 1)
                            lastImageWithFaceDetected = 0

                            if not len(dets) == 0:
                                oldDetsActor = dets
                        else:
                            dets = oldDetsActor


                        # if imageNumber > 8008:
                        #     print "Dets Actor:", dets
                        #     print "Dets Actor:", len(dets)
                        #
                        # if imageNumber == 5:
                        #     print "Dets Actor:", dets
                        #     print "Dets Actor:", len(dets)

                        try:
                            if not len(dets) == 0:
                                for i, d in enumerate(dets):
                                    croped = imageActor[d.top():d.bottom(), d.left():d.right()]
                                    cv2.imwrite(savePathActor + "/%d.png" % imageNumber, croped)
                            else:
                                cv2.imwrite(savePathActor + "/%d.png" % imageNumber, imageActor)


                        except:
                            print "------error!"

                        # Extract Subject Face
                        imageSubject = img[0:720, 1080:2560]
                        if lastImageWithFaceDetected == 0 or lastImageWithFaceDetected > faceDetectorPrecision:
                            dets = detector(imageSubject, 1)
                            lastImageWithFaceDetected = 0

                            if not len(dets) == 0:
                                oldDetsSubject = dets
                        else:
                            dets = oldDetsSubject

                        try:
                            if not len(dets) == 0:
                                for i, d in enumerate(dets):
                                    croped = imageSubject[d.top():d.bottom(), d.left():d.right()]
                                    cv2.imwrite(savePathSubject + "/%d.png" % imageNumber, croped)
                            else:
                                cv2.imwrite(savePathActor + "/%d.png" % imageNumber, imageSubject)

                        except:
                            print "------error!"

                        imageNumber = imageNumber + 1
                        lastImageWithFaceDetected = lastImageWithFaceDetected + 1
                        progressBar(imageNumber, totalFrames)






if __name__ == "__main__":


    #Path where the videos are
    path ="/data/videos/Training/"

    #Path where the faces will be saved
    savePath ="/data/faces/Training/"

    # If 1, the face detector will act upon each of the frames. If 1000, the face detector update its position every 100 frames.
    faceDetectorPrecision = 1000

    detector = dlib.get_frontal_face_detector()

    extractFramesFromVideo(path, savePath, faceDetectorPrecision)
back to top