跨多个流进行对象跟踪在计算机视觉中发挥着重要作用,特别是在实际应用中。它不仅仅是问题解决,还提供了有价值的见解,并作为对象计数模块的前提。它使系统能够观察和分析物体的运动,这是监控、自动驾驶车辆和零售分析等场景中的基本要求。最终,对象跟踪丰富了在复杂环境中的理解和决策制定。
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
完成了这些初始步骤后,我们现在可以继续在多个流上进行对象跟踪。
多流对象跟踪代码
在这一部分,我们将专注于设置两个视频流的对象跟踪:一个来自视频文件,另一个来自网络摄像头或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在视频源和网络摄像头上进行对象跟踪
· END ·
HAPPY LIFE
本文仅供学习交流使用,如有侵权请联系作者删除