1⃣️ 参考博文:
https://zhuanlan.zhihu.com/p/62858357
2⃣️ 开源代码:
原作者开源(只有deep sort的核心代码,没有检测器):
https://github.com/nwojke/deep_sort
基于tensorfow加入yolov3,形成online跟踪器:
https://github.com/Qidian213/deep_sort_yolov3
基于pytorch做了一个DIY的ReID模型,但是源码有些小错误(看工程的issue):
https://github.com/ZQPei/deep_sort_pytorch
3⃣️ 简介
Deep Sort: Simple Online and Realtime Tracking with a Deep Association Metric
ICIP2017:
https://arxiv.org/abs/1703.07402v1
Deep Sort是多目标跟踪算法,基本思想是tracking-by-detection,利用运动模型和外观信息进行数据关联,运行速率主要由检测算法所决定(我测试一帧需要52ms,检测就占了39ms)。算法对每一帧进行目标检测(一般应用在行人检测),后续通过带权值的匈牙利匹配算法对之前的运动轨迹和当前检测对象进行匹配,形成物体的运动轨迹。权值由 点和运动轨迹的马氏距离 及 图像块的相似性(这里用向量的余弦距离) 加权求和得到。kalman滤波在计算马氏距离时,用于预测运动分布的协方差矩阵。创新点如下:
(1)引入了ReID模型从而利用外观信息计算余弦距离。
(2)deep指的是引入的ReID模型是一个提取外观信息的深度模型,最后输出128D向量
(3)在匈牙利匹配算法时,使用级联匹配的方式。指的是多次使用匈牙利算法对不同消失时长的轨迹进行匹配。
4⃣️ 状态估计:
使用一个8维空间去刻画轨迹在某时刻的状态
,分别表示bounding box中心的位置、纵横比、高度、以及在图像坐标中对应的速度信息。然后使用一个kalman滤波器预测更新轨迹,该卡尔曼滤波器采用匀速模型和线性观测模型。其观测变量为
。
5⃣️ 轨迹处理:
每个轨迹称为一个tracker,算法中由许多的tracker构成。
轨迹产生(n_init超参):对于匹配算法没有匹配上目标,则可能是产生的新轨迹,为这些目标新建一个tracker,但是标记为‘tentative’(因为这些目标有可能是检测器输出的噪声)。当连续n_init帧得到匹配,则确认这个新轨迹是有效的,标记为‘confirm’;否则认为是噪声轨迹,标注为“deleted”。
轨迹消失(max_age超参):每条轨迹都会有一个变量a来记录上一次成功匹配到当前的时间。如果a > max_age阈值,则认为轨迹终止,在后续的跟踪取消这个轨迹。
当检测目标和轨迹完成匹配,则将该目标添加到匹配的轨迹上。
6⃣️ 匈牙利算法中权重的度量:
deep sort的创新点在于利用运动匹配度和外观匹配度来权衡匈牙利算法的权重。用表示每条线的权重,用来决定初始匹配的连线(黑线,b_ij为0/1值,1代表ij顶点间有线,0则无线)。
运动匹配度:
使用detection和 track在kalman滤波器预测的位置 之间的马氏距离刻画运动匹配程度:
表示第j个detection和第i条轨迹之间的运动匹配度,其中
是轨迹由kalman滤波器预测得到的在当前时刻观测空间的协方差矩阵,
是轨迹在当前时刻的预测量bbox,
是第j个detection的bbox。
当马氏距离小于阈值,则认为匹配上如:
外观匹配度
:
纯粹用运动信息的SORT存在IDSwitch严重的问题,通过外观模型(ReID模型)可以缓解这个问题,使目标重新连接上之前的轨迹。
对于每一个detection,包括轨迹中的detections,使用深度网络提取出单位范数的特征向量r。然后使用detection和轨迹包含的detections的特征向量之间的最小余弦距离作为detection和tracker之间的表观匹配程度。
当然轨迹太长导致表观产生变化,在使用这种最小距离作为度量就有风险,所以文中只对轨迹的最新的
(超参)之内detections进行计算最小余弦距离:
同样的,该度量同样可以确定一个门限函数:
这个阈值需要根据实际情况进行调整(人脸识别的情况下,设为0.6最佳)
综合匹配度
:
运动匹配度和外观匹配度的加权和($lamda$是超参):
加上门限函数(只有当b_ij为1时,才认为是初步匹配上(两顶点有线))
由Yixiao Zhou提供:“另外还有一点我想说的是这两个匹配度度量的阈值范围是不同的,如果想取相通的重要程度,$lamda$应该取0.1左右。
7⃣️ 级联匹配
为了使 当前检测目标应连接上距离当前时刻较近的轨迹,在匹配时,优先匹配消失时长a较小的轨迹。并且当两条轨迹竞争同一个detection时,消失时间长的轨迹往往得到马氏距离更小,因为kalman filter一直在预测没有得到更新,导致协方差矩阵的弥散。此时引入级联匹配(其实也就是优先匹配)来让more frequently seen objects分配的优先级更高。具体步骤如下:
8⃣️ 性能分析:
因为我只了解单目标跟踪,但是多目标跟踪关注的性能指标和单目标跟踪有所差别,指标多许多,所以我就没有进行性能分析了,在定性分析中,发现同一目标在视频中仍然容易分到不同的轨迹(IDSwitch大),在后续的操作中,需要对这些不同的轨迹做一个聚类,对同一目标形成更加完整的轨迹。但是由于算法简单,计算量较少,非常实用,可以多了解一下~