跨多个流使用Ultralytics YOLOv8进行对象跟踪

跨多个流进行对象跟踪在计算机视觉中发挥着重要作用,特别是在实际应用中。它不仅仅是问题解决,还提供了有价值的见解,并作为对象计数模块的前提。它使系统能够观察和分析物体的运动,这是监控、自动驾驶车辆和零售分析等场景中的基本要求。最终,对象跟踪丰富了在复杂环境中的理解和决策制定。

跨多个流使用Ultralytics YOLOv8进行对象跟踪_第1张图片

Ultralytics YOLOv8跨多个流进行对象跟踪

在本文中,您将学习如何使用Ultralytics YOLOv8在多个流上执行对象跟踪。涵盖的关键步骤包括:

1. 导入所需的库

2. 多流对象跟踪代码

3. 推理

导入所需的库

在使用Ultralytics YOLOv8进行对象跟踪之前,我们需要设置必要的库和依赖项。按照以下步骤操作:

步骤1.1:安装Ultralytics包

确保通过运行以下命令安装了Ultralytics包:

pip install ultralytics # Install Ultralytics Package

步骤1.2:创建Python文件并导入库

为项目创建一个Python文件并导入必要的库。在这个项目中,我们将使用OpenCV显示帧,并使用Ultralytics进行对象检测、分割和跟踪。

import cv2 # Import OpenCV Library
from ultralytics import YOLO # Import Ultralytics Package

步骤1.3:导入Threading模块

为了方便多流处理,我们将使用线程。导入线程模块如下:

import threading # Threading module import

完成了这些初始步骤后,我们现在可以继续在多个流上进行对象跟踪。

跨多个流使用Ultralytics YOLOv8进行对象跟踪_第2张图片

多流对象跟踪代码

在这一部分,我们将专注于设置两个视频流的对象跟踪:一个来自视频文件,另一个来自网络摄像头或IP摄像头。

步骤2.1:定义视频文件路径

现在,让我们定义要在其上跟踪对象的视频流的文件路径。在这个例子中,我们将使用一个视频文件和一个网络摄像头的源。

# Define the video files for the trackers
video_file1 = ‘ultralytics\\test.mp4’ # Video file path
video_file2 = 0  # WebCam Path

步骤2.2:加载YOLOv8模型

首先,我们需要加载YOLOv8模型,它将是我们对象跟踪系统的主干。我们将加载两个模型:一个用于对象检测,另一个用于对象分割。这些模型与视频源紧密相关;视频源越多,就会并行地使用更多的模型。

# Load the YOLOv8 models
model1 = YOLO(‘yolov8n.pt’) # YOLOv8n Model
model2 = YOLO(‘yolov8s.pt’) # YOLOv8s Model

步骤2.3:线程目标函数

接下来,让我们为我们的线程操作建立一个目标。这个目标将是一个负责运行视频文件并应用YOLOv8对象跟踪算法的函数。上述代码将作为我们线程的目标函数。

注意: `file_index` 参数表示可以分配给每个线程的文件的索引。例如,如果你同时处理两个视频,第一个线程的 `file_index` 将设置为1,而第二个线程将使用 `file_index` 为2。在第三个线程的情况下,`file_index` 将设置为3。

def run_tracker_in_thread(filename, model, file_index):
    """
    This function is designed to run a video file or webcam stream
    concurrently with the YOLOv8 model, utilizing threading.


    - filename: The path to the video file or the webcam/external
    camera source.
    - model: The file path to the YOLOv8 model.
    - file_index: An argument to specify the count of the
    file being processed.
    """


    video = cv2.VideoCapture(filename)  # Read the video file


    while True:
        ret, frame = video.read()  # Read the video frames


        # Exit the loop if no more frames in either video
        if not ret:
            break


        # Track objects in frames if available
        results = model.track(frame, persist=True)
        res_plotted = results[0].plot()
        cv2.imshow("Tracking_Stream_"+str(file_index), res_plotted)


        key = cv2.waitKey(1)
        if key == ord('q'):
            break


    # Release video sources
    video.release()

提示: 如果你想在多个流上进行对象检测,你可以在上述函数中将 `model.track` 替换为 `model.predict`。

步骤2.4:创建对象跟踪线程

现在,让我们生成用于对象跟踪的线程。线程的数量将与你打算运行的视频源数量相对应。提供的代码将创建两个线程来处理两个视频流。

# Create the tracker thread


# Thread used for the video file
tracker_thread1 = threading.Thread(target=run_tracker_in_thread,
                                   args=(video_file1, model1, 1),
                                   daemon=True)


# Thread used for the webcam
tracker_thread2 = threading.Thread(target=run_tracker_in_thread,
                                   args=(video_file2, model2, 2),
                                   daemon=True)

步骤2.5:启动对象跟踪线程

一切都设置好了,准备就绪。现在,是时候启动对象跟踪线程了。

# Start the tracker thread


# Start thread that run video file
tracker_thread1.start()


# Start thread that run webcam
tracker_thread2.start()

步骤2.6:线程处理和销毁窗口

在线程激活后,同样重要的是在它完成任务时对其进行管理。上述代码片段的目的是等待对象跟踪线程完成执行。

# Wait for the tracker thread to finish


# Tracker thread 1
tracker_thread1.join()


# Tracker thread 2
tracker_thread2.join()


# Clean up and close windows
cv2.destroyAllWindows()

注意: 如果你需要使用YOLOv8进行跨多个流的完整对象跟踪代码,可以查看 https://docs.ultralytics.com/。

推理

我们现在已经编写了一个全面处理使用YOLOv8进行对象跟踪的多个流的代码。下一步是将此代码付诸实践。将包含提供的代码的文件保存为 'ultralytics_multi_stream_object_tracking.py',然后使用以下命令执行它。

# run the code file
python 'ultralytics_multi_stream_object_tracking.py'

在几秒钟内,处理将开始,你将在视频文件和网络摄像头源上观察到推理结果。

跨多个流使用Ultralytics YOLOv8进行对象跟踪_第3张图片

Ultralytics YOLOv8在视频源和网络摄像头上进行对象跟踪

·  END  ·

HAPPY LIFE

跨多个流使用Ultralytics YOLOv8进行对象跟踪_第4张图片

本文仅供学习交流使用,如有侵权请联系作者删除

你可能感兴趣的:(YOLO)