级联匹配

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

算法使用:针对每一个检测器都会分配一个跟踪器,每个跟踪器会设定一个time_since_update参数。如果跟踪器完成匹配并更新,那么参数会重置为0,否则会加1。实际上,级联匹配换句话说就是不同优先级的匹配。在级联匹配中,会根据这个参数来对跟踪器分前后顺序,参数小的先匹配,参数大的的后匹配。也就是给上一帧最先匹配的跟踪器高的优先权,给好几帧都没匹配上的跟踪器降低优先权(慢慢放弃)。

上图很清晰地解释了如何进行级联匹配,上图由虚线划分为两部分:

上半部分中计算相似矩阵的方法使用到了外观模型(ReID)和运动模型(马氏距离)来计算相似度,得到代价矩阵,另一个则是门控矩阵,用于限制代价矩阵中过大的值。(门控矩阵的作用就是通过计算卡尔曼滤波的状态分布和测量值之间的距离对代价矩阵进行限制)

下半部分中是级联匹配的数据关联步骤,匹配过程是一个循环(max age个迭代,默认为70),也就是从missing age=0到missing age=70的轨迹和Detection进行匹配,没有丢失过的轨迹优先匹配,丢失较为久远的就靠后匹配。通过这部分处理,可以重新将被遮挡目标找回,降低被遮挡然后再出现的目标发生的ID Switch次数

步骤如下:

输入:该算法接受三个输入,分别为追踪的索引集合[公式] ,[公式](i为追踪的序号,即分配给目标的唯一ID),当前帧检测框索引的集合[公式] , [公式](j为某一时刻目标检测获得的检测框的编号),最大保留时长(Maximum age)[公式]

步骤一:根据以下公式计算联合代价矩阵

步骤二:根据以下公式计算门控矩阵,将马氏距离和余弦距离的阈值综合到一起,联合判断该某一关联(association)是否合理可行的(admissible)

步骤三:初始化匹配列表M,为空

步骤四:初始化非匹配列表U,将D赋予

步骤五:循环

1.按照给定的age选择track

2.使用最小成本法(即匈牙利算法)计算最小代价匹配时的i,j

3.将满足何时条件的i,j赋值给匹配列表M,保存

4.重新更新非匹配列表U

步骤六:循环结束,匹配完成

代码实现如下:

级联匹配的核心思想就是由小到大对消失时间相同的轨迹进行预测,这样首先保证了对最近出现的目标赋予最大的优先权,也解决了上面所述的问题。

在匹配的最后阶段还对unconfirmed(无法确定)和age=1(刚初始化)的未匹配轨迹进行基于IOU匹配(因为没有之前的运动信息和外观信息)。这可以缓解因为表观突变或者部分遮挡导致的较大变化。

代码如下: