|
import time |
|
import gradio as gr |
|
import cv2 as cv |
|
from ultralytics import YOLO |
|
|
|
|
|
process = False |
|
model = None |
|
|
|
def load_yolo_model(): |
|
return YOLO('yolov8n-seg.pt') |
|
|
|
def resize_frame(frame, width=1280): |
|
height, width = frame.shape[:2] |
|
new_height = int(height * width / float(width)) |
|
return cv.resize(frame, (width, new_height)) |
|
|
|
def process_frame(frame): |
|
global model |
|
frame = resize_frame(frame) |
|
start = time.perf_counter() |
|
results = model(frame) |
|
end = time.perf_counter() |
|
segments = results[0].plot() |
|
return segments, f'FPS: {int(1 // (end - start))}' |
|
|
|
def process_inputs(start_button, stop_button, mode_selection, frame, uploaded_video): |
|
global process, model |
|
if start_button and mode_selection: |
|
process = True |
|
model = load_yolo_model() |
|
if mode_selection == "Webcam" and frame is not None: |
|
return process_frame(frame) |
|
elif mode_selection == "Video" and uploaded_video is not None: |
|
return process_frame(uploaded_video) |
|
elif stop_button: |
|
process = False |
|
|
|
start_button = gr.inputs.Button(label="Start") |
|
stop_button = gr.inputs.Button(label="Stop") |
|
mode_selection = gr.inputs.Radio(["Webcam", "Video"], label="Mode Selection") |
|
frame = gr.inputs.Video(shape=(720, 1280), label="Webcam Feed") |
|
uploaded_video = gr.inputs.Video(shape=(720, 1280), label="Upload Video") |
|
|
|
iface = gr.Interface( |
|
fn=process_inputs, |
|
inputs=[start_button, stop_button, mode_selection, frame, uploaded_video], |
|
outputs=[gr.outputs.Image(), gr.outputs.Textbox()], |
|
live=True, |
|
title="YOLO Image Segmentation", |
|
description="This application uses the YOLO model to perform image segmentation on a webcam feed or an uploaded video. Select 'Webcam' or 'Video', upload a video (if applicable), and click 'Start' to begin. Click 'Stop' to end the process.", |
|
theme="huggingface" |
|
) |
|
|
|
iface.launch() |
|
|