Landhoff's picture
Create app.py
a92b235 verified
Raw
History Blame
1.98 kB
import gradio as gr
import tensorflow as tf
import numpy as np
from PIL import Image # Pillow for image processing
import os
# Hugging Face Space Link: https://huggingface.co/spaces/Landhoff/ReassessmentAAI2
# Load the trained Keras model
model = tf.keras.models.load_model('facial_emotion_model.h5')
# Define the class labels explicitly, as train_generator is not available in deployment
# These labels should match the order your model was trained on.
class_labels = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18']
# Define target image size used during training
TARGET_SIZE = (128, 128)
def preprocess_image(image) -> np.ndarray:
"""Preprocesses the input image for model prediction."""
# Resize image to target size
image = image.resize(TARGET_SIZE)
# Convert to numpy array
image_array = np.array(image)
# Normalize pixel values to [0, 1]
image_array = image_array / 255.0
# Expand dimensions to create a batch (1, height, width, channels)
image_array = np.expand_dims(image_array, axis=0)
return image_array
def predict_emotion(image) -> dict:
"""Predicts the emotion from a facial image and returns probabilities."""
if image is None:
return {label: 0.0 for label in class_labels}
# Preprocess the image
processed_image = preprocess_image(image)
# Make prediction
predictions = model.predict(processed_image)[0]
# Create a dictionary of emotion labels and their probabilities
results = {class_labels[i]: float(predictions[i]) for i in range(len(class_labels))}
return results
# Create the Gradio interface
iface = gr.Interface(
fn=predict_emotion,
inputs=gr.Image(type="pil", label="Upload Face Image"),
outputs=gr.Label(num_top_classes=len(class_labels)),
title="Facial Emotion Recognition",
description="Upload an image of a face to get emotion predictions."
)
# Launch the interface
iface.launch()