File size: 2,170 Bytes
86756d8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
"""
This module allows to extract facial deatures from videos
"""
import os
import shutil
from retinaface import RetinaFace
from deepface import DeepFace
import json
from video_tools import generate_frames

FRAMES_PATH = "tmp_frames_faces"

def retrieve_faces_data(video_path, rate = 50, show_print = True):
    faces_lst = []
    generate_frames(video_path, FRAMES_PATH, rate = rate, show_print = show_print)
    for i in sorted([int(s[:-4]) for s in os.listdir(FRAMES_PATH)]):
      faces = RetinaFace.extract_faces(FRAMES_PATH + "/" + str(i) + ".png")
      data_lst = []
      for face in faces:
        try:
          face_dict = DeepFace.analyze(face, actions = ["emotion"], detector_backend = "skip")
          data_lst.append(face_dict["emotion"])
        except ValueError:
          # Face was not detected
          continue
      faces_lst.append(data_lst)
    # Delete temporary directory
    #shutil.rmtree(FRAMES_PATH)
    return faces_lst

def retrieve_to_file(dest, video_path):
  face_data = retrieve_faces_data(video_path, show_print = False)
  with open(dest, "w") as output_file:
        output_file.writelines([json.dumps(item) + "\n" for item in face_data])

def retrieve_to_files(dest, video_path):
  for file_name in os.listdir(video_path):
      retrieve_to_file(dest + "/" + os.path.splitext(file_name)[0] + "_data", video_path + "/" + file_name)

def restore_from_file(file_path):
  restored_lst = []
  with open(file_path, "r") as file:
    for line in file.readlines():
      if line != "":
        restored_lst.append(eval(line))
  return restored_lst
  
def data_to_vector(data):
    vec = []
    for frame in data:
        avg = [0, 0, 0, 0, 0, 0, 0]
        for face in frame:
            avg[0] += face["angry"]
            avg[1] += face["disgust"]
            avg[2] += face["fear"]
            avg[3] += face["happy"]
            avg[4] += face["sad"]
            avg[5] += face["surprise"]
            avg[6] += face["neutral"]
        if len(frame) != 0:
            for i in range(7):
                avg[i] /= len(frame)
            vec.append(avg)
    return vec

if __name__ == "__main__":
    retrieve_to_files("x", "result")