New
Esse commit está contido em:
Arquivo binário não exibido.
Arquivo binário não exibido.
Arquivo binário não exibido.
|
Depois Largura: | Altura: | Tamanho: 71 MiB |
Arquivo binário não exibido.
Diff do arquivo suprimido porque uma ou mais linhas são muito longas
+647
-360
Diff do arquivo suprimido porque uma ou mais linhas são muito longas
+239
@@ -0,0 +1,239 @@
|
|||||||
|
### General imports ###
|
||||||
|
import numpy as np
|
||||||
|
import pandas as pd
|
||||||
|
import cv2
|
||||||
|
|
||||||
|
from time import time
|
||||||
|
from time import sleep
|
||||||
|
import re
|
||||||
|
import os
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
from collections import OrderedDict
|
||||||
|
import matplotlib.animation as animation
|
||||||
|
|
||||||
|
### Image processing ###
|
||||||
|
from scipy.ndimage import zoom
|
||||||
|
from scipy.spatial import distance
|
||||||
|
import imutils
|
||||||
|
from scipy import ndimage
|
||||||
|
|
||||||
|
import dlib
|
||||||
|
from __future__ import division
|
||||||
|
|
||||||
|
from tensorflow.keras.models import load_model
|
||||||
|
from imutils import face_utils
|
||||||
|
|
||||||
|
import requests
|
||||||
|
|
||||||
|
class ModelPredict() :
|
||||||
|
|
||||||
|
def __init__(self, path, model, image) :
|
||||||
|
self.image = image
|
||||||
|
self.path = path
|
||||||
|
self.model = model
|
||||||
|
|
||||||
|
def detect_face(frame):
|
||||||
|
|
||||||
|
global shape_x
|
||||||
|
global shape_y
|
||||||
|
global input_shape
|
||||||
|
global nClasses
|
||||||
|
|
||||||
|
shape_x = 48
|
||||||
|
shape_y = 48
|
||||||
|
input_shape = (shape_x, shape_y, 1)
|
||||||
|
nClasses = 7
|
||||||
|
|
||||||
|
#Cascade classifier pre-trained model
|
||||||
|
cascPath = 'Models/face_landmarks.dat'
|
||||||
|
faceCascade = cv2.CascadeClassifier(cascPath)
|
||||||
|
|
||||||
|
#BGR -> Gray conversion
|
||||||
|
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
|
||||||
|
|
||||||
|
#Cascade MultiScale classifier
|
||||||
|
detected_faces = faceCascade.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=6,
|
||||||
|
minSize=(shape_x, shape_y),
|
||||||
|
flags=cv2.CASCADE_SCALE_IMAGE)
|
||||||
|
coord = []
|
||||||
|
|
||||||
|
for x, y, w, h in detected_faces :
|
||||||
|
if w > 100 :
|
||||||
|
sub_img=frame[y:y+h,x:x+w]
|
||||||
|
cv2.rectangle(frame,(x,y),(x+w,y+h),(0, 255,255),1)
|
||||||
|
coord.append([x,y,w,h])
|
||||||
|
|
||||||
|
return gray, detected_faces, coord
|
||||||
|
|
||||||
|
def extract_face_features(faces, offset_coefficients=(0.075, 0.05)):
|
||||||
|
gray = faces[0]
|
||||||
|
detected_face = faces[1]
|
||||||
|
|
||||||
|
new_face = []
|
||||||
|
|
||||||
|
for det in detected_face :
|
||||||
|
#Region dans laquelle la face est détectée
|
||||||
|
x, y, w, h = det
|
||||||
|
#X et y correspondent à la conversion en gris par gray, et w, h correspondent à la hauteur/largeur
|
||||||
|
|
||||||
|
#Offset coefficient, np.floor takes the lowest integer (delete border of the image)
|
||||||
|
horizontal_offset = np.int(np.floor(offset_coefficients[0] * w))
|
||||||
|
vertical_offset = np.int(np.floor(offset_coefficients[1] * h))
|
||||||
|
|
||||||
|
#gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
|
||||||
|
#gray transforme l'image
|
||||||
|
extracted_face = gray[y+vertical_offset:y+h, x+horizontal_offset:x-horizontal_offset+w]
|
||||||
|
|
||||||
|
#Zoom sur la face extraite
|
||||||
|
new_extracted_face = zoom(extracted_face, (shape_x / extracted_face.shape[0],shape_y / extracted_face.shape[1]))
|
||||||
|
#cast type float
|
||||||
|
new_extracted_face = new_extracted_face.astype(np.float32)
|
||||||
|
#scale
|
||||||
|
new_extracted_face /= float(new_extracted_face.max())
|
||||||
|
#print(new_extracted_face)
|
||||||
|
|
||||||
|
new_face.append(new_extracted_face)
|
||||||
|
|
||||||
|
return new_face
|
||||||
|
|
||||||
|
def start_live() :
|
||||||
|
|
||||||
|
(nStart, nEnd) = face_utils.FACIAL_LANDMARKS_IDXS["nose"]
|
||||||
|
(mStart, mEnd) = face_utils.FACIAL_LANDMARKS_IDXS["mouth"]
|
||||||
|
(jStart, jEnd) = face_utils.FACIAL_LANDMARKS_IDXS["jaw"]
|
||||||
|
|
||||||
|
(eblStart, eblEnd) = face_utils.FACIAL_LANDMARKS_IDXS["left_eyebrow"]
|
||||||
|
(ebrStart, ebrEnd) = face_utils.FACIAL_LANDMARKS_IDXS["right_eyebrow"]
|
||||||
|
|
||||||
|
model = load_model('Models/video.h5')
|
||||||
|
#Lancer la capture video
|
||||||
|
video_capture = cv2.VideoCapture(0)
|
||||||
|
|
||||||
|
while True:
|
||||||
|
# Capture frame-by-frame
|
||||||
|
ret, frame = video_capture.read()
|
||||||
|
|
||||||
|
face_index = 0
|
||||||
|
|
||||||
|
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
|
||||||
|
rects = face_detect(gray, 1)
|
||||||
|
#gray, detected_faces, coord = detect_face(frame)
|
||||||
|
|
||||||
|
for (i, rect) in enumerate(rects):
|
||||||
|
|
||||||
|
shape = predictor_landmarks(gray, rect)
|
||||||
|
shape = face_utils.shape_to_np(shape)
|
||||||
|
|
||||||
|
# Identify face coordinates
|
||||||
|
(x, y, w, h) = face_utils.rect_to_bb(rect)
|
||||||
|
face = gray[y:y+h,x:x+w]
|
||||||
|
|
||||||
|
#Zoom on extracted face
|
||||||
|
face = zoom(face, (shape_x / face.shape[0],shape_y / face.shape[1]))
|
||||||
|
|
||||||
|
#Cast type float
|
||||||
|
face = face.astype(np.float32)
|
||||||
|
|
||||||
|
#Scale
|
||||||
|
face /= float(face.max())
|
||||||
|
face = np.reshape(face.flatten(), (1, 48, 48, 1))
|
||||||
|
|
||||||
|
#Make Prediction
|
||||||
|
prediction = model.predict(face)
|
||||||
|
prediction_result = np.argmax(prediction)
|
||||||
|
|
||||||
|
# Rectangle around the face
|
||||||
|
cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)
|
||||||
|
|
||||||
|
cv2.putText(frame, "Face #{}".format(i + 1), (x - 10, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
|
||||||
|
|
||||||
|
for (j, k) in shape:
|
||||||
|
cv2.circle(frame, (j, k), 1, (0, 0, 255), -1)
|
||||||
|
|
||||||
|
# 1. Add prediction probabilities
|
||||||
|
cv2.putText(frame, "----------------",(40,100 + 180*i), cv2.FONT_HERSHEY_SIMPLEX, 0.5, 155, 0)
|
||||||
|
cv2.putText(frame, "Emotional report : Face #" + str(i+1),(40,120 + 180*i), cv2.FONT_HERSHEY_SIMPLEX, 0.5, 155, 0)
|
||||||
|
cv2.putText(frame, "Angry : " + str(round(prediction[0][0],3)),(40,140 + 180*i), cv2.FONT_HERSHEY_SIMPLEX, 0.5, 155, 0)
|
||||||
|
cv2.putText(frame, "Disgust : " + str(round(prediction[0][1],3)),(40,160 + 180*i), cv2.FONT_HERSHEY_SIMPLEX, 0.5, 155, 0)
|
||||||
|
cv2.putText(frame, "Fear : " + str(round(prediction[0][2],3)),(40,180 + 180*i), cv2.FONT_HERSHEY_SIMPLEX, 0.5, 155, 1)
|
||||||
|
cv2.putText(frame, "Happy : " + str(round(prediction[0][3],3)),(40,200 + 180*i), cv2.FONT_HERSHEY_SIMPLEX, 0.5, 155, 1)
|
||||||
|
cv2.putText(frame, "Sad : " + str(round(prediction[0][4],3)),(40,220 + 180*i), cv2.FONT_HERSHEY_SIMPLEX, 0.5, 155, 1)
|
||||||
|
cv2.putText(frame, "Surprise : " + str(round(prediction[0][5],3)),(40,240 + 180*i), cv2.FONT_HERSHEY_SIMPLEX, 0.5, 155, 1)
|
||||||
|
cv2.putText(frame, "Neutral : " + str(round(prediction[0][6],3)),(40,260 + 180*i), cv2.FONT_HERSHEY_SIMPLEX, 0.5, 155, 1)
|
||||||
|
|
||||||
|
# 2. Annotate main image with a label
|
||||||
|
if prediction_result == 0 :
|
||||||
|
cv2.putText(frame, "Angry",(x+w-10,y-10), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
|
||||||
|
elif prediction_result == 1 :
|
||||||
|
cv2.putText(frame, "Disgust",(x+w-10,y-10), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
|
||||||
|
elif prediction_result == 2 :
|
||||||
|
cv2.putText(frame, "Fear",(x+w-10,y-10), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
|
||||||
|
elif prediction_result == 3 :
|
||||||
|
cv2.putText(frame, "Happy",(x+w-10,y-10), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
|
||||||
|
elif prediction_result == 4 :
|
||||||
|
cv2.putText(frame, "Sad",(x+w-10,y-10), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
|
||||||
|
elif prediction_result == 5 :
|
||||||
|
cv2.putText(frame, "Surprise",(x+w-10,y-10), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
|
||||||
|
else :
|
||||||
|
cv2.putText(frame, "Neutral",(x+w-10,y-10), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
|
||||||
|
|
||||||
|
# 3. Eye Detection and Blink Count
|
||||||
|
leftEye = shape[lStart:lEnd]
|
||||||
|
rightEye = shape[rStart:rEnd]
|
||||||
|
|
||||||
|
# Compute Eye Aspect Ratio
|
||||||
|
leftEAR = eye_aspect_ratio(leftEye)
|
||||||
|
rightEAR = eye_aspect_ratio(rightEye)
|
||||||
|
ear = (leftEAR + rightEAR) / 2.0
|
||||||
|
|
||||||
|
# And plot its contours
|
||||||
|
leftEyeHull = cv2.convexHull(leftEye)
|
||||||
|
rightEyeHull = cv2.convexHull(rightEye)
|
||||||
|
cv2.drawContours(frame, [leftEyeHull], -1, (0, 255, 0), 1)
|
||||||
|
cv2.drawContours(frame, [rightEyeHull], -1, (0, 255, 0), 1)
|
||||||
|
|
||||||
|
# 4. Detect Nose
|
||||||
|
nose = shape[nStart:nEnd]
|
||||||
|
noseHull = cv2.convexHull(nose)
|
||||||
|
cv2.drawContours(frame, [noseHull], -1, (0, 255, 0), 1)
|
||||||
|
|
||||||
|
# 5. Detect Mouth
|
||||||
|
mouth = shape[mStart:mEnd]
|
||||||
|
mouthHull = cv2.convexHull(mouth)
|
||||||
|
cv2.drawContours(frame, [mouthHull], -1, (0, 255, 0), 1)
|
||||||
|
|
||||||
|
# 6. Detect Jaw
|
||||||
|
jaw = shape[jStart:jEnd]
|
||||||
|
jawHull = cv2.convexHull(jaw)
|
||||||
|
cv2.drawContours(frame, [jawHull], -1, (0, 255, 0), 1)
|
||||||
|
|
||||||
|
# 7. Detect Eyebrows
|
||||||
|
ebr = shape[ebrStart:ebrEnd]
|
||||||
|
ebrHull = cv2.convexHull(ebr)
|
||||||
|
cv2.drawContours(frame, [ebrHull], -1, (0, 255, 0), 1)
|
||||||
|
ebl = shape[eblStart:eblEnd]
|
||||||
|
eblHull = cv2.convexHull(ebl)
|
||||||
|
cv2.drawContours(frame, [eblHull], -1, (0, 255, 0), 1)
|
||||||
|
|
||||||
|
cv2.putText(frame,'Number of Faces : ' + str(len(rects)),(40, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, 155, 1)
|
||||||
|
cv2.imshow('Video', frame)
|
||||||
|
|
||||||
|
if cv2.waitKey(1) & 0xFF == ord('q'):
|
||||||
|
break
|
||||||
|
|
||||||
|
# When everything is done, release the capture
|
||||||
|
video_capture.release()
|
||||||
|
cv2.destroyAllWindows()
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
import sys
|
||||||
|
if len(sys.argv) is not 3:
|
||||||
|
print("Usage: python google_drive.py drive_file_id destination_file_path")
|
||||||
|
else:
|
||||||
|
# TAKE ID FROM SHAREABLE LINK
|
||||||
|
file_id = sys.argv[1]
|
||||||
|
# DESTINATION FILE ON YOUR DISK
|
||||||
|
destination = sys.argv[2]
|
||||||
|
download_file_from_google_drive(file_id, destination)
|
||||||
|
|
||||||
Referência em uma Nova Issue
Bloquear um usuário