|
from ultralytics import YOLO |
|
import streamlit as st |
|
import cv2 |
|
import pafy |
|
|
|
import settings |
|
import tracker |
|
|
|
|
|
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_option(): |
|
display_tracker = st.radio("Display Tracker", ('Yes', 'No')) |
|
is_display_tracker = True if display_tracker == 'Yes' else False |
|
return is_display_tracker |
|
|
|
|
|
def _display_detected_frames(conf, model, st_frame, image, is_display_tracking=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)))) |
|
|
|
|
|
res = model.predict(image, conf=conf) |
|
result_tensor = res[0].boxes |
|
|
|
|
|
if is_display_tracking: |
|
tracker._display_detected_tracks(result_tensor.data, image) |
|
|
|
|
|
res_plotted = res[0].plot() |
|
st_frame.image(res_plotted, |
|
caption='Detected Video', |
|
channels="BGR", |
|
use_column_width=True |
|
) |
|
|
|
|
|
def play_youtube_video(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_youtube = st.sidebar.text_input("YouTube Video url") |
|
|
|
is_display_tracker = display_tracker_option() |
|
|
|
if st.sidebar.button('Detect Objects'): |
|
try: |
|
video = pafy.new(source_youtube) |
|
best = video.getbest(preftype="mp4") |
|
vid_cap = cv2.VideoCapture(best.url) |
|
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 |
|
) |
|
else: |
|
vid_cap.release() |
|
break |
|
except Exception as e: |
|
st.sidebar.error("Error loading video: " + 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") |
|
is_display_tracker = display_tracker_option() |
|
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 |
|
) |
|
else: |
|
vid_cap.release() |
|
break |
|
except Exception as e: |
|
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 = display_tracker_option() |
|
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 |
|
) |
|
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 = display_tracker_option() |
|
|
|
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 |
|
) |
|
else: |
|
vid_cap.release() |
|
break |
|
except Exception as e: |
|
st.sidebar.error("Error loading video: " + str(e)) |
|
|