File size: 2,027 Bytes
1a1d215
80bd48b
8f7a4e6
e8452a3
62ae84e
8f7a4e6
80bd48b
c92e309
8f7a4e6
06a815f
8f7a4e6
a421f1e
8f7a4e6
62ae84e
 
8f7a4e6
e8452a3
 
8f7a4e6
1a1d215
8f7a4e6
 
 
62ae84e
 
8f7a4e6
62ae84e
8f7a4e6
1a1d215
8f7a4e6
 
1a1d215
8f7a4e6
 
 
 
 
 
 
 
 
80bd48b
8f7a4e6
 
 
 
1a1d215
8f7a4e6
 
 
 
e8452a3
8f7a4e6
 
 
 
e8452a3
8f7a4e6
 
 
 
e8452a3
8f7a4e6
 
 
4e2d873
8f7a4e6
 
 
 
 
8db9899
06a815f
8f7a4e6
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
import gradio as gr
import cv2
import os
from services.video_service import get_random_video_frame
from services.thermal_service import detect_thermal_anomalies
from services.overlay_service import overlay_boxes
from services.metrics_service import update_metrics

# Globals
paused = False
frame_rate = 1

# Constants
TEMP_IMAGE_PATH = "temp.jpg"

# Core monitor function
def monitor_feed():
    global paused

    if paused:
        frame = cv2.imread(TEMP_IMAGE_PATH)
        if frame is None:
            frame = get_random_video_frame()
    else:
        frame = get_random_video_frame()
        detected_boxes = detect_thermal_anomalies(frame)
        frame = overlay_boxes(frame, detected_boxes)
        cv2.imwrite(TEMP_IMAGE_PATH, frame)

    metrics = update_metrics()
    return frame[:, :, ::-1], metrics  # Convert BGR to RGB for Gradio

# Gradio UI
with gr.Blocks() as app:
    gr.Markdown("# \ud83c\udf10 Thermal Anomaly Monitoring Dashboard")
    
    with gr.Row():
        with gr.Column(scale=3):
            video_output = gr.Image(label="Live Video Feed", elem_id="video-feed")
        with gr.Column(scale=1):
            metrics_output = gr.Label(label="Live Metrics", elem_id="metrics")

    with gr.Row():
        pause_btn = gr.Button("\u23F8\ufe0f Pause")
        resume_btn = gr.Button("\u25b6\ufe0f Resume")
        frame_slider = gr.Slider(0.2, 5, value=1, label="Frame Interval (seconds)")

    def toggle_pause():
        global paused
        paused = True
        return gr.update()

    def toggle_resume():
        global paused
        paused = False
        return gr.update()

    def set_frame_rate(val):
        global frame_rate
        frame_rate = val
        return gr.update()

    pause_btn.click(toggle_pause)
    resume_btn.click(toggle_resume)
    frame_slider.change(set_frame_rate, inputs=[frame_slider])

    app.stream(
        monitor_feed,
        outputs=[video_output, metrics_output],
        every=lambda: frame_rate
    )

if __name__ == "__main__":
    app.launch()