File size: 3,415 Bytes
5971329
88142f2
5971329
 
b125ffc
 
 
5971329
b125ffc
5971329
eb7603b
5971329
 
b125ffc
5971329
b125ffc
6458128
b125ffc
 
 
6458128
 
 
 
 
 
 
 
 
 
5971329
 
 
 
 
 
 
6458128
 
 
 
 
5971329
b125ffc
132b5af
 
 
 
 
 
 
 
 
5971329
b125ffc
2578cc6
b125ffc
2578cc6
5971329
fdc7694
 
 
 
 
 
 
 
 
 
868ba40
fdc7694
 
b125ffc
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
import gradio as gr
import os
import cv2
import numpy as np
import imutils
from keras.preprocessing.image import img_to_array
from keras.models import load_model

# Load the pre-trained models and define parameters
detection_model_path = 'haarcascade_files/haarcascade_frontalface_default.xml'
emotion_model_path = 'model_2_aug_nocall_BEST/model_2_aug_nocall_entire_model.h5'
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']

# Function to predict emotions from a frame
def predict(frame_or_path):
    if isinstance(frame_or_path, np.ndarray):  # If input is a webcam frame
        frame = imutils.resize(frame_or_path, width=300)
    else:  # If input is a file path
        frame = cv2.imread(frame_or_path)
        if frame is None:
            return None, "Error: Unable to read image or video."
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        faces = face_detection.detectMultiScale(gray, scaleFactor=1.1,
                                                minNeighbors=5, minSize=(30, 30),
                                                flags=cv2.CASCADE_SCALE_IMAGE)
        if len(faces) == 0:
            return frame, "No face detected."
        (fX, fY, fW, fH) = faces[0]
        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()]
        cv2.putText(frame, label, (fX, fY - 10),
                    cv2.FONT_HERSHEY_DUPLEX, 1, (238, 164, 64), 1)
        cv2.rectangle(frame, (fX, fY), (fX + fW, fY + fH),
                      (238, 164, 64), 2)
        return frame, {emotion: float(prob) for emotion, prob in zip(EMOTIONS, preds)}

# Define input and output components for Gradio

image_input = [
        gr.components.Image(sources="webcam", label="Your face"),
        gr.components.File(label="Upload Image or Video")
      ]
output = [
        gr.components.Image(label="Predicted Emotion"),
        gr.components.Label(num_top_classes=2, label="Top 2 Probabilities")
      ]

# Launch the Gradio interface
title = "Facial Emotion Recognition"
description = "How well can this model predict your emotions? Take a picture with your webcam, or upload an image, 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"

example_images = [
    [
        os.path.join(os.path.dirname(__file__), "images/chandler.jpeg"),
        os.path.join(os.path.dirname(__file__), "images/janice.jpeg"),
        os.path.join(os.path.dirname(__file__), "images/joey.jpeg"),
        os.path.join(os.path.dirname(__file__), "images/phoebe.jpeg"),
        os.path.join(os.path.dirname(__file__), "images/rachel_monica.jpeg"),
        os.path.join(os.path.dirname(__file__), "images/ross.jpeg"),
        os.path.join(os.path.dirname(__file__), "images/gunther.jpeg")
    ]
]
    
gr.Interface(fn=predict, inputs=image_input, outputs=output, examples=example_images,
            title=title, description=description, thumbnail=thumbnail).launch()