File size: 5,142 Bytes
5971329
 
a48be09
5971329
 
 
 
 
 
 
 
47a77c5
5971329
 
 
 
 
 
 
 
3be2ce3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2578cc6
 
 
 
3be2ce3
 
 
 
 
 
5971329
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3be2ce3
5971329
3be2ce3
ef83c22
2578cc6
 
 
 
 
 
5971329
d51323f
3be2ce3
 
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
import gradio as gr

import keras
from keras.preprocessing.image import img_to_array
import imutils
import cv2
from keras.models import load_model
import numpy as np

# parameters for loading data and images
detection_model_path = 'haarcascade_files/haarcascade_frontalface_default.xml'
emotion_model_path = 'model2/model2_entire_model.h5'

# hyper-parameters for bounding boxes shape
# loading models
face_detection = cv2.CascadeClassifier(detection_model_path)
emotion_classifier = load_model(emotion_model_path, compile=False)
EMOTIONS = ['neutral','happiness','surprise','sadness','anger','disgust','fear','contempt','unknown']


# def predict(frame):

#     frame = imutils.resize(frame, width=300)
#     gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
#     faces = face_detection.detectMultiScale(gray, scaleFactor=1.1,
#                                             minNeighbors=5, minSize=(30, 30),
#                                             flags=cv2.CASCADE_SCALE_IMAGE)

#     frameClone = frame.copy()
#     if len(faces) > 0:
#         faces = sorted(faces, reverse=True,
#                        key=lambda x: (x[2] - x[0]) * (x[3] - x[1]))[0]
#         (fX, fY, fW, fH) = faces
#         # Extract the ROI of the face from the grayscale image, resize it to a fixed 28x28 pixels, and then prepare
#         # the ROI for classification via the CNN
#         roi = gray[fY:fY + fH, fX:fX + fW]
#         roi = cv2.resize(roi, (48, 48))
#         roi = roi.astype("float") / 255.0
#         roi = img_to_array(roi)
#         roi = np.expand_dims(roi, axis=0)

#         preds = emotion_classifier.predict(roi)[0]
#         label = EMOTIONS[preds.argmax()]
#     else:
#         return frameClone, "Can't find your face"

#     probs = {}
#     cv2.putText(frameClone, label, (fX, fY - 10),
#                 cv2.FONT_HERSHEY_DUPLEX, 1, (238, 164, 64), 1)
#     cv2.rectangle(frameClone, (fX, fY), (fX + fW, fY + fH),
#                   (238, 164, 64), 2)

#     for (i, (emotion, prob)) in enumerate(zip(EMOTIONS, preds)):
#         probs[emotion] = float(prob)

#     return frameClone, probs

# inp = gr.components.Image(sources="webcam", label="Your face")
# out = [
#     gr.components.Image(label="Predicted Emotion"),
#     gr.components.Label(num_top_classes=2, label="Top 2 Probabilities")
# ]
# title = "Facial Emotion Recognition"
# description = "How well can this model predict your emotions? Take a picture with your webcam, and it will guess if" \
#               " you are: happy, sad, angry, disgusted, scared, surprised, or neutral."
# thumbnail = "https://raw.githubusercontent.com/gradio-app/hub-emotion-recognition/master/thumbnail.png"

# # gr.Interface(predict, inp, out, capture_session=True, title=title, thumbnail=thumbnail,
# #              description=description).launch(inbrowser=True)
# gr.Interface(fn=predict, inputs=inp, outputs=out, title=title, thumbnail=thumbnail).launch()

######################################################################################################################################################
def predict(frame):

    frame = imutils.resize(frame, width=300)
    gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
    faces = face_detection.detectMultiScale(gray, scaleFactor=1.1,
                                            minNeighbors=5, minSize=(30, 30),
                                            flags=cv2.CASCADE_SCALE_IMAGE)

    frameClone = frame.copy()
    if len(faces) > 0:
        faces = sorted(faces, reverse=True,
                       key=lambda x: (x[2] - x[0]) * (x[3] - x[1]))[0]
        (fX, fY, fW, fH) = faces
        # Extract the ROI of the face from the grayscale image, resize it to a fixed 28x28 pixels, and then prepare
        # the ROI for classification via the CNN
        roi = gray[fY:fY + fH, fX:fX + fW]
        roi = cv2.resize(roi, (48, 48))
        roi = roi.astype("float") / 255.0
        roi = img_to_array(roi)
        roi = np.expand_dims(roi, axis=0)

        preds = emotion_classifier.predict(roi)[0]
        label = EMOTIONS[preds.argmax()]
    else:
        return frameClone, "Can't find your face"

    probs = {}
    cv2.putText(frameClone, label, (fX, fY - 10),
                cv2.FONT_HERSHEY_DUPLEX, 1, (238, 164, 64), 1)
    cv2.rectangle(frameClone, (fX, fY), (fX + fW, fY + fH),
                  (238, 164, 64), 2)

    for (i, (emotion, prob)) in enumerate(zip(EMOTIONS, preds)):
        probs[emotion] = float(prob)

    return frameClone, probs

inp = gr.components.Video(sources="webcam", label="Your face")
out = [
    gr.components.Video(label="Predicted Emotion"),
    gr.components.Label(num_top_classes=2, label="Top 2 Probabilities")
    ]

title = "Facial Emotion Recognition"
description = "How well can this model predict your emotions? Take a picture with your webcam, and it will guess if" \
              " you are: happy, sad, angry, disgusted, scared, surprised, or neutral."
thumbnail = "https://raw.githubusercontent.com/gradio-app/hub-emotion-recognition/master/thumbnail.png"

gr.Interface(fn=predict, inputs=inp, outputs=out, title=title, thumbnail=thumbnail).launch()