YOLO26 / app.py
onuralpszr's picture
fix: 🐞 turn off share mode for prevent errors
1a5e595 verified
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license
import tempfile
from pathlib import Path
import cv2
import gradio as gr
import numpy as np
import PIL.Image as Image
from ultralytics import YOLO
MODEL_CHOICES = [
"yolo26n",
"yolo26s",
"yolo26m",
"yolo26n-seg",
"yolo26s-seg",
"yolo26m-seg",
"yolo26n-pose",
"yolo26s-pose",
"yolo26m-pose",
"yolo26n-obb",
"yolo26s-obb",
"yolo26m-obb",
"yolo26n-cls",
"yolo26s-cls",
"yolo26m-cls",
]
IMAGE_SIZE_CHOICES = [320, 640, 1024]
CUSTOM_CSS = (Path(__file__).parent / "ultralytics.css").read_text()
def predict_image(img, conf_threshold, iou_threshold, model_name, show_labels, show_conf, imgsz):
"""Predicts objects in an image using a Ultralytics YOLO model with adjustable confidence and IOU thresholds."""
model = YOLO(model_name)
results = model.predict(
source=img,
conf=conf_threshold,
iou=iou_threshold,
imgsz=imgsz,
verbose=False,
)
for r in results:
im_array = r.plot(labels=show_labels, conf=show_conf)
im = Image.fromarray(im_array[..., ::-1])
return im
def predict_video(video_path, conf_threshold, iou_threshold, model_name, show_labels, show_conf, imgsz):
"""Predicts objects in a video using a Ultralytics YOLO model and returns the annotated video."""
if video_path is None:
return None
model = YOLO(model_name)
# Open the video
cap = cv2.VideoCapture(video_path)
if not cap.isOpened():
return None
# Get video properties
fps = int(cap.get(cv2.CAP_PROP_FPS))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# Create temporary output file
temp_output = tempfile.NamedTemporaryFile(suffix=".mp4", delete=False)
output_path = temp_output.name
temp_output.close()
# Initialize video writer
fourcc = cv2.VideoWriter_fourcc(*"mp4v")
out = cv2.VideoWriter(output_path, fourcc, fps, (width, height))
while True:
ret, frame = cap.read()
if not ret:
break
# Run inference on the frame
results = model.predict(
source=frame,
conf=conf_threshold,
iou=iou_threshold,
imgsz=imgsz,
verbose=False,
)
# Get the annotated frame
annotated_frame = results[0].plot(labels=show_labels, conf=show_conf)
out.write(annotated_frame)
cap.release()
out.release()
return output_path
# Cache model for streaming performance
_model_cache = {}
def get_model(model_name):
"""Get or create a cached model instance."""
if model_name not in _model_cache:
_model_cache[model_name] = YOLO(model_name)
return _model_cache[model_name]
def predict_webcam(frame, conf_threshold, iou_threshold, model_name, show_labels, show_conf, imgsz):
"""Predicts objects in a webcam frame using a Ultralytics YOLO model (optimized for streaming)."""
if frame is None:
return None
# Use cached model for better streaming performance
model = get_model(model_name)
if isinstance(frame, np.ndarray):
# Gradio webcam sends RGB, but Ultralytics YOLO expects BGR for OpenCV operations
# Convert RGB to BGR for YOLO
frame_bgr = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
# Run inference
results = model.predict(
source=frame_bgr,
conf=conf_threshold,
iou=iou_threshold,
imgsz=imgsz,
verbose=False,
)
# YOLO's plot() returns BGR, convert back to RGB for Gradio display
annotated_frame = results[0].plot(labels=show_labels, conf=show_conf)
# Convert BGR to RGB for Gradio
return cv2.cvtColor(annotated_frame, cv2.COLOR_BGR2RGB)
return None
# Create the Gradio app with tabs
with gr.Blocks(title="Ultralytics YOLO26 Inference 🚀") as demo:
gr.Markdown(
"""
<div align="center">
<p>
<a href="https://platform.ultralytics.com/?utm_source=huggingface&utm_medium=referral&utm_campaign=yolo26&utm_content=banner" target="_blank">
<img width="50%" src="https://raw.githubusercontent.com/ultralytics/assets/main/yolov8/banner-yolov8.png" alt="Ultralytics YOLO banner"></a>
</p>
<p style="margin: 3px 0;">
<a href="https://docs.ultralytics.com/zh/">中文</a> | <a href="https://docs.ultralytics.com/ko/">한국어</a> | <a href="https://docs.ultralytics.com/ja/">日本語</a> | <a href="https://docs.ultralytics.com/ru/">Русский</a> | <a href="https://docs.ultralytics.com/de/">Deutsch</a> | <a href="https://docs.ultralytics.com/fr/">Français</a> | <a href="https://docs.ultralytics.com/es">Español</a> | <a href="https://docs.ultralytics.com/pt/">Português</a> | <a href="https://docs.ultralytics.com/tr/">Türkçe</a> | <a href="https://docs.ultralytics.com/vi/">Tiếng Việt</a> | <a href="https://docs.ultralytics.com/ar/">العربية</a>
</p>
<div style="display: flex; flex-wrap: wrap; justify-content: center; align-items: center; gap: 3px; margin-top: 3px;">
<a href="https://github.com/ultralytics/ultralytics/actions/workflows/ci.yml"><img src="https://github.com/ultralytics/ultralytics/actions/workflows/ci.yml/badge.svg" alt="Ultralytics CI"></a>
<a href="https://pepy.tech/projects/ultralytics"><img src="https://static.pepy.tech/badge/ultralytics" alt="Ultralytics Downloads"></a>
<a href="https://zenodo.org/badge/latestdoi/264818686"><img src="https://zenodo.org/badge/264818686.svg" alt="Ultralytics YOLO Citation"></a>
<a href="https://discord.com/invite/ultralytics"><img alt="Ultralytics Discord" src="https://img.shields.io/discord/1089800235347353640?logo=discord&logoColor=white&label=Discord&color=blue"></a>
<a href="https://community.ultralytics.com/"><img alt="Ultralytics Forums" src="https://img.shields.io/discourse/users?server=https%3A%2F%2Fcommunity.ultralytics.com&logo=discourse&label=Forums&color=blue"></a>
<a href="https://www.reddit.com/r/ultralytics/"><img alt="Ultralytics Reddit" src="https://img.shields.io/reddit/subreddit-subscribers/ultralytics?style=flat&logo=reddit&logoColor=white&label=Reddit&color=blue"></a>
</div>
<div style="display: flex; flex-wrap: wrap; justify-content: center; align-items: center; gap: 3px; margin-top: 3px;">
<a href="https://console.paperspace.com/github/ultralytics/ultralytics"><img src="https://assets.paperspace.io/img/gradient-badge.svg" alt="Run Ultralytics on Gradient"></a>
<a href="https://colab.research.google.com/github/ultralytics/ultralytics/blob/main/examples/tutorial.ipynb"><img src="https://colab.research.google.com/assets/colab-badge.svg" alt="Open Ultralytics In Colab"></a>
<a href="https://www.kaggle.com/models/ultralytics/yolo26"><img src="https://kaggle.com/static/images/open-in-kaggle.svg" alt="Open Ultralytics In Kaggle"></a>
<a href="https://mybinder.org/v2/gh/ultralytics/ultralytics/HEAD?labpath=examples%2Ftutorial.ipynb"><img src="https://mybinder.org/badge_logo.svg" alt="Open Ultralytics In Binder"></a>
</div>
</div>
[Ultralytics]( https://www.ultralytics.com/?utm_source=huggingface&utm_medium=referral&utm_campaign=yolo26&utm_content=contextual) [YOLO26](https://platform.ultralytics.com/ultralytics/yolo26?utm_source=huggingface&utm_medium=referral&utm_campaign=yolo26&utm_content=contextual_model_link) is the latest evolution in the YOLO series of real-time object detectors, engineered from the ground up for edge and low-power devices. It introduces a streamlined design that removes unnecessary complexity while integrating targeted innovations to deliver faster, lighter, and more accessible deployment.
"""
)
with gr.Tabs():
# Image Tab
with gr.TabItem("📷 Image"):
with gr.Row():
with gr.Column():
img_input = gr.Image(type="pil", label="Upload Image")
img_conf = gr.Slider(minimum=0, maximum=1, value=0.25, label="Confidence threshold")
img_iou = gr.Slider(minimum=0, maximum=1, value=0.7, label="IoU threshold")
img_model = gr.Radio(choices=MODEL_CHOICES, label="Model Name", value="yolo26n")
img_labels = gr.Checkbox(value=True, label="Show Labels")
img_conf_show = gr.Checkbox(value=True, label="Show Confidence")
img_size = gr.Radio(choices=IMAGE_SIZE_CHOICES, label="Image Size", value=640)
img_btn = gr.Button("Detect Objects", variant="primary")
with gr.Column():
img_output = gr.Image(type="pil", label="Result")
img_btn.click(
predict_image,
inputs=[img_input, img_conf, img_iou, img_model, img_labels, img_conf_show, img_size],
outputs=img_output,
)
gr.Examples(
examples=[
["https://ultralytics.com/images/bus.jpg", 0.25, 0.7, "yolo26n", True, True, 640],
["https://ultralytics.com/images/zidane.jpg", 0.25, 0.7, "yolo26n-seg", True, True, 640],
["https://ultralytics.com/images/boats.jpg", 0.25, 0.7, "yolo26n-obb", True, True, 1024],
],
inputs=[img_input, img_conf, img_iou, img_model, img_labels, img_conf_show, img_size],
)
# Video Tab
with gr.TabItem("🎬 Video"):
with gr.Row():
with gr.Column():
vid_input = gr.Video(label="Upload Video")
vid_conf = gr.Slider(minimum=0, maximum=1, value=0.25, label="Confidence threshold")
vid_iou = gr.Slider(minimum=0, maximum=1, value=0.7, label="IoU threshold")
vid_model = gr.Radio(choices=MODEL_CHOICES, label="Model Name", value="yolo26n")
vid_labels = gr.Checkbox(value=True, label="Show Labels")
vid_conf_show = gr.Checkbox(value=True, label="Show Confidence")
vid_size = gr.Radio(choices=IMAGE_SIZE_CHOICES, label="Image Size", value=640)
vid_btn = gr.Button("Process Video", variant="primary")
with gr.Column():
vid_output = gr.Video(label="Result")
vid_btn.click(
predict_video,
inputs=[vid_input, vid_conf, vid_iou, vid_model, vid_labels, vid_conf_show, vid_size],
outputs=vid_output,
)
# Webcam Tab - Real-time streaming
with gr.TabItem("📹 Webcam"):
gr.Markdown("### Real-time Webcam Detection")
gr.Markdown("Enable streaming for live detection as you move!")
with gr.Row():
with gr.Column():
webcam_conf = gr.Slider(minimum=0, maximum=1, value=0.25, label="Confidence threshold")
webcam_iou = gr.Slider(minimum=0, maximum=1, value=0.7, label="IoU threshold")
webcam_model = gr.Radio(choices=MODEL_CHOICES, label="Model Name", value="yolo26n")
webcam_labels = gr.Checkbox(value=True, label="Show Labels")
webcam_conf_show = gr.Checkbox(value=True, label="Show Confidence")
webcam_size = gr.Radio(choices=IMAGE_SIZE_CHOICES, label="Image Size", value=640)
with gr.Column():
# Streaming webcam input with real-time output
webcam_input = gr.Image(
sources=["webcam"],
type="numpy",
label="Webcam (streaming)",
streaming=True,
)
webcam_output = gr.Image(type="numpy", label="Detection Result")
# Stream event for real-time detection
webcam_input.stream(
predict_webcam,
inputs=[
webcam_input,
webcam_conf,
webcam_iou,
webcam_model,
webcam_labels,
webcam_conf_show,
webcam_size,
],
outputs=webcam_output,
)
demo.launch(css=CUSTOM_CSS, ssr_mode=False)