3.5 使用Ultralytics YOLO进行多目标跟踪
多目标跟踪示例
在视频分析领域中,对象跟踪是一项关键任务,它不仅识别帧内的对象位置和类别,还在视频进程中为每个检测到的对象保持唯一的ID。其应用范围几乎无限,从监控与安保到实时体育分析。
为什么选择Ultralytics YOLO进行对象跟踪?
Ultralytics 跟踪器的输出与标准对象检测一致,但附加了对象ID的价值。这使得在视频流中跟踪对象并进行后续分析变得简单易行。以下是使用Ultralytics YOLO进行对象跟踪的原因:
-
高效:在保证准确性的同时,实时处理视频流。
-
灵活:支持多种跟踪算法和配置。
-
易用性:提供简单的Python API和CLI选项,便于快速集成与部署。
-
可定制性:可以轻松与自定义训练的YOLO模型结合,用于特定领域的应用。
观看视频:使用Ultralytics YOLO进行对象检测与跟踪。
现实应用场景
交通运输 | 零售 | 水产养殖 |
---|---|---|
车辆跟踪 | 人员跟踪 | 鱼类跟踪 |
功能概览
Ultralytics YOLO扩展了其对象检测功能,提供了强大且灵活的对象跟踪:
-
实时跟踪:无缝跟踪高帧率视频中的对象。
-
多种跟踪器支持:可以选择多种已建立的跟踪算法。
-
可定制的跟踪器配置:通过调整各种参数,满足特定需求的跟踪算法。
可用的跟踪器
Ultralytics YOLO支持以下跟踪算法,可以通过传递相关的YAML配置文件启用,例如 tracker=tracker_type.yaml
:
-
BoT-SORT - 使用
botsort.yaml
启用此跟踪器。 -
ByteTrack - 使用
bytetrack.yaml
启用此跟踪器。
默认跟踪器是BoT-SORT。
跟踪示例
Python代码
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
如上所示,跟踪可用于所有检测、分割和姿态模型,运行于视频或流媒体源上。
配置跟踪器
跟踪器阈值信息
如果对象的置信度得分低于 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)
跟踪器选择
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")
有关跟踪参数的完整列表,请参阅 ultralytics/cfg/trackers
页面。
Python示例
持续跟踪循环
以下是一个使用OpenCV(cv2)和YOLO11进行对象跟踪的视频帧的Python脚本。persist=True
参数告诉跟踪器当前图像或帧是序列中的下一个,期望从上一帧继承跟踪。
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,绘制物体在连续帧之间的轨迹可以提供关于检测物体的运动模式和行为的宝贵洞察。
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:
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))) # x, 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()
此脚本将绘制跟踪线,显示跟踪物体在多帧视频中的移动路径。
贡献新跟踪器
如果您擅长多目标跟踪,并成功使用Ultralytics YOLO实现或适配了跟踪算法,我们邀请您为 ultralytics/cfg/trackers
的跟踪器部分做出贡献!您的真实应用和解决方案对于从事跟踪任务的用户将极具价值。
通过贡献,您可以帮助扩展Ultralytics YOLO框架内可用的跟踪解决方案,增加社区功能和实用性。
要开始贡献,请参阅我们的贡献指南,了解如何提交Pull Request (PR) 🛠️。我们期待看到您的贡献!
常见问题解答
1. 什么是多目标跟踪,Ultralytics YOLO如何支持它?
在视频分析中,多目标跟踪包括识别物体并在多个视频帧中为每个检测到的物体保持唯一ID。Ultralytics YOLO通过提供实时跟踪和对象ID来支持这一点,方便安全监控和体育分析等任务。系统使用如BoT-SORT和ByteTrack的跟踪器,可以通过YAML文件进行配置。
2. 如何为Ultralytics YOLO配置自定义跟踪器?
您可以通过从Ultralytics跟踪器配置目录中复制现有的跟踪器配置文件(例如 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")
3. 如何同时在多个视频流上运行对象跟踪?
要在多个视频流上同时运行对象跟踪,您可以使用Python的 threading
模块。每个线程将处理一个视频流。以下是设置示例:
多线程跟踪
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):
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()
此示例可以轻松扩展以处理更多的视频文件和模型,创建更多的线程并应用相同的方法。
4. 多目标跟踪的现实应用是什么?
Ultralytics YOLO的多目标跟踪具有多种应用,包括:
-
交通运输:用于交通管理和自动驾驶的车辆跟踪。
-
零售:用于店内分析和安全的人员跟踪。
-
水产养殖:用于监控水生环境的鱼类跟踪。
这些应用受益于Ultralytics YOLO实时处理高帧率视频的能力。
5. 如何使用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()
此脚本将绘制跟踪线,显示跟踪物体在多帧视频中的移动路径。