Spaces:
Runtime error
Runtime error
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
""" | |
------------------------------------------------- | |
@File Name: utils.py | |
@Author: yash mohite | |
@Date: 2023/5/16 | |
@Description: | |
------------------------------------------------- | |
""" | |
from ultralytics import YOLO | |
import streamlit as st | |
import cv2 | |
from PIL import Image | |
import tempfile | |
def _display_detected_frames(conf, model, st_frame, image): | |
""" | |
Display the detected objects on a video frame using the YOLOv8 model. | |
:param conf (float): Confidence threshold for object detection. | |
:param model (YOLOv8): An instance of the `YOLOv8` class containing the YOLOv8 model. | |
:param st_frame (Streamlit object): A Streamlit object to display the detected video. | |
:param image (numpy array): A numpy array representing the video frame. | |
:return: None | |
""" | |
# Resize the image to a standard size | |
image = cv2.resize(image, (720, int(720 * (9 / 16)))) | |
# Predict the objects in the image using YOLOv8 model | |
res = model.predict(image, conf=conf) | |
# Plot the detected objects on the video frame | |
res_plotted = res[0].plot() | |
st_frame.image(res_plotted, | |
caption='Detected Video', | |
channels="BGR", | |
use_column_width=True | |
) | |
def load_model(model_path): | |
""" | |
Loads a YOLO object detection model from the specified model_path. | |
Parameters: | |
model_path (str): The path to the YOLO model file. | |
Returns: | |
A YOLO object detection model. | |
""" | |
model = YOLO(model_path) | |
return model | |
def infer_uploaded_image(conf, model): | |
""" | |
Execute inference for uploaded image | |
:param conf: Confidence of YOLOv8 model | |
:param model: An instance of the `YOLOv8` class containing the YOLOv8 model. | |
:return: None | |
""" | |
source_img = st.sidebar.file_uploader( | |
label="Choose an image...", | |
type=("jpg", "jpeg", "png", 'bmp', 'webp') | |
) | |
col1, col2 = st.columns(2) | |
with col1: | |
if source_img: | |
uploaded_image = Image.open(source_img) | |
# adding the uploaded image to the page with caption | |
st.image( | |
image=source_img, | |
caption="Uploaded Image", | |
use_column_width=True | |
) | |
if source_img: | |
if st.button("Execution"): | |
with st.spinner("Running..."): | |
res = model.predict(uploaded_image, | |
conf=conf) | |
boxes = res[0].boxes | |
res_plotted = res[0].plot()[:, :, ::-1] | |
with col2: | |
st.image(res_plotted, | |
caption="Detected Image", | |
use_column_width=True) | |
try: | |
with st.expander("Detection Results"): | |
for box in boxes: | |
st.write(box.xywh) | |
except Exception as ex: | |
st.write("No image is uploaded yet!") | |
st.write(ex) | |
def infer_uploaded_video(conf, model): | |
""" | |
Execute inference for uploaded video | |
:param conf: Confidence of YOLOv8 model | |
:param model: An instance of the `YOLOv8` class containing the YOLOv8 model. | |
:return: None | |
""" | |
source_video = st.sidebar.file_uploader( | |
label="Choose a video..." | |
) | |
if source_video: | |
st.video(source_video) | |
if source_video: | |
if st.button("Execution"): | |
with st.spinner("Running..."): | |
try: | |
tfile = tempfile.NamedTemporaryFile() | |
tfile.write(source_video.read()) | |
vid_cap = cv2.VideoCapture( | |
tfile.name) | |
st_frame = st.empty() | |
while (vid_cap.isOpened()): | |
success, image = vid_cap.read() | |
if success: | |
_display_detected_frames(conf, | |
model, | |
st_frame, | |
image | |
) | |
else: | |
vid_cap.release() | |
break | |
except Exception as e: | |
st.error(f"Error loading video: {e}") | |
def infer_uploaded_webcam(conf, model): | |
""" | |
Execute inference for webcam. | |
:param conf: Confidence of YOLOv8 model | |
:param model: An instance of the `YOLOv8` class containing the YOLOv8 model. | |
:return: None | |
""" | |
try: | |
flag = st.button( | |
label="Stop running" | |
) | |
vid_cap = cv2.VideoCapture(0) # local camera | |
st_frame = st.empty() | |
while not flag: | |
success, image = vid_cap.read() | |
if success: | |
_display_detected_frames( | |
conf, | |
model, | |
st_frame, | |
image | |
) | |
else: | |
vid_cap.release() | |
break | |
except Exception as e: | |
st.error(f"Error loading video: {str(e)}") | |