Spaces:
Sleeping
Sleeping
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()
|