|
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_webcam(start_button, stop_button, frame): |
|
global process, model |
|
if start_button and not process and frame is not None: |
|
process = True |
|
model = load_yolo_model() |
|
return process_frame(frame) |
|
elif stop_button and process: |
|
process = False |
|
return None, "" |
|
|
|
def process_video(start_button, stop_button, uploaded_video): |
|
global process, model |
|
if start_button and not process and uploaded_video is not None: |
|
process = True |
|
model = load_yolo_model() |
|
cap = cv.VideoCapture(uploaded_video.name) |
|
ret, frame = cap.read() |
|
if ret: |
|
return process_frame(frame) |
|
elif stop_button and process: |
|
process = False |
|
return None, "" |
|
|
|
start_button = gr.components.Checkbox(label="Start") |
|
stop_button = gr.components.Checkbox(label="Stop") |
|
frame = gr.components.Video(label="Webcam Feed") |
|
uploaded_video = gr.components.Video(label="Upload Video") |
|
|
|
webcam_interface = gr.Interface( |
|
fn=process_webcam, |
|
inputs=[start_button, stop_button, frame], |
|
outputs=[gr.components.Image(), gr.components.Textbox()], |
|
live=True, |
|
title="YOLO Image Segmentation (Webcam)", |
|
description="This application uses the YOLO model to perform image segmentation on a webcam feed. Check 'Start' to begin. Check 'Stop' to end the process.", |
|
) |
|
|
|
video_interface = gr.Interface( |
|
fn=process_video, |
|
inputs=[start_button, stop_button, uploaded_video], |
|
outputs=[gr.components.Image(), gr.components.Textbox()], |
|
live=True, |
|
title="YOLO Image Segmentation (Video)", |
|
description="This application uses the YOLO model to perform image segmentation on an uploaded video. Upload a video and check 'Start' to begin. Check 'Stop' to end the process.", |
|
) |
|
|
|
gr.TabbedInterface( |
|
[webcam_interface, video_interface], |
|
tab_names=['Webcam inference', 'Video inference'] |
|
).launch(share=True) |
|
|