【多目标跟踪】SORT 与 Deep SORT(包含实例项目演示)

提示:想看实际项目的可以直接到最后

前言

一、SORT – SIMPLE ONLINE AND REALTIME TRACKING

1.概述

SORT跟踪算法到底在干什么?

1、跟踪

2、预测(卡尔曼滤波器)

3、检测

4、关联(用IOU计算Bbox之间的距离 + 匈牙利算法选择最优关联结果)

2.解析SORT算法

假设T1时刻成功跟踪了某个单个物体,ID为1,绘制物体跟踪BBox(紫色)

T2时刻物体检测BBox总共有4个(黑色),预测T2时刻物体跟踪的BBox(紫色)有1个,解决紫色物体跟踪BBox如何与黑色物体检测BBox关联的算法,就是SORT物体跟踪算法要解决的核心问题

SORT关联两个BBox的核心算法是:用IOU计算Bbox之间的距离 + 匈牙利算法选择最优关联结果

【多目标跟踪】SORT 与 Deep SORT(包含实例项目演示)

3.补充说明

物体跟踪与物体检测是两件不同的事

物体跟踪是把物体跟踪预测的BBox与物体检测的BBox关联,然后用对应的物体检测BBox代表成功跟踪的BBox结果以上图为例
T1时刻已经成功跟踪了3个检体(不同颜色的BBox代表不同的物体ID)
T2时刻除了所有物体检测的新位置BBox(灰色),还要物体跟踪预测的BBox(非灰的其它不同颜色BBox)与物体检测BBox(灰色)关联,从而分辨出哪一个物体跟踪的BBox对应哪一个物体检测的BBox,从而产生T2时刻的物体跟踪BBox结果(包括新增物体跟踪器跟踪T2中新检测到的物体)
T3时刻如果被追踪的物体发生了遮挡(红框BBox的物体),那么要继续能找到该物体并追踪 (避免ID Switch)

【多目标跟踪】SORT 与 Deep SORT(包含实例项目演示)

4.多目标跟踪中SORT算法思想理解流程

在跟踪之前,对所有目标已经完成检测,实现了特征建模过程。

  1. 第一帧进来时,以检测到的目标初始化并创建新的跟踪器,标注id。
  2. 后面帧进来时,先到卡尔曼滤波器中得到由前面帧box产生的状态预测和协方差预测。求跟踪器所有目标状态预测与本帧检测的box的IOU,通过匈牙利指派算法得到IOU最大的唯一匹配(数据关联部分),再去掉匹配值小于iou_threshold的匹配对。
  3. 用本帧中匹配到的目标检测box去更新卡尔曼跟踪器,计算卡尔曼增益、状态更新和协方差更新,并将状态更新值输出,作为本帧的跟踪box。对于本帧中没有匹配到的目标重新初始化跟踪器。

SORT的贡献主要有二:

  1. 利用强大的CNN检测器的检测结果来进行多目标跟踪
  2. 使用基于卡尔曼滤波(Kalman filter)与匈牙利算法(Hungarian algorithm)的方法来进行跟踪

5.SORT算法的优缺点

优点缺点
速度快对于物体遮挡几乎没有处理,导致ID switch 次数很高
在没有遮挡的情况下准确度很高有遮挡的情况下准确度很低

二、Deep SORT – SIMPLE ONLINE AND REALTIME TRACKING WITH A DEEP ASSOCIATION METRIC

1.算法思路

SORT 算法的思路是将目标检测算法得到的检测框与预测的跟踪框的 iou(交并比)输入到匈牙利算法中进行线性分配来关联帧间 Id。而 DeepSORT 算法则是将目标的外观信息加入到帧间匹配的计算中,这样在目标被遮挡但后续再次出现的情况下,还能正确匹配 Id,从而减少 Id Switch。

1、轨迹处理(Track Handing)和状态估计(state estimation):

1.1 状态估计:

1.2 轨迹处理:

2、分配问题

2.1 运动信息的关联:

2.2 目标外观信息的关联:

2.3 两种关联方式的融合:

3、级联匹配

2.状态估计

用一个8维空间表示轨迹在某时刻的状态:

【多目标跟踪】SORT 与 Deep SORT(包含实例项目演示)
其中(u,v)是bounding box的中心坐标,r是长宽比,h表示高度。其余四个变量表示对应的在图像坐标系中的速度信息。使用一个基于常量速度模型和线性观测模型的标准kalman滤波器进行目标运动状态的预测,预测的结果为(u,v,r,h)。

3.轨迹处理

关于跟踪器处理以及新检测结果出现的处理,deep sort和sort的做法相同:(回顾一下)

针对跟踪器:

设置计数器,在卡尔曼滤波预测期间递增,一旦跟踪结果和检测结果能够match上,这个trk相对应的计数器就重置为0。

如果一个trk在一段时间内一直没能match上检测结果,我们就把这个trk从跟踪器列表trks中删除。

针对新检测结果出现:

