Spaces:
Running
Running
File size: 5,959 Bytes
761f4da 96705f2 2587bd0 96705f2 0c2700d 961c5fc b45a874 7379cf2 0c2700d d5de1e1 0c2700d 961c5fc 761f4da 4d29448 761f4da 0c2700d 961c5fc 0c2700d 96705f2 b45a874 90452ba b45a874 0c2700d 96705f2 0c2700d 96705f2 9e3243b 96705f2 761f4da 96705f2 961c5fc 96705f2 761f4da 96705f2 961c5fc 96705f2 961c5fc 33bf45e add9fb8 961c5fc 89a385f 96705f2 c8aa6df 35d42b9 f97c524 96705f2 0c2700d 78eae32 961c5fc 20429ec 961c5fc 20429ec 961c5fc 5118e25 96705f2 0c2700d 761f4da 0c2700d |
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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 |
import gradio as gr
import os
import cv2
import face_recognition
from fastai.vision.all import load_learner
import time
import base64
from deepface import DeepFace
import torchaudio, torch
import subprocess
# import pathlib
# temp = pathlib.PosixPath
# pathlib.PosixPath = pathlib.WindowsPath
backends = [
'opencv',
'ssd',
'dlib',
'mtcnn',
'retinaface',
'mediapipe'
]
model = load_learner("gaze-recognizer-v3.pkl")
def video_processing(video_file, encoded_video):
angry = 0
disgust = 0
fear = 0
happy = 0
sad = 0
surprise = 0
neutral = 0
emotion_count = 0
if encoded_video != "":
decoded_file_data = base64.b64decode(encoded_video)
with open("temp_video.mp4", "wb") as f:
f.write(decoded_file_data)
video_file = "temp_video.mp4"
start_time = time.time()
subprocess.call(["ffmpeg", "-i", 'temp_video.mp4', "audio.wav"])
waveform, sample_rate = torchaudio.load("audio.wav")
waveform, sample_rate
waveform, sample_rate = torchaudio.load("audio.wav")
resampler = torchaudio.transforms.Resample(sample_rate, 16000)
waveform = resampler(waveform)[0]
input_features = processor(waveform.squeeze(dim=0), return_tensors="pt").input_features
predicted_ids = model.generate(input_features)
transcription = processor.batch_decode(predicted_ids, skip_special_tokens=True)
print(transcription[0])
video_capture = cv2.VideoCapture(video_file)
on_camera = 0
off_camera = 0
total = 0
while True:
# Read a single frame from the video
for i in range(24*3):
ret, frame = video_capture.read()
if not ret:
break
# If there are no more frames, break out of the loop
if not ret:
break
# Convert the frame to RGB color (face_recognition uses RGB)
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# Find all the faces in the frame using a pre-trained convolutional neural network.
face_locations = face_recognition.face_locations(gray)
#face_locations = face_recognition.face_locations(gray, number_of_times_to_upsample=0, model="cnn")
if len(face_locations) > 0:
# Show the original frame with face rectangles drawn around the faces
for top, right, bottom, left in face_locations:
# cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)
face_image = gray[top:bottom, left:right]
color_image = frame[top:bottom, left:right]
# Resize the face image to the desired size
resized_face_image = cv2.resize(face_image, (128,128))
try:
emotion = DeepFace.analyze(color_image,actions=['emotion'],detector_backend = backends[2],enforce_detection = False)# 2,3, 4 works
emotion_count += 1
except Exception as e:
pass
print(emotion[0]['emotion'])
angry += emotion[0]['emotion']['angry']
disgust += emotion[0]['emotion']['disgust']
fear += emotion[0]['emotion']['fear']
happy += emotion[0]['emotion']['happy']
sad += emotion[0]['emotion']['sad']
surprise += emotion[0]['emotion']['surprise']
neutral += emotion[0]['emotion']['neutral']
# Predict the class of the resized face image using the model
result = model.predict(resized_face_image)
print(result[0])
if(result[0] == 'on_camera'): on_camera = on_camera + 1
elif(result[0] == 'off_camera'): off_camera = off_camera + 1
total = total + 1
try:
# your processing code here
gaze_percentage = on_camera / total * 100
except Exception as e:
print(f"An error occurred while processing the video: {e}")
gaze_percentage = f'no face detected Total = {total},on_camera = {on_camera},off_camera = {off_camera}'
print(f'Total = {total},on_camera = {on_camera},off_camera = {off_camera}')
# print(f'focus perfectage = {on_camera/total*100}')
# Release the video capture object and close all windows
video_capture.release()
cv2.destroyAllWindows()
end_time = time.time()
print(f'Time taken: {end_time-start_time}')
if os.path.exists("temp_video.mp4"):
os.remove("temp_video.mp4")
print(gaze_percentage)
angry = angry / emotion_count
disgust = disgust / emotion_count
fear = fear / emotion_count
happy = happy / emotion_count
sad = sad / emotion_count
surprise = surprise / emotion_count
neutral = neutral / emotion_count
emotion = {
'angry': angry,
'disgust': disgust,
'fear': fear,
'happy': happy,
'sad': sad,
'surprise': surprise,
'neutral': neutral
},
# angry = 'total anger percentage' + str(angry)
# disgust = 'total disgust percentage' + str(disgust)
# fear = 'total fear percentage' + str(fear)
# happy = 'total happy percentage' + str(happy)
# sad = 'total sad percentage' + str(sad)
# surprise = 'total surprise percentage' + str(surprise)
# neutral = 'total neutral percentage' + str(neutral)
print(f'total anger percentage = {angry}')
print(f'total disgust percentage = {disgust}')
print(f'total fear percentage = {fear}')
print(f'total happy percentage = {happy}')
print(f'total sad percentage = {sad}')
print(f'total surprise percentage = {surprise}')
print(f'total neutral percentage = {neutral}')
return str(gaze_percentage)
demo = gr.Interface(fn=video_processing,
inputs=["video", "text"],
outputs="text")
if __name__ == "__main__":
demo.launch() |