""" File: app.py Author: Dr. Gordon Wright Description: Main application file for Facial_Expression_Recognition. The file defines the Gradio interface, sets up the main blocks, and includes event handlers for various components. License: MIT License """ import gradio as gr # Importing necessary components for the Gradio app from app.description import DESCRIPTION_STATIC, DESCRIPTION_DYNAMIC from app.authors import AUTHORS from app.app_utils import preprocess_image_and_predict, preprocess_video_and_predict def clear_static_info(): return ( gr.Image(value=None, type="pil"), gr.Image(value=None, scale=1, elem_classes="dl5"), gr.Image(value=None, scale=1, elem_classes="dl2"), gr.Label(value=None, num_top_classes=3, scale=1, elem_classes="dl3"), ) def clear_dynamic_info(): return ( gr.Video(value=None), gr.Video(value=None), gr.Video(value=None), gr.Video(value=None), gr.Plot(value=None), ) with gr.Blocks(css="app.css") as demo: # Header with Observatory logo with gr.Row(elem_classes="header-container"): with gr.Column(): gr.Image("images/LMLOBS.png", show_label=False, container=False, elem_classes="header-logo") gr.Markdown("# Facial Expression Recognition") gr.Markdown("### LittleMonkeyLab | Goldsmiths Observatory") with gr.Tab("Static Faces"): gr.Markdown(value=DESCRIPTION_STATIC) with gr.Row(): with gr.Column(scale=2, elem_classes="dl1"): input_image = gr.Image(label="Original image", type="pil") with gr.Row(): clear_btn = gr.Button(value="Clear", interactive=True, scale=1, elem_classes="clear") submit = gr.Button(value="Submit", interactive=True, scale=1, elem_classes="submit") with gr.Column(scale=1, elem_classes="dl4"): with gr.Row(): output_image = gr.Image(label="Face", scale=1, elem_classes="dl5") output_heatmap = gr.Image(label="Heatmap", scale=1, elem_classes="dl2") output_label = gr.Label(num_top_classes=3, scale=1, elem_classes="dl3") gr.Examples([ "images/Anger.png", "images/contempt.png", "images/Disgust.png", "images/Happy.png", "images/Fear.png", "images/Sad.png", "images/Surprise.png", ], [input_image]) with gr.Tab("Dynamic Faces"): gr.Markdown(value=DESCRIPTION_DYNAMIC) with gr.Row(): with gr.Column(scale=2): input_video = gr.Video(elem_classes="video1") with gr.Row(): clear_btn_dynamic = gr.Button(value="Clear", interactive=True, scale=1) submit_dynamic = gr.Button(value="Submit", interactive=True, scale=1, elem_classes="submit") with gr.Column(scale=2, elem_classes="dl4"): with gr.Row(): output_video = gr.Video(label="Original video", scale=1, elem_classes="video2") output_face = gr.Video(label="Pre-processed video", scale=1, elem_classes="video3") output_heatmaps = gr.Video(label="Heatmaps", scale=1, elem_classes="video4") output_statistics = gr.Plot(label="Statistics of emotions", elem_classes="stat") gr.Examples(["videos/BillClinton.mp4"], [input_video]) with gr.Tab("References"): gr.Markdown(value=AUTHORS) # Footer with branding with gr.Row(elem_classes="center-content"): with gr.Column(): gr.Image("images/LMLLOGO.png", show_label=False, container=False, elem_classes="footer-logo") gr.Markdown("© LittleMonkeyLab | Goldsmiths Observatory", elem_classes="footer-text") submit.click( fn=preprocess_image_and_predict, inputs=[input_image], outputs=[output_image, output_heatmap, output_label], queue=True, ) clear_btn.click( fn=clear_static_info, inputs=[], outputs=[input_image, output_image, output_heatmap, output_label], queue=True, ) submit_dynamic.click( fn=preprocess_video_and_predict, inputs=input_video, outputs=[ output_video, output_face, output_heatmaps, output_statistics ], queue=True, ) clear_btn_dynamic.click( fn=clear_dynamic_info, inputs=[], outputs=[ input_video, output_video, output_face, output_heatmaps, output_statistics ], queue=True, ) if __name__ == "__main__": demo.queue(api_open=False).launch(share=False)