|
|
| import os
|
| import cv2
|
| import time
|
| import numpy as np
|
| import gradio as gr
|
| from PIL import Image
|
| from ultralytics import YOLO
|
|
|
| model = YOLO("yolov8n.pt")
|
|
|
| def detect(image, conf_threshold):
|
| if image is None:
|
| return None, "No image provided"
|
|
|
| temp_path = "temp_input.jpg"
|
| Image.fromarray(image).save(temp_path)
|
|
|
| start = time.time()
|
| results = model(temp_path, conf=conf_threshold, verbose=False)
|
| latency = round((time.time() - start) * 1000, 2)
|
|
|
| annotated = cv2.cvtColor(results[0].plot(), cv2.COLOR_BGR2RGB)
|
|
|
| boxes = results[0].boxes
|
| class_counts = {}
|
| for box in boxes:
|
| cls_name = model.names[int(box.cls[0])]
|
| class_counts[cls_name] = class_counts.get(cls_name, 0) + 1
|
|
|
| if not class_counts:
|
| summary = f"Latency: {latency}ms | No objects detected above {int(conf_threshold*100)}% confidence"
|
| else:
|
| summary = [f"Latency: {latency}ms | Total: {len(boxes)} detections"]
|
| for cls, count in class_counts.items():
|
| summary.append(f" - {cls}: {count}")
|
| summary = "\n".join(summary)
|
|
|
| return annotated, summary
|
|
|
| with gr.Blocks(theme=gr.themes.Soft(), title="YOLOv8 Object Detection") as app:
|
| gr.Markdown("# YOLOv8 Real-Time Object Detection")
|
| gr.Markdown("Detect objects in images or via live webcam using YOLOv8n.")
|
|
|
| with gr.Tab("Image Upload"):
|
| with gr.Row():
|
| img_input = gr.Image(type="numpy", label="Upload Image")
|
| img_output = gr.Image(type="numpy", label="Detection Results")
|
| img_conf = gr.Slider(0.1, 0.9, value=0.5, step=0.05, label="Confidence Threshold")
|
| img_summary = gr.Textbox(label="Detection Summary")
|
| img_btn = gr.Button("Detect Objects")
|
| img_btn.click(fn=detect, inputs=[img_input, img_conf], outputs=[img_output, img_summary])
|
|
|
| with gr.Tab("Webcam Live"):
|
| gr.Markdown("Allow camera access. Detections appear automatically every 0.5 seconds.")
|
| with gr.Row():
|
| cam_input = gr.Image(sources=["webcam"], type="numpy", label="Live Feed", streaming=True)
|
| cam_output = gr.Image(type="numpy", label="Detection Results")
|
| cam_conf = gr.Slider(0.1, 0.9, value=0.25, step=0.05, label="Confidence Threshold")
|
| cam_summary = gr.Textbox(label="Detection Summary")
|
| cam_input.stream(
|
| fn=detect,
|
| inputs=[cam_input, cam_conf],
|
| outputs=[cam_output, cam_summary],
|
| time_limit=60,
|
| stream_every=0.5
|
| )
|
|
|
| app.launch(server_name="0.0.0.0", server_port=7860, share=False)
|
|
|