Spaces:
Sleeping
Sleeping
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() | |