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 """ # Resize the image to a standard size image = cv2.resize(image, (720, int(720*(9/16)))) # Predict the objects in the image using the YOLOv8 model res = model.predict(image, conf=conf) result_tensor = res[0].boxes # Display object tracking, if specified if is_display_tracking: tracker._display_detected_tracks(result_tensor.data, image) # # 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 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))