Object Tracking
目标跟踪会关联视频不同帧中的检测结果,并在对象移动和受到遮挡时为每个对象保留持久 ID。了解跟踪器的工作原理并查看代码。
目标跟踪是计算机视觉任务:它在连续视频帧中定位目标,并将这些位置串联成轨迹,为每个目标分配一个持续不变的 ID。汽车以 ID 7 进入画面后,即使移动、转弯,或短暂地被公交车挡住,仍会保持 ID 7;这样系统就能只计数一次、测量汽车速度,并判断其行驶方向。单目标跟踪会跟随在第一帧中选定的一个目标;多目标跟踪(MOT)则是实践中最常见的形式,会同时跟踪所有感兴趣类别中的每个目标。
目标跟踪的工作原理#
大多数多目标跟踪器采用基于检测的跟踪方法:先由目标检测模型在每一帧中查找目标,再由跟踪器将这些检测结果随时间关联起来。跟踪器会使用运动模型(通常是卡尔曼滤波器)、通过交并比(IoU)衡量的边界框重叠度、可选的来自目标重识别(Re-ID)模型的外观嵌入,以及匈牙利算法等线性分配求解器。每帧都会执行以下四个步骤:
- 预测:假设物体匀速运动,卡尔曼滤波器会预测每条现有轨迹的边界框在新一帧中的位置。
- 评分:跟踪器会根据 IoU、运动信息,以及部分跟踪器中的外观相似度,构建预测轨迹与新检测结果之间的代价矩阵。
- 分配:求解器会选出代价最低的一对一匹配。
- 管理轨迹:匹配成功的轨迹会更新状态;置信度高但未匹配的检测结果会开启新轨迹;未匹配的轨迹则会在一定帧数的缓冲期内标记为“丢失”,以便在被遮挡后恢复。
生命周期管理步骤能在检测结果连续几帧消失时保持 ID 稳定:
这一核心设计始于 2016 年的 SORT,它只使用卡尔曼滤波器、IoU 代价和匈牙利算法。DeepSORT加入了外观特征,以便在遮挡后恢复目标身份;ByteTrack则通过在第二轮中匹配低置信度检测结果来提高召回率,因为这些结果往往对应部分被遮挡的目标。后续跟踪器加入了用于移动相机的相机运动补偿,以及适用于人群的更丰富关联规则。
跟踪与检测的比较#
检测器没有状态:它会独立处理每一帧,因此第 1 帧中的汽车与第 2 帧中的汽车是互不相关的检测结果。跟踪会添加跨帧传递身份的状态,而计数、停留时间和速度估算都依赖这一点。跟踪也不同于点跟踪和光流,后两者会跟随单个像素或表面点,而不会将它们归为带标签的物体。
Ultralytics YOLO 的跟踪模式可为任何 YOLO26检测、分割、姿态或定向框模型添加此状态;内置六种跟踪器,包括 ByteTrack、BoT-SORT 和默认的 TrackTrack:
from ultralytics import YOLO
# Load a YOLO26 detector; track() pairs it with a tracker that assigns persistent IDs
model = YOLO("yolo26n.pt")
detections, track_ids = 0, set()
for result in model.track(
"https://github.com/ultralytics/assets/releases/download/v0.0.0/decelera_portrait_min.mov", stream=True
):
detections += len(result.boxes)
if result.boxes.is_track:
track_ids.update(result.boxes.id.int().tolist())
print(f"Detections summed over all frames: {detections}")
print(f"Unique tracked objects: {len(track_ids)}")唯一 ID 的数量小于检测结果总数,因为每个 ID 都代表一个物体,并贯穿该物体出现的所有帧。
实际应用#
- 交通监控与速度估算:跨帧跟踪每辆车,可用于计数、车道级交通流分析,以及根据轨迹每秒覆盖的距离估算速度。
- 零售分析:商店摄像头会跟踪顾客,以衡量客流量、排队长度和顾客在展示区前的停留时间,同时避免重复计算同一个人。
- 体育分析:转播机构和教练会跟踪球员和球,以计算跑动距离、速度和球队阵型。
- 自动驾驶车辆与机器人:感知系统会跟踪行人和车辆,以估算它们的速度,并预测它们下一秒的位置。
衡量跟踪质量#
跟踪器会在 MOT17、用于密集人群的 MOT20,以及面向外貌相似、运动难以预测的人群的 DanceTrack 等基准数据集上进行比较。MOTA 将漏检、误报和身份切换汇总为一个分数,但该分数主要受检测质量影响;IDF1 衡量每个真实目标能否始终保持同一 ID;HOTA则取检测准确率与关联准确率的几何平均值,平衡这两方面表现。










