import gradio as gr import cv2 from extract_frames import ExtractFrames from get_every_fram_path import getEveryFramPath from main_emotion_classifier import process, process_single_image from grapher import createGraph def process_image(image): # Process the image using your existing function processed_image = process_single_image(image) return processed_image def process_video(video_path): # Extract frames from the video and process them output_dir = ExtractFrames(video_path) frame_paths = getEveryFramPath(output_dir) results, most_frequent_emotion = process(frame_paths) # Create the emotion graphs from the results createGraph('data/output/results.txt') # Return paths to the three generated graphs return [ 'data/output/emotion_bar_plot.png', 'data/output/emotion_stem_plot.png', 'data/output/emotionAVG.png' ] def gradio_interface(file): if file is None: return None, None file_type = file.name.split('.')[-1].lower() if file_type in ['jpg', 'jpeg', 'png', 'bmp']: # Image input image = cv2.imread(file.name) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) processed_image = process_image(image) return processed_image, None elif file_type in ['mp4', 'avi', 'mov', 'wmv']: # Video input graph_paths = process_video(file.name) return None, graph_paths else: return None, None # Set up the Gradio Interface iface = gr.Interface( fn=gradio_interface, inputs=gr.File(label="Upload Image or Video"), outputs=[ gr.Image(type="numpy", label="Processed Image (for image uploads)"), gr.Gallery(label="Emotion Distribution Graphs (for video uploads)", columns=3) ], title="Face Emotion Recognition", description="Upload an image or video to analyze emotions. For images, the result will show detected faces with emotions. For videos, it will provide graphs of emotion distribution.", examples=["test.png"] ) # Launch the Gradio interface if __name__ == "__main__": iface.launch()