File size: 4,198 Bytes
47aeb66
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
"""
File: app.py
Author: Elena Ryumina and Dmitry Ryumin
Description: 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_DYNAMIC
from app.authors import AUTHORS
from app.app_utils import 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.Plot(value=None),
        gr.Plot(value=None),
        gr.Plot(value=None),
        gr.Textbox(value=None),
        # gr.HTML(value=None),
        gr.File(value=None),
        gr.File(value=None),
    )

with gr.Blocks(css="app.css") as demo:
    with gr.Tab("AVCER App"):
        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"
                    )
                text = gr.Textbox(label="Result", info='Positive state includes Happiness, Surprise, Happily Surprised, and Happily Disgusted emotions. Negative state includes other emotions and Surprise.')
                # question_mark = gr.HTML(tooltip_html)
            with gr.Column(scale=2, elem_classes="dl4"):
                output_face = gr.Plot(label="Face images", elem_classes="img")
                output_heatmaps = gr.Plot(label="Waveform", elem_classes="audio")
                output_statistics = gr.Plot(label="Statistics of emotions", elem_classes="stat")
                with gr.Row():
                    output_video = gr.File(label="Original video", 
                                            file_count="single", 
                                            file_types=[".mp4"],
                                            show_label=True,
                                            interactive=False,
                                            visible=True, 
                                            elem_classes="video")
                    prediction_file = gr.File(label="Prediction file", 
                                            file_count="single", 
                                            file_types=[".csv"],
                                            show_label=True,
                                            interactive=False,
                                            visible=True, 
                                            elem_classes="pred")
        gr.Examples(
            ["videos/video1.mp4",
            "videos/video2.mp4",
            "videos/video3.mp4",
            "videos/video4.mp4",
            ],
            [input_video],
        )
    
    with gr.Tab("Authors"):
        gr.Markdown(value=AUTHORS)

    submit_dynamic.click(
        fn=preprocess_video_and_predict,
        inputs=input_video,
        outputs=[
            output_face,
            output_heatmaps, 
            output_statistics,
            text,
            # question_mark,
            output_video,
            prediction_file,
        ],
        queue=True,
    )
    clear_btn_dynamic.click(
        fn=clear_dynamic_info,
        inputs=[],
        outputs=[
            input_video,
            output_face,
            output_heatmaps, 
            output_statistics,
            text,
            # question_mark,
            output_video,
            prediction_file,
        ],
        queue=True,
    )

if __name__ == "__main__":
    demo.queue(api_open=False).launch(share=False)