当某帧出现新的检测结果的时候(即,出现了与当前跟踪结果无法match的检测结果),我们认为可能出现了新的目标,会为其创建新的跟踪器trk。不过我们需要观察一段时间,如果连续3帧中潜在的新跟踪器对目标位置的预测结果(标记为tentative)都能够与检测结果match,那么则确认是出现了新的目标轨迹(标记为confirmed);如果不能达到该要求,则认为是出现了“虚警”,需要从跟踪器列表trks中删除该trk(标记为deleted)。

4.分配问题

在分配问题上,sort是把检测框和跟踪框的IOU情况作为输入,采用匈牙利算法,输出检测框和跟踪框的匹配结果。Deep sort同时考虑了运动信息的关联和目标外观信息的关联,使用了融合度量的方式计算检测和跟踪轨迹之间的匹配程度。

5.运动信息的关联

Deep sort使用检测框与跟踪器预测框之间的马氏距离来描述运动关联程度。
【多目标跟踪】SORT 与 Deep SORT(包含实例项目演示)

其中,dj表示第j个检测框的位置,yi表示第i个跟踪器对目标的预测位置,Si表示检测位置与平均跟踪位置之间的协方差矩阵。也就是说,马氏距离通过计算检测位置和平均跟踪位置之间的标准差将状态测量的不确定性进行了考虑。
并且,deep sort通过以从逆χ2分布计算得来的95%置信区间对马氏距离进行阈值化处理。

【多目标跟踪】SORT 与 Deep SORT(包含实例项目演示)

如果某次关联的马氏距离小于指定的阈值t(1),则设置运动状态的关联成功。对于我们的四维测量空间,相应的Mahalanobis阈值为t (1) = 9.4877。

6.目标外观信息的关联:

当运动的不确定性很低的时候,上述的马氏距离匹配是一个合适的关联度量方法,但是在图像空间中使用kalman滤波进行运动状态估计只是一个比较粗糙的预测。特别是相机存在运动时会使得马氏距离的关联方法失效,造成ID switch的现象。

因此作者引入了第二种关联方法,对每一个的检测块dj求一个特征向量rj (通过CNN网络计算对应的128维feature向量rj),限制条件是||rj||=1。作者对每一个跟踪目标构建一个gallary,存储每一个跟踪目标成功关联的最近100帧的特征向量。那么第二种度量方式就是计算第i个跟踪器的最近100个成功关联的特征集与当前帧第j个检测结果的特征向量间的最小余弦距离。计算公式为:(注意:轨迹太长,导致外观发生变化,发生变化后,再使用最小余弦距离作为度量会出问题,所以在计算距离时,轨迹中的检测数量不能太多)

【多目标跟踪】SORT 与 Deep SORT(包含实例项目演示)
如果上面的距离小于指定的阈值,那么这个关联就是成功的。阈值是从单独的训练集里得到的。

【多目标跟踪】SORT 与 Deep SORT(包含实例项目演示)

7.级联匹配

一个目标长时间被遮挡之后,卡尔曼滤波预测的不确定性就会大大增加,状态空间内的可观察性就会大大降低。假如此时两个跟踪器竞争同一个检测结果的匹配权,往往遮挡时间较长的那条轨迹因为长时间未更新位置信息,追踪预测位置的不确定性更大,即协方差会更大,马氏距离计算时使用了协方差的倒数,因此马氏距离会更小,因此使得检测结果更可能和遮挡时间较长的那条轨迹相关联,这种不理想的效果往往会破坏追踪的持续性。

简单理解,假设本来协方差矩阵是一个正态分布,那么连续的预测不更新就会导致这个正态分布的方差越来越大,那么离均值欧氏距离远的点可能和之前分布中离得较近的点获得同样的马氏距离值。

所以,作者使用了级联匹配来对更加频繁出现的目标赋予优先权,具体算法如下图(图源自论文)。

【多目标跟踪】SORT 与 Deep SORT(包含实例项目演示)
T表示当前的跟踪状态集合,D表示当前的检测状态集合。

1. 根据公式计算融合度量的代价矩阵;
2. 计算融合的阈值;
3. 初始化已匹配集合为空集;
4. 初始化未匹配集合U为检测集合D;
5. 对跟踪状态集合从1到最大跟踪时间Amax,由近到远循环;
6. 根据时间选择跟踪的轨迹;
7. 计算最小匹配的轨迹的ID
8. 第八行表示将第七步中匹配的ID加入到M中;
9. 将上述ID从U中删除;
10. 结束循环;
11.返回最终匹配集合M和未匹配集合U。

级联匹配的核心思想就是由小到大对消失时间相同的轨迹进行匹配,这样首先保证了对最近出现的目标赋予最大的优先权,也解决了上面所述的问题。在匹配的最后阶段还对 unconfirmed和age=1的未匹配轨迹进行基于IoU的匹配。这可以缓解因为表观突变或者部分遮挡导致的较大变化。

总结

SORT与Deep SORT是我在研一时候的在研究多目标跟踪时接触到的第一个算法,它结构简单,通俗易懂,是作为新接触目标跟踪的读者可以尝试复现的代码。后来因为组内的原因,我就很少接触跟踪方面的知识了,最后附上我自己实现的一个多目标跟踪实际项目。实际项目的具体实现我会在以后的文章详细解释。希望可以引起你对多目标跟踪的兴趣!