作者:嘉苹民智79 | 来源:互联网 | 2023-08-19 15:03
DeepSORT是一种tracking_by_detection框架的算法
虽然性能一般,但速度不错,GitHub上有很多基于不同检测器的实现
而且JDE、FairMOT、CSTrack等JDE的追踪器,匹配思路其实都是DeepSORT的思路
给出yolov3、yolov4和centernet的开源链接
GitHub - mikel-brostrom/Yolov3_DeepSort_Pytorch: Real-time multi-person tracker using YOLO v3 and deep sort
https://github.com/theAIGuysCode/yolov4-deepsort
https://github.com/kimyoon-young/centerNet-deep-sort
基础知识:
1. 卡尔曼滤波 应用非常广的一种多传感器融合算法
对理论不感兴趣的话,最开始学的时候其实可以把MOT中的卡尔曼滤波当做一个运动预测的黑箱来使用,用于预测当前帧中目标在下一帧的位置
(ps:我大二的时候robomater的比赛中就一直在用这个算法,融合摄像头数据和机器人云台电机数据进行目标预测,但迷迷糊糊用了一年多,是到后来用卡尔曼滤波搞简单的slam,才大概弄懂的原理)
这部分原理很典型的是温度/小车的例子,网上原理很多,这里主要讲在MOT中的使用
协方差矩阵:描述内部变量的相关性的矩阵
MOT中kalman主要用于运动预测,在DeepSORT中只使用了一个最简单的匀速运动模型
在DeepSORT中,描述一个检测框需要四个状态:
- 中心点横坐标
- 中心点纵坐标
- 检测框大小
- 检测框长宽比
对应的,匀速运动模型还需要有:
- 中心点横坐标的变化速度
- 中心点纵坐标的变化速度
- 检测框大小的变化速度
- 检测框长宽比的变化速度
该代码定义了个KalmanFilter类,总共分为6部分:
- (1)类初始化__init__
- (2)初始化状态(mean)与状态协方差(covariance)的函数initiate
- (3)预测阶段函数predict
- (4)分布转换函数project
- (5) 更新阶段函数update
- (6) 计算状态分布和测量(检测框)之间距离函数gating_distance
2. 匈牙利算法
匈牙利算法(Hungarian Algorithm)与KM算法(Kuhn-Munkres Algorithm)都是用来解决多目标跟踪中的数据关联问题的
匈牙利算法与KM算法都是为了求解二分图的最大匹配问题。二分图的描述参考自这里
带你入门多目标跟踪(三)匈牙利算法&KM算法 - 知乎
匈牙利算法解决的是一个分配问题。SK-learn库的linear_assignment_和scipy库的linear_sum_assignment都实现了这一算法,只需要输入cost_matrix即代价矩阵就能得到最优匹配。不过要注意的是这两个库函数虽然算法一样,但给的输出格式不同。
DeepSORT的优化主要就是基于匈牙利算法里的这个代价矩阵。它在IOU Match之前做了一次额外的级联匹配,利用了外观特征和马氏距离。
正文:
DeepSORT是在SORT基础上进行改进的。
SORT算法利用卡尔曼滤波算法预测检测框在下一帧的状态,将该状态与下一帧的检测结果进行匹配,实现车辆的追踪。但由于遮挡和漏检等情况的影响,SORT容易出现大量的ID切换。
为了降低ID切换,DeepSORT利用了前面检测到的物体的外观特征,DeepSORT中采用了一个简单(运算量不大)的CNN来提取被检测物体(检测框物体中)的外观特征(低维向量表示),在执行完每帧检测+追踪后,进行一次物体外观特征的提取并保存。
之后每执行一步时,都要执行一次当前帧被检测物体外观特征与之前存储的外观特征的相似度计算,这个相似度将作为一个重要的判别依据(不是唯一的,因为作者说是将运动特征与外观特征结合作为判别依据,这个运动特征就是SORT中卡尔曼滤波做的事)
DeepSORT只使用了一个简单的CNN网络(也所以速度才更能快),网络的输出是一个128维的特征向量。
DeepSORT对追踪的初始化、新生与消失进行了设定。
- 初始化:如果一个检测没有和之前记录的track相关联,那么从该检测开始,初始化一个新的目标(并不是新生)
- 新生:如果一个目标被初始化后,且在前三帧中均被正常的捕捉和关联成功,那么该物体产生一个新的track,否则将被删除。
- 消失:如果超过了设定的最大保存时间(原文中叫做predefined maximum age)没有被关联到的话,那么说明这个物体离开了视频画面,该物体的信息(记录的外观特征和行为特征)将会被删除。
SORT中解决分配问题使用的是匈牙利算法(仅使用运动特征来计算代价矩阵),该算法卡尔曼滤波算法预测的位置与下一帧目标检测出来的位置间的匹配。DeepSORT中,作者结合外观特征(由上述的CNN提取的128维特征向量)和运动特征(卡尔曼滤波预测的结果)来计算代价矩阵,从而根据该代价矩阵使用匈牙利算法进行目标的匹配。
- 运动特征:其实就是使用预测框和新bbox的距离(马氏距离)
马氏距离通过测量卡尔曼滤波器的追踪位置均值(mean track location)之间的标准差与检测框来计算状态估计间的不确定性,即 D(i,j) 为第i个追踪分布和第j个检测框之间的马氏距离(不确定度)。使用对马氏距离设定一定的阈值,可以排除那些没有关联的目标。
作者对每个目标k创建了一个gallery,该gallery用来存储该目标在不同帧中的外观特征(128维向量),论文中用 Rk 表示(k表示track ID)。在某一时刻,作者获得出检测框(编号为j)的外观特征,记作 Rj 。然后求解所有已知的gallery中的外观特征与获得的检测框(编号为j)的外观特征的最小余弦距离。
在DeepSORT中, motion特征和appearance特征是相辅相成的
- motion特征(由马氏距离计算获得)提供了物体定位的可能信息,主要用于短期预测。
- appearance特征(由余弦距离计算获得)可以在目标被长期遮挡后,恢复目标的ID编号,减少ID切换次数。
DeepSORT中使用一个简单的加权运算进行特征融合
这里的 为马氏距离,为余弦距离。 为权重系数。所以当 时,那么就是改进版的SORT, 时,仅仅依靠外观特征进行匹配也是可以进行追踪的。
部分参考自
【MOT】详解DeepSORT多目标追踪模型 - 知乎
【多目标跟踪】FairMOT(原理与代码详解)_怡宝2号-CSDN博客_fairmot代码详解
感谢大佬们