Ultralytics YOLO 多目标跟踪
在视频分析领域,目标跟踪是一项关键任务,它不仅识别帧内目标的位置和类别,还随着视频的推进为每个检测到的目标维护一个唯一的ID。其应用范围广泛,从监控和安全到实时体育分析。
为何选择Ultralytics YOLO进行目标跟踪?
Ultralytics跟踪器的输出与标准目标检测一致,但增加了目标ID的价值。这使得在视频流中跟踪目标并进行后续分析变得容易。以下是你应考虑使用Ultralytics YOLO进行目标跟踪的原因:
- 效率: 实时处理视频流而不影响准确性。
- 灵活性: 支持多种跟踪算法和配置。
- 易用性: 简单的Python API和CLI选项,便于快速集成和部署。
- 可定制性: 易于与自定义训练的YOLO模型结合使用,允许集成到特定领域的应用中。
观看: Ultralytics YOLO的目标检测与跟踪。
实际应用
交通运输 | 零售 | 水产养殖 |
---|---|---|
[vehicle track] | [people track] | [fish track] |
车辆跟踪 | 人员跟踪 | 鱼类跟踪 |
功能概览
Ultralytics YOLO将其目标检测功能扩展,提供强大且多样的目标跟踪功能:
- 实时跟踪: 无缝跟踪高帧率视频中的目标。
- 多跟踪器支持: 从多种成熟的跟踪算法中选择。
- 可定制的跟踪器配置: 通过调整各种参数,使跟踪算法满足特定需求。
可用跟踪器
Ultralytics YOLO支持以下跟踪算法。可以通过传递相关的YAML配置文件(如tracker=tracker_type.yaml
)来启用它们:
默认跟踪器是BoT-SORT。
跟踪
跟踪器阈值信息
如果目标置信度分数较低,即低于track_high_thresh
,则不会成功返回和更新跟踪。
要在视频流上运行跟踪器,请使用经过训练的检测、分割或姿态模型,如YOLO11n、YOLO11n-seg和YOLO11n-pose。
Example
from ultralytics import YOLO
# 加载官方或自定义模型
model = YOLO("yolo11n.pt") # 加载官方检测模型
model = YOLO("yolo11n-seg.pt") # 加载官方分割模型
model = YOLO("yolo11n-pose.pt") # 加载官方姿态模型
model = YOLO("path/to/best.pt") # 加载自定义训练模型
# 使用模型进行跟踪
results = model.track("https://youtu.be/LNwODJXcvt4", show=True) # 使用默认跟踪器进行跟踪
results = model.track("https://youtu.be/LNwODJXcvt4", show=True, tracker="bytetrack.yaml") # 使用ByteTrack进行跟踪
``` yolo track model=path/to/best.pt source="https://youtu.be/LNwODJXcvt4" # 自定义训练的模型
# 使用ByteTrack跟踪器进行跟踪
yolo track model=path/to/best.pt tracker="bytetrack.yaml"
```
如上所示,跟踪功能适用于在视频或流媒体源上运行的所有检测、分割和姿态模型。
配置
跟踪器阈值信息
如果对象置信度分数较低,即低于track_high_thresh
,则不会成功返回和更新任何跟踪结果。
跟踪参数
跟踪配置与预测模式共享属性,如conf
、iou
和show
。有关进一步配置,请参阅预测模型页面。
示例
```python from ultralytics import YOLO
配置跟踪参数并运行跟踪器
model = YOLO("yolo11n.pt") results = model.track(source="https://youtu.be/LNwODJXcvt4", conf=0.3, iou=0.5, show=True) ```
```bash
通过命令行界面配置跟踪参数并运行跟踪器
yolo track model=yolo11n.pt source="https://youtu.be/LNwODJXcvt4" conf=0.3, iou=0.5 show ```
跟踪器选择
Ultralytics还允许您使用修改后的跟踪器配置文件。为此,只需从ultralytics/cfg/trackers复制一个跟踪器配置文件(例如,custom_tracker.yaml
),并根据需要修改任何配置(除了tracker_type
)。
示例
```python from ultralytics import YOLO
加载模型并使用自定义配置文件运行跟踪器
model = YOLO("yolo11n.pt") results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml") ```
```bash
通过命令行界面加载模型并使用自定义配置文件运行跟踪器
yolo track model=yolo11n.pt source="https://youtu.be/LNwODJXcvt4" tracker='custom_tracker.yaml' ```
有关跟踪参数的完整列表,请参阅ultralytics/cfg/trackers页面。
Python示例
持续跟踪循环
以下是一个使用OpenCV (cv2
) 和 YOLO11 在视频帧上运行对象跟踪的 Python 脚本。此脚本假设您已经安装了必要的包(opencv-python
和 ultralytics
)。persist=True
参数告诉跟踪器当前图像或帧是序列中的下一个,并期望在当前图像中从前一图像中获取跟踪结果。
带有跟踪的流式 for-loop
```python import cv2
from ultralytics import YOLO
加载 YOLO11 模型
model = YOLO("yolo11n.pt")
打开视频文件
video_path = "path/to/video.mp4" cap = cv2.VideoCapture(video_path)
循环遍历视频帧
while cap.isOpened(): # 从视频中读取一帧 success, frame = cap.read()
if success:
# 在帧上运行 YOLO11 跟踪,保持帧之间的跟踪
results = model.track(frame, persist=True)
# 在帧上可视化结果
annotated_frame = results[0].plot()
# 显示带注释的帧
cv2.imshow("YOLO11 Tracking", annotated_frame)
# 如果按下 'q' 键则退出循环
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
# 如果到达视频结尾则退出循环
break
释放视频捕获对象并关闭显示窗口
cap.release() cv2.destroyAllWindows() ```
请注意,从 model(frame)
更改为 model.track(frame)
,这将启用对象跟踪而不是简单的检测。此修改后的脚本将在视频的每一帧上运行跟踪器,可视化结果并在窗口中显示。可以通过按 'q' 键退出循环。
随时间绘制轨迹
在连续帧上可视化对象轨迹可以提供有关视频中检测到的对象的运动模式和行为的宝贵见解。使用 Ultralytics YOLO11,绘制这些轨迹是一个无缝且高效的过程。 在下面的示例中,我们演示了如何利用YOLO11的跟踪功能,在多个视频帧上绘制检测到的物体的移动轨迹。该脚本涉及打开一个视频文件,逐帧读取,并利用YOLO模型识别和跟踪各种物体。通过保留检测到的边界框的中心点并连接它们,我们可以绘制出代表被跟踪物体所经过路径的线条。
在多个视频帧上绘制轨迹
```python from collections import defaultdict
import cv2 import numpy as np
from ultralytics import YOLO
加载YOLO11模型
model = YOLO("yolo11n.pt")
打开视频文件
video_path = "path/to/video.mp4" cap = cv2.VideoCapture(video_path)
存储轨迹历史
track_history = defaultdict(lambda: [])
循环遍历视频帧
while cap.isOpened(): # 从视频中读取一帧 success, frame = cap.read()
if success:
# 在帧上运行YOLO11跟踪,保持帧间的轨迹
results = model.track(frame, persist=True)
# 获取边界框和跟踪ID
boxes = results[0].boxes.xywh.cpu()
track_ids = results[0].boxes.id.int().cpu().tolist()
# 在帧上可视化结果
annotated_frame = results[0].plot()
# 绘制轨迹
for box, track_id in zip(boxes, track_ids):
x, y, w, h = box
track = track_history[track_id]
track.append((float(x), float(y))) # x, y中心点
if len(track) > 30: # 保留90帧的轨迹
track.pop(0)
# 绘制跟踪线
points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2))
cv2.polylines(annotated_frame, [points], isClosed=False, color=(230, 230, 230), thickness=10)
# 显示带注释的帧
cv2.imshow("YOLO11 Tracking", annotated_frame)
# 如果按下'q'键则中断循环
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
# 如果到达视频结尾则中断循环
break
释放视频捕获对象并关闭显示窗口
cap.release() cv2.destroyAllWindows() ```
多线程跟踪
多线程跟踪提供了同时对多个视频流进行对象跟踪的能力。这在处理多个视频输入时特别有用,例如来自多个监控摄像头,并发处理可以大大提高效率和性能。
在提供的Python脚本中,我们利用Python的threading
模块来并发运行多个跟踪器实例。每个线程负责对一个视频文件运行跟踪器,所有线程同时在后台运行。
为了确保每个线程接收到正确的参数(视频文件、要使用的模型和文件索引),我们定义了一个函数run_tracker_in_thread
,该函数接受这些参数并包含主要的跟踪循环。该函数逐帧读取视频,运行跟踪器,并显示结果。
在这个示例中使用了两个不同的模型:yolo11n.pt
和yolo11n-seg.pt
,每个模型跟踪不同的视频文件中的对象。视频文件在video_file1
和video_file2
中指定。
threading.Thread
中的daemon=True
参数意味着这些线程将在主程序结束时立即关闭。然后我们使用start()
启动线程,并使用join()
使主线程等待直到两个跟踪器线程都完成。
最后,在所有线程完成任务后,使用cv2.destroyAllWindows()
关闭显示结果的窗口。
带有跟踪的流式for循环
```python import threading
import cv2
from ultralytics import YOLO
定义模型名称和视频源
MODEL_NAMES = ["yolo11n.pt", "yolo11n-seg.pt"] SOURCES = ["path/to/video.mp4", "0"] # 本地视频,0表示摄像头
def run_tracker_in_thread(model_name, filename): """ 在独立的线程中运行YOLO跟踪器以进行并发处理。
参数:
model_name (str): YOLO11模型对象。
filename (str): 视频文件的路径或摄像头/外部摄像头的标识符。
"""
model = YOLO(model_name)
results = model.track(filename, save=True, stream=True)
for r in results:
pass
使用for循环创建并启动跟踪器线程
tracker_threads = [] for video_file, model_name in zip(SOURCES, MODEL_NAMES): thread = threading.Thread(target=run_tracker_in_thread, args=(model_name, video_file), daemon=True) tracker_threads.append(thread)
```python thread.start()
# 等待所有跟踪线程完成
for thread in tracker_threads:
thread.join()
# 清理并关闭窗口
cv2.destroyAllWindows()
```
这个示例可以通过创建更多线程并应用相同的方法轻松扩展以处理更多的视频文件和模型。
贡献新的跟踪器
你是否精通多目标跟踪,并且已经成功使用Ultralytics YOLO实现或改编了一个跟踪算法?我们邀请你向我们在ultralytics/cfg/trackers中的跟踪器部分贡献你的成果!你的实际应用和解决方案对于从事跟踪任务的用户来说可能非常有价值。
通过向这一部分贡献,你帮助扩展了Ultralytics YOLO框架内可用的跟踪解决方案的范围,为社区增加了另一层功能和实用性。
要开始你的贡献,请参考我们的贡献指南,以获取提交Pull Request(PR)的详细说明 🛠️。我们很期待看到你带来的成果!
让我们一起增强Ultralytics YOLO生态系统的跟踪能力 🙏!
常见问题
什么是多目标跟踪,Ultralytics YOLO如何支持它?
多目标跟踪在视频分析中涉及识别对象并在视频帧之间为每个检测到的对象维护一个唯一的ID。Ultralytics YOLO通过提供实时跟踪和对象ID来支持这一点,便于安全监控和体育分析等任务。系统使用BoT-SORT和ByteTrack等跟踪器,可以通过YAML文件进行配置。
如何为Ultralytics YOLO配置自定义跟踪器?
你可以通过从Ultralytics跟踪器配置目录复制现有的跟踪器配置文件(例如custom_tracker.yaml
)并根据需要修改参数来配置自定义跟踪器,除了tracker_type
。像这样在你的跟踪模型中使用此文件:
Example
```python from ultralytics import YOLO
model = YOLO("yolo11n.pt") results = model.track(source="https://youtu.be/LNwODJXcvt4", tracker="custom_tracker.yaml") ```
bash
yolo track model=yolo11n.pt source="https://youtu.be/LNwODJXcvt4" tracker='custom_tracker.yaml'
如何同时对多个视频流进行对象跟踪?
要同时对多个视频流进行对象跟踪,你可以使用Python的threading
模块。每个线程将处理一个单独的视频流。以下是一个如何设置的示例:
多线程跟踪
```python import threading
import cv2
from ultralytics import YOLO
定义模型名称和视频源
MODEL_NAMES = ["yolo11n.pt", "yolo11n-seg.pt"] SOURCES = ["path/to/video.mp4", "0"] # 本地视频,0表示网络摄像头
def run_tracker_in_thread(model_name, filename): """ 在单独的线程中运行YOLO跟踪器以进行并发处理。
参数:
model_name (str): YOLO11模型对象。
filename (str): 视频文件的路径或网络摄像头/外部摄像头的标识符。
"""
model = YOLO(model_name)
results = model.track(filename, save=True, stream=True)
for r in results:
pass
使用for循环创建并启动跟踪线程
tracker_threads = [] for video_file, model_name in zip(SOURCES, MODEL_NAMES): thread = threading.Thread(target=run_tracker_in_thread, args=(model_name, video_file), daemon=True) tracker_threads.append(thread) thread.start()
等待所有跟踪线程完成
for thread in tracker_threads: thread.join()
清理并关闭窗口
cv2.destroyAllWindows() ```
Ultralytics YOLO的多目标跟踪有哪些实际应用?
Ultralytics YOLO的多目标跟踪有多种应用,包括:
- 交通: 车辆跟踪用于交通管理和自动驾驶。
- 零售: 人员跟踪用于店内分析和安全。
- 水产养殖: 鱼类跟踪用于监测水生环境。
这些应用得益于Ultralytics YOLO处理高帧率视频的实时能力。
如何使用Ultralytics YOLO在多个视频帧上可视化对象轨迹?
要在多个视频帧上可视化对象轨迹,可以使用YOLO模型的跟踪功能,并结合OpenCV来绘制检测到的对象的路径。以下是一个示例脚本,演示了如何实现这一点:
在多个视频帧上绘制轨迹
```python from collections import defaultdict
import cv2 import numpy as np
from ultralytics import YOLO
model = YOLO("yolo11n.pt") video_path = "path/to/video.mp4" cap = cv2.VideoCapture(video_path) track_history = defaultdict(lambda: [])
while cap.isOpened(): success, frame = cap.read() if success: results = model.track(frame, persist=True) boxes = results[0].boxes.xywh.cpu() track_ids = results[0].boxes.id.int().cpu().tolist() annotated_frame = results[0].plot() for box, track_id in zip(boxes, track_ids): x, y, w, h = box track = track_history[track_id] track.append((float(x), float(y))) if len(track) > 30: track.pop(0) points = np.hstack(track).astype(np.int32).reshape((-1, 1, 2)) cv2.polylines(annotated_frame, [points], isClosed=False, color=(230, 230, 230), thickness=10) cv2.imshow("YOLO11 Tracking", annotated_frame) if cv2.waitKey(1) & 0xFF == ord("q"): break else: break cap.release() cv2.destroyAllWindows() ```
此脚本将绘制跟踪线,显示跟踪对象随时间的移动路径。