from typing import Tuple import gradio as gr import numpy as np import supervision as sv from ultralytics import YOLO MARKDOWN = """

YOLO-Playground 📈

Welcome to YOLO-Playground! This demo showcases the detection capabilities of various YOLO models pre-trained on the COCO Dataset. 🚀🔍👀 A simple project just for fun for on the go object detection. 🎉 Inspired from YOLO-ARENA by SkalskiP. 🙏 - **YOLOv8**
- **YOLOv9**
- **YOLOv10**
- **YOLO11**
Powered by Roboflow [Inference](https://github.com/roboflow/inference), [Supervision](https://github.com/roboflow/supervision) and [Ultralytics](https://github.com/ultralytics/ultralytics).🔥 """ IMAGE_EXAMPLES = [ ['https://media.roboflow.com/supervision/image-examples/people-walking.png', 0.3, 0.3, 0.3, 0.3, 0.5], ['https://media.roboflow.com/supervision/image-examples/vehicles.png', 0.3, 0.3, 0.3, 0.3, 0.5], ['https://media.roboflow.com/supervision/image-examples/basketball-1.png', 0.3, 0.3, 0.3, 0.3, 0.5], ] YOLO_V8S_MODEL = YOLO("yolov8s.pt") YOLO_V9S_MODEL = YOLO("yolov9s.pt") YOLO_V10S_MODEL = YOLO("yolov10s.pt") YOLO_11S_MODEL = YOLO("yolo11s.pt") LABEL_ANNOTATORS = sv.LabelAnnotator() BOUNDING_BOX_ANNOTATORS = sv.BoxAnnotator() def detect_and_annotate( model, input_image: np.ndarray, confidence_threshold: float, iou_threshold: float, class_id_mapping: dict = None ) -> np.ndarray: result = model( input_image, conf=confidence_threshold, iou=iou_threshold )[0] detections = sv.Detections.from_ultralytics(result) if class_id_mapping: detections.class_id = np.array([ class_id_mapping[class_id] for class_id in detections.class_id ]) labels = [ f"{class_name} ({confidence:.2f})" for class_name, confidence in zip(detections['class_name'], detections.confidence) ] annotated_image = input_image.copy() annotated_image = BOUNDING_BOX_ANNOTATORS.annotate( scene=annotated_image, detections=detections) annotated_image = LABEL_ANNOTATORS.annotate( scene=annotated_image, detections=detections, labels=labels) return annotated_image def process_image( input_image: np.ndarray, yolo_v8_confidence_threshold: float, yolo_v9_confidence_threshold: float, yolo_v10_confidence_threshold: float, yolov11_confidence_threshold: float, iou_threshold: float ) -> Tuple[np.ndarray, np.ndarray, np.ndarray]: # Validate iou_threshold before using it if iou_threshold is None or not isinstance(iou_threshold, float): iou_threshold = 0.3 # Default value, adjust as necessary yolo_v8s_annotated_image = detect_and_annotate( YOLO_V8S_MODEL, input_image, yolo_v8_confidence_threshold, iou_threshold) yolo_v9s_annotated_image = detect_and_annotate( YOLO_V9S_MODEL, input_image, yolo_v9_confidence_threshold, iou_threshold) yolo_v10s_annotated_image = detect_and_annotate( YOLO_V10S_MODEL, input_image, yolo_v10_confidence_threshold, iou_threshold) yolo_11s_annnotated_image = detect_and_annotate( YOLO_11S_MODEL, input_image, yolov11_confidence_threshold, iou_threshold) return ( yolo_v8s_annotated_image, yolo_v9s_annotated_image, yolo_v10s_annotated_image, yolo_11s_annnotated_image ) yolo_v8s_confidence_threshold_component = gr.Slider( minimum=0, maximum=1.0, value=0.3, step=0.01, label="YOLOv8s Confidence Threshold", info=( "The confidence threshold for the YOLO model. Lower the threshold to " "reduce false negatives, enhancing the model's sensitivity to detect " "sought-after objects. Conversely, increase the threshold to minimize false " "positives, preventing the model from identifying objects it shouldn't." )) yolo_v9s_confidence_threshold_component = gr.Slider( minimum=0, maximum=1.0, value=0.3, step=0.01, label="YOLOv9s Confidence Threshold", info=( "The confidence threshold for the YOLO model. Lower the threshold to " "reduce false negatives, enhancing the model's sensitivity to detect " "sought-after objects. Conversely, increase the threshold to minimize false " "positives, preventing the model from identifying objects it shouldn't." )) yolo_v10s_confidence_threshold_component = gr.Slider( minimum=0, maximum=1.0, value=0.3, step=0.01, label="YOLOv10s Confidence Threshold", info=( "The confidence threshold for the YOLO model. Lower the threshold to " "reduce false negatives, enhancing the model's sensitivity to detect " "sought-after objects. Conversely, increase the threshold to minimize false " "positives, preventing the model from identifying objects it shouldn't." )) yolo_11s_confidence_threshold_component = gr.Slider( minimum=0, maximum=1.0, value=0.3, step=0.01, label="YOLO11s Confidence Threshold", info=( "The confidence threshold for the YOLO model. Lower the threshold to " "reduce false negatives, enhancing the model's sensitivity to detect " "sought-after objects. Conversely, increase the threshold to minimize false " "positives, preventing the model from identifying objects it shouldn't." )) iou_threshold_component = gr.Slider( minimum=0, maximum=1.0, value=0.5, step=0.01, label="IoU Threshold", info=( "The Intersection over Union (IoU) threshold for non-maximum suppression. " "Decrease the value to lessen the occurrence of overlapping bounding boxes, " "making the detection process stricter. On the other hand, increase the value " "to allow more overlapping bounding boxes, accommodating a broader range of " "detections." )) with gr.Blocks() as demo: gr.Markdown(MARKDOWN) with gr.Accordion("Configuration", open=False): with gr.Row(): yolo_v8s_confidence_threshold_component.render() yolo_v9s_confidence_threshold_component.render() yolo_v10s_confidence_threshold_component.render() yolo_11s_confidence_threshold_component.render() iou_threshold_component.render() with gr.Row(): input_image_component = gr.Image( type='pil', label='Input' ) with gr.Row(): yolo_v8s_output_image_component = gr.Image( type='pil', label='YOLOv8s' ) yolo_v9s_output_image_component = gr.Image( type='pil', label='YOLOv9s' ) with gr.Row(): yolo_v10s_output_image_component = gr.Image( type='pil', label='YOLOv10s' ) yolo_11s_output_image_component = gr.Image( type='pil', label='YOLO11s' ) submit_button_component = gr.Button( value='Submit', scale=1, variant='primary' ) gr.Examples( fn=process_image, examples=IMAGE_EXAMPLES, inputs=[ input_image_component, yolo_v8s_confidence_threshold_component, yolo_v9s_confidence_threshold_component, yolo_v10s_confidence_threshold_component, yolo_11s_confidence_threshold_component, iou_threshold_component ], outputs=[ yolo_v8s_output_image_component, yolo_v9s_output_image_component, yolo_v10s_output_image_component, yolo_11s_output_image_component ] ) submit_button_component.click( fn=process_image, inputs=[ input_image_component, yolo_v8s_confidence_threshold_component, yolo_v9s_confidence_threshold_component, yolo_v10s_confidence_threshold_component, yolo_11s_confidence_threshold_component, iou_threshold_component ], outputs=[ yolo_v8s_output_image_component, yolo_v9s_output_image_component, yolo_v10s_output_image_component, yolo_11s_output_image_component ] ) demo.launch(debug=False, show_error=True, max_threads=1)