|
import time |
|
import gradio as gr |
|
import cv2 as cv |
|
from ultralytics import YOLO |
|
|
|
|
|
process = False |
|
model = None |
|
cap = None |
|
|
|
def load_yolo_model(): |
|
return YOLO('yolov8n-seg.pt') |
|
|
|
def process_video(): |
|
global process, model, cap |
|
while process and cap.isOpened(): |
|
ret, image = cap.read() |
|
if not ret: |
|
break |
|
start = time.perf_counter() |
|
results = model(image) |
|
end = time.perf_counter() |
|
segments = results[0].plot() |
|
cv.putText(segments, f'FPS: {int(1 // (end - start))}', (10, 30), |
|
cv.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) |
|
cv.imshow('Image Segmentation', segments) |
|
key = cv.waitKey(1) |
|
if key & 0xFF == ord('q'): |
|
break |
|
cap.release() |
|
cv.destroyAllWindows() |
|
|
|
def segment_video(uploaded_video): |
|
global model, cap |
|
model = load_yolo_model() |
|
cap = cv.VideoCapture(uploaded_video.name) |
|
process_video() |
|
|
|
def segment_webcam(): |
|
global model, cap |
|
model = load_yolo_model() |
|
cap = cv.VideoCapture(0) |
|
process_video() |
|
|
|
def process_inputs(start_button, stop_button, mode_selection, uploaded_video): |
|
global process |
|
if start_button and mode_selection: |
|
process = True |
|
if mode_selection == "Video" and uploaded_video: |
|
segment_video(uploaded_video) |
|
elif mode_selection == "Webcam": |
|
segment_webcam() |
|
elif stop_button: |
|
process = False |
|
|
|
start_button = gr.components.Button(label="Start", color="green", disabled=True) |
|
stop_button = gr.components.Button(label="Stop", color="red", disabled=True) |
|
mode_selection = gr.components.Radio(["Video", "Webcam"], label="Mode Selection") |
|
uploaded_video = gr.components.File(label="Upload Video") |
|
|
|
def on_mode_change(_, __, mode): |
|
if mode == "Webcam": |
|
uploaded_video.disable() |
|
else: |
|
uploaded_video.enable() |
|
start_button.enable() |
|
|
|
mode_selection.on_change(on_mode_change) |
|
|
|
iface = gr.Interface( |
|
fn=process_inputs, |
|
inputs=[start_button, stop_button, mode_selection, uploaded_video], |
|
outputs=None, |
|
live=True, |
|
title="YOLO Image Segmentation", |
|
description="This application uses the YOLO model to perform image segmentation on a video or webcam feed. Select a mode, upload a video (if applicable), and click 'Start' to begin. Click 'Stop' to end the process.", |
|
theme="huggingface" |
|
) |
|
|
|
iface.launch() |
|
|