|
from ultralytics import YOLO
|
|
import streamlit as st
|
|
import cv2
|
|
import yt_dlp
|
|
import settings
|
|
|
|
|
|
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 display_tracker_options():
|
|
display_tracker = st.radio("Display Tracker", ('Yes', 'No'))
|
|
is_display_tracker = True if display_tracker == 'Yes' else False
|
|
if is_display_tracker:
|
|
tracker_type = st.radio("Tracker", ("bytetrack.yaml", "botsort.yaml"))
|
|
return is_display_tracker, tracker_type
|
|
return is_display_tracker, None
|
|
|
|
|
|
def _display_detected_frames(conf, model, st_frame, image, is_display_tracking=None, tracker=None):
|
|
"""
|
|
Display the detected objects on a video frame using the YOLOv8 model.
|
|
|
|
Args:
|
|
- conf (float): Confidence threshold for object detection.
|
|
- model (YoloV8): A YOLOv8 object detection model.
|
|
- st_frame (Streamlit object): A Streamlit object to display the detected video.
|
|
- image (numpy array): A numpy array representing the video frame.
|
|
- is_display_tracking (bool): A flag indicating whether to display object tracking (default=None).
|
|
|
|
Returns:
|
|
None
|
|
"""
|
|
|
|
|
|
image = cv2.resize(image, (720, int(720*(9/16))))
|
|
|
|
|
|
if is_display_tracking:
|
|
res = model.track(image, conf=conf, persist=True, tracker=tracker)
|
|
else:
|
|
|
|
res = model.predict(image, conf=conf)
|
|
|
|
|
|
res_plotted = res[0].plot()
|
|
st_frame.image(res_plotted,
|
|
caption='Detected Video',
|
|
channels="BGR",
|
|
use_column_width=True
|
|
)
|
|
|
|
|
|
def get_youtube_stream_url(youtube_url):
|
|
ydl_opts = {
|
|
'format': 'best[ext=mp4]',
|
|
'no_warnings': True,
|
|
'quiet': True
|
|
}
|
|
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
|
|
info = ydl.extract_info(youtube_url, download=False)
|
|
return info['url']
|
|
|
|
|
|
def play_youtube_video(conf, model):
|
|
source_youtube = st.sidebar.text_input("YouTube Video url")
|
|
is_display_tracker, tracker = display_tracker_options()
|
|
|
|
if st.sidebar.button('Detect Objects'):
|
|
if not source_youtube:
|
|
st.sidebar.error("Please enter a YouTube URL")
|
|
return
|
|
|
|
try:
|
|
st.sidebar.info("Extracting video stream URL...")
|
|
stream_url = get_youtube_stream_url(source_youtube)
|
|
|
|
st.sidebar.info("Opening video stream...")
|
|
vid_cap = cv2.VideoCapture(stream_url)
|
|
|
|
if not vid_cap.isOpened():
|
|
st.sidebar.error(
|
|
"Failed to open video stream. Please try a different video.")
|
|
return
|
|
|
|
st.sidebar.success("Video stream opened successfully!")
|
|
st_frame = st.empty()
|
|
while vid_cap.isOpened():
|
|
success, image = vid_cap.read()
|
|
if success:
|
|
_display_detected_frames(
|
|
conf,
|
|
model,
|
|
st_frame,
|
|
image,
|
|
is_display_tracker,
|
|
tracker
|
|
)
|
|
else:
|
|
break
|
|
|
|
vid_cap.release()
|
|
|
|
except Exception as e:
|
|
st.sidebar.error(f"An error occurred: {str(e)}")
|
|
|
|
|
|
def play_rtsp_stream(conf, model):
|
|
"""
|
|
Plays an rtsp stream. Detects Objects in real-time using the YOLOv8 object detection model.
|
|
|
|
Parameters:
|
|
conf: Confidence of YOLOv8 model.
|
|
model: An instance of the `YOLOv8` class containing the YOLOv8 model.
|
|
|
|
Returns:
|
|
None
|
|
|
|
Raises:
|
|
None
|
|
"""
|
|
source_rtsp = st.sidebar.text_input("rtsp stream url:")
|
|
st.sidebar.caption(
|
|
'Example URL: rtsp://admin:12345@192.168.1.210:554/Streaming/Channels/101')
|
|
is_display_tracker, tracker = display_tracker_options()
|
|
if st.sidebar.button('Detect Objects'):
|
|
try:
|
|
vid_cap = cv2.VideoCapture(source_rtsp)
|
|
st_frame = st.empty()
|
|
while (vid_cap.isOpened()):
|
|
success, image = vid_cap.read()
|
|
if success:
|
|
_display_detected_frames(conf,
|
|
model,
|
|
st_frame,
|
|
image,
|
|
is_display_tracker,
|
|
tracker
|
|
)
|
|
else:
|
|
vid_cap.release()
|
|
break
|
|
except Exception as e:
|
|
vid_cap.release()
|
|
st.sidebar.error("Error loading RTSP stream: " + str(e))
|
|
|
|
|
|
def play_webcam(conf, model):
|
|
"""
|
|
Plays a webcam stream. Detects Objects in real-time using the YOLOv8 object detection model.
|
|
|
|
Parameters:
|
|
conf: Confidence of YOLOv8 model.
|
|
model: An instance of the `YOLOv8` class containing the YOLOv8 model.
|
|
|
|
Returns:
|
|
None
|
|
|
|
Raises:
|
|
None
|
|
"""
|
|
source_webcam = settings.WEBCAM_PATH
|
|
is_display_tracker, tracker = display_tracker_options()
|
|
if st.sidebar.button('Detect Objects'):
|
|
try:
|
|
vid_cap = cv2.VideoCapture(source_webcam)
|
|
st_frame = st.empty()
|
|
while (vid_cap.isOpened()):
|
|
success, image = vid_cap.read()
|
|
if success:
|
|
_display_detected_frames(conf,
|
|
model,
|
|
st_frame,
|
|
image,
|
|
is_display_tracker,
|
|
tracker,
|
|
)
|
|
else:
|
|
vid_cap.release()
|
|
break
|
|
except Exception as e:
|
|
st.sidebar.error("Error loading video: " + str(e))
|
|
|
|
|
|
def play_stored_video(conf, model):
|
|
"""
|
|
Plays a stored video file. Tracks and detects objects in real-time using the YOLOv8 object detection model.
|
|
|
|
Parameters:
|
|
conf: Confidence of YOLOv8 model.
|
|
model: An instance of the `YOLOv8` class containing the YOLOv8 model.
|
|
|
|
Returns:
|
|
None
|
|
|
|
Raises:
|
|
None
|
|
"""
|
|
source_vid = st.sidebar.selectbox(
|
|
"Choose a video...", settings.VIDEOS_DICT.keys())
|
|
|
|
is_display_tracker, tracker = display_tracker_options()
|
|
|
|
with open(settings.VIDEOS_DICT.get(source_vid), 'rb') as video_file:
|
|
video_bytes = video_file.read()
|
|
if video_bytes:
|
|
st.video(video_bytes)
|
|
|
|
if st.sidebar.button('Detect Video Objects'):
|
|
try:
|
|
vid_cap = cv2.VideoCapture(
|
|
str(settings.VIDEOS_DICT.get(source_vid)))
|
|
st_frame = st.empty()
|
|
while (vid_cap.isOpened()):
|
|
success, image = vid_cap.read()
|
|
if success:
|
|
_display_detected_frames(conf,
|
|
model,
|
|
st_frame,
|
|
image,
|
|
is_display_tracker,
|
|
tracker
|
|
)
|
|
else:
|
|
vid_cap.release()
|
|
break
|
|
except Exception as e:
|
|
st.sidebar.error("Error loading video: " + str(e))
|
|
|