DeepSORT算法流程图:
一、核心思想与要解决的问题
目标跟踪(Multi-Object Tracking, MOT)的任务是:给定一个视频序列,在每一帧中定位出多个目标(如行人、车辆),并在整个视频中维持每个目标的唯一身份标识(ID),即弄清楚“谁是谁”。
这个任务的主要挑战在于:
-
目标遮挡:一个目标被另一个目标或物体遮挡,之后又重新出现。
-
外观相似性:多个目标穿着、体型相似,容易导致身份切换(ID Switch)。
-
检测器失效:目标检测算法可能在某一帧漏检(False Negative)或误检(False Positive)。
DeepSORT 的核心思想就是利用目标的外观信息(Appearance Information) 来弥补运动信息(Motion Information) 的不足,从而更好地解决上述挑战。
二、算法流程概述
DeepSORT 的流程可以概括为以下步骤,这些步骤在每一帧中循环执行:
-
目标检测:使用目标检测器(如 YOLO, Faster R-CNN)获取当前帧中所有目标的边界框(Bounding Boxes)。DeepSORT 本身不包含检测器,它是一个“跟踪-by-检测”(Tracking-by-Detection)的框架。
-
预测:使用卡尔曼滤波(Kalman Filter)根据上一帧的轨迹(Tracks)预测它们在当前帧的位置。
-
关联匹配:这是算法的核心。将当前帧的检测结果(Detections) 和预测的轨迹(Tracks) 进行匹配。匹配基于两个度量:
-
运动关联:使用马氏距离(Mahalanobis Distance)衡量预测的轨迹和检测框在运动层面的一致性。
-
外观关联:使用余弦距离(Cosine Distance)衡量预测的轨迹和检测框在外观特征层面的相似性。
-
-
状态更新:
-
对于匹配成功的检测,用该检测结果更新对应轨迹的卡尔曼滤波状态。
-
对于未匹配的检测,初始化为新的轨迹(New Tracks)。
-
对于未匹配的轨迹,标记为“丢失”(Lost),并在一定时间未匹配后删除。
-
-
轨迹生命周期管理:管理轨迹的创建、确认和删除。
三、核心组件详解
1. 状态估计与卡尔曼滤波(Kalman Filter)
-
目的:预测目标在下一帧的位置,并为运动关联提供度量依据。
-
状态向量:DeepSORT 使用一个 8 维状态空间
(u, v, γ, h, ẋ, ẏ, γ̇, ḣ)
。-
(u, v)
:边界框中心的坐标。 -
γ
:宽高比(aspect ratio)。 -
h
:高度。 -
(ẋ, ẏ, γ̇, ḣ)
:分别是前四个变量的速度信息。
-
-
观测向量:检测器直接提供的观测值
(u, v, γ, h)
。 -
工作流程:
-
预测(Predict):根据上一帧的状态,预测当前帧的目标位置和速度(先验估计)。
-
更新(Update):当预测的轨迹与某个检测成功匹配后,用这个检测到的实际观测值来修正预测值,得到更准确的后验估计。
-
-
在马氏距离中的作用:卡尔曼滤波不仅提供了预测位置,还提供了预测位置的不确定性(协方差矩阵)。马氏距离正是利用了这个不确定性来计算预测和检测之间的“统计距离”,考虑了运动的方向和速度,比简单的欧氏距离更可靠。
2. 关联匹配(数据关联)
这是 DeepSORT 相比 SORT 改进最大的地方。它使用了一种级联匹配(Cascade Matching) 的策略,并融合了两种度量。
a. 外观特征提取(Deep Appearance Descriptor)
-
DeepSORT 使用一个在大规模行人重识别(Re-ID)数据集上预训练的深度卷积神经网络。
-
这个网络接收一个裁剪出的目标图像块(根据检测框),输出一个 128 维的向量(特征嵌入)。
-
这个向量被归一化,其模长为 1。它编码了目标的外观信息,对姿势变化、部分遮挡有一定鲁棒性。
-
对于每个轨迹,算法会保存最近 100 个关联成功的外观特征向量,形成一个外观特征库。
b. 度量计算
-
运动度量(马氏距离):
$-
d_j
:第 j 个检测框的观测值。 -
y_i
:第 i 条轨迹的预测值。 -
S_i
:第 i 条轨迹的卡尔曼滤波预测状态的协方差矩阵。 -
马氏距离过大(超过阈值)的匹配对会被拒绝,可以有效地排除因为运动不确定性而产生的不可靠匹配。
-
-
外观度量(余弦距离):
-
r_j
:第 j 个检测框的外观特征向量。 -
R_i
:第 i 条轨迹的外观特征库(保存了最近 100 个特征向量)。 -
这个公式计算的是当前检测特征与轨迹历史特征中最小的余弦距离。
1 - cosine_similarity
就是余弦距离。取值在 [0, 2] 之间,0 表示完全相同。
-
c. 融合度量与级联匹配
-
最终代价矩阵(Cost Matrix):
最终的匹配代价是运动度和外观度量的线性加权:
通常更依赖外观信息,λ 取值较小(如论文中为 0)。 -
级联匹配(Cascade Matching):
-
动机:解决频繁遮挡导致的问题。一个目标被遮挡多帧后,其卡尔曼滤波的预测不确定性会越来越大(协方差矩阵膨胀),马氏距离的阈值限制会使其难以与正确的检测结果匹配。
-
策略:优先匹配更“年轻”(最近出现)的轨迹,而不是像 SORT 一样对所有轨迹一视同仁。
-
算法会为当前帧的每个检测,尝试与所有轨迹进行匹配。
-
但匹配顺序不是随机的,而是按照轨迹被成功匹配的“年龄”排序。最近成功匹配的轨迹(更可能被看到)优先进行匹配。
-
这样,刚刚被遮挡了一两帧的目标(年龄较小)会优先获得匹配机会,避免其被不确定性更大的、长期丢失的轨迹所“挤占”。
-
-
-
匈牙利算法(Hungarian Algorithm):
使用匈牙利算法(或KM算法)来解决这个分配问题,根据最终的代价矩阵C_{i,j}
找到最优的匹配对,使得总体的匹配代价最小。
3. 轨迹生命周期管理
-
新轨迹诞生:任何未与现有轨迹匹配的检测框,都会被初始化为一个暂定(Tentative) 轨迹。
-
轨迹确认:一个暂定轨迹如果在连续的 N 帧(如 3 帧)中都成功匹配到检测,则被提升为确认(Confirmed) 轨迹。这有助于过滤掉误检。
-
轨迹消亡:一个确认轨迹如果在最近的 M 帧(如 max_age>30)内都未能匹配到任何检测,则被终止删除。暂定轨迹只要有一帧没匹配上就会被删除。
四、DeepSORT 与 SORT 的对比
特性 | SORT (Simple Online and Realtime Tracking) | DeepSORT (Deep Simple Online and Realtime Tracking) |
---|---|---|
核心度量 | 仅马氏距离(运动) | 马氏距离 + 余弦距离(外观) |
匹配策略 | 全局匹配(所有轨迹平等) | 级联匹配(优先匹配年轻轨迹) |
处理遮挡 | 弱。遮挡后马氏距离不确定性增加,易导致ID切换 | 利用外观特征,即使遮挡后重新出现也能找回 |
ID Switch | 较多 | 显著减少 |
计算成本 | 低 | 较高(需要运行CNN提取特征) |
五、总结
DeepSORT 的成功在于它巧妙地融合了目标的运动信息和外观信息。
-
卡尔曼滤波提供了基于运动的短期预测,效率高且适合线性运动。
-
深度外观特征提供了强大的长期辨别能力,能够在大幅度运动变化、遮挡和重现后,依然可靠地确认目标身份。
-
级联匹配策略优化了匹配顺序,有效解决了长期遮挡带来的匹配不确定性问题。
正是这种“运动模型为骨,外观模型为魂”的设计理念,使得 DeepSORT 在保持较高实时性的同时,大幅提升了多目标跟踪的准确性和鲁棒性,成为工业界和学术界广泛使用的基线模型。
六、对应过程的代码