import gradio as gr import os import numpy as np import cv2 import traceback import logging from PIL import Image from helmet_detect_alert import detect_and_alert, MODEL_PATHS from ultralytics import YOLO # Load YOLOv8 model model_path = MODEL_PATHS["YOLOv8n"] model = YOLO(model_path) # ---------- Detection Functions ---------- logging.basicConfig(filename="error_log.txt", level=logging.ERROR) def detect_image_fn(image, confidence): try: if image is None: raise ValueError("No image uploaded.") # Convert PIL image to NumPy image_np = np.array(image.convert("RGB")) # YOLO prediction results = model.predict(image_np, conf=confidence, verbose=False) if not results: raise RuntimeError("Model returned empty results.") # Annotate result annotated = results[0].plot() annotated_rgb = cv2.cvtColor(annotated, cv2.COLOR_BGR2RGB) return Image.fromarray(annotated_rgb) except Exception as e: # Log error to file logging.error("Image detection failed:\n%s", traceback.format_exc()) print("Error during prediction:", e) return None # Gradio will show "Error" def detect_video_fn(video_file, confidence): if video_file is None: return None input_path = video_file output_path = os.path.join("output", os.path.basename(input_path).replace(".", "_pred.")) + "mp4" os.makedirs("output", exist_ok=True) detect_and_alert(input_path, output_path, model, confidence) return output_path # ---------- Interfaces ---------- image_interface = gr.Interface( fn=detect_image_fn, inputs=[ gr.Image(label="Upload Image"), gr.Slider(0.1, 1.0, value=0.3, step=0.05, label="Confidence") ], outputs=gr.Image(label="Predicted Output"), title="🖼 Helmet Detection from Image", description="Upload an image to detect heads not wearing helmets." ) video_interface = gr.Interface( fn=detect_video_fn, inputs=[ gr.Video(label="Upload Video"), gr.Slider(0.1, 1.0, value=0.3, step=0.05, label="Confidence") ], outputs=gr.Video(label="Predicted Output"), title="🎥 Helmet Detection from Video", description="Upload a video and get helmet detection alerts visually." ) # ---------- Launch Tabbed App ---------- gr.TabbedInterface( [image_interface, video_interface], tab_names=["Image Detection", "Video Detection"] ).launch()