多目标跟踪入门篇(2):从SORT到DeepSORT

一、DeepSORT 诞生的逻辑

DeepSORT,是SORT的升级版。对SORT不了解的朋友建议先看我之前写的一篇博客,再来阅读这篇文章。

我们知道,SORT是一种十分简单而实用的跟踪器,能以超过200帧/秒的速度跟踪目标。多目标跟踪问题,说白了就是数据关联(data association)问题,即如何把两组数据的元素一一匹配起来。在基于检测的跟踪算法(Tracking-by-Detection,TBD)的场景里,这里说的两组数据,便是两帧图像中物体的外包盒(bounding box,下面简称bbox)的特征,如长、宽、中心坐标等。SORT利用匈牙利算法来完成数据关联的任务,将两帧的bbox一一匹配;而在匹配前,SORT算法来使用了卡尔曼滤波来减弱检测算法的误差,提高目标观测的精度。其中,匈牙利算法的核心是建立损失矩阵,在SORT算法中,损失矩阵的每个c_{i,j}元素由bbox的IOU(交并比)决定,即前一帧的第i个bbox(由卡尔曼滤波预测得到)与当前帧的第j个bbox(由目标检测算法得到)的IOU。IOU越大,两个bbox越接近,SORT跟踪器便认为两者越有可能是同一个物体。

比较敏锐的读者想必已经觉得不对头了,根据外包盒的重叠度来判断是否为一个物体,这样的准则未免太粗糙了!即使SORT使用了一些名字听起来高大上的算法。比方说,现在SORT正在跟踪路上的两个行人,两人相向而行,一开始两人隔得比较远,跟踪没问题;但当两人相遇时,问题便出现了,我们假设在某一帧的时间里,行人A和行人B擦肩而过,位置发生了交换。这是SORT跟踪器按照IOU最大原则,就很有可能把行人A误认为行人B,把B误认成A!(当然,由于卡尔曼滤波的作用,跟踪可能会把这两个人判定为新出现的目标,这种现象称为ID switch)

容易发现,SORT只利用了几何上的信息,或者说物体的运动信息,而没有利用物体的外观信息。虽然目标检测算法可以获得物体的外观信息,但是SORT的跟踪器并没有利用这一信息。因此,SORT的提出者就沿着这一思路对其进行了改进,提出了DeepSORT.

二、DeepSORT 概述

DeepSORT在正确率上相比SORT的提升并不是很明显,其主要的突破在于,将IDswitch的频率降低了45%,而这以突破则是由外观模型的引入引起的。DeepSORT利用预先设计的CNN网络,提取出一个描述bbox内物体外观的128维的向量,并将这一向量融入损失矩阵的构造,从而使得匈牙利算法的匹配结果更加可靠

三、DeepSORT的组件

1)卡尔曼滤波

卡尔曼滤波的设计与SORT基本相同,使用匀速运动和线性观察模型(constant velocity motion and linear observation model),状态向量为x = (u,v,\gamma ,h,\dot{u},\dot{v},\dot{\gamma},\dot{h}),其中u,v是bbox的中心坐标,\gamma是横纵比,h是高度,头上带点的是各自的变化率。

卡尔曼滤波的原理在上一篇博客中有介绍,这里不再赘述。

(2)损失矩阵

1、几何距离

作者用卡尔曼滤波预测的描述bbox的向量\gamma_i直接检测到的bbox向量d_j马氏距离来定义几何距离d^{(1)}(i,j),具体公式如下:

                                                         d^{1}(i,j) = (d_j - y_i)^TS_i^{-1}(d_j-y_i)

其中,S_i为卡尔曼滤波中观测值的方差-协方差矩阵

2、外观距离

外观距离用改化的余弦距离来定义:d^{2}(i,j) = min\{ 1- \gamma_j^T\gamma_k^{(i)}\}

其中\gamma_j为CNN提取的外观向量(128维),并经过归一化处理,\gamma_k^{(i)}表示第i个跟踪器中储存的第k个外观向量。由于一个追踪器中可能储存了大量同一目标的bbox,因此我们选择其中使得d^{2}(i,j)最小的那一个作为距离,即选择与检测结果做接近的外观模型来衡量。

为了提取外观向量,作者预先设计了一个10层的卷积神经网络:2个卷积层,1个最大池化层,6个残差块和1个全连接层。具体结构见下图

 

3、损失矩阵定义

定义了几何距离和外观距离后,损失矩阵的定义就十分自然了:

c_{i,j} = \lambda d^{(1)}(i,j)+(1-\lambda)d^{(2)}(i,j)

其中,i,j的含义与上文一致,分别表示第i个跟踪结果和第j个检测结果,\lambda为参数,需要人工给定。作者发现,\lambda取0是一个很好的选择。等等,取0?!那几何距离d^{(1)}(i,j)不久对跟踪没有影响了么?不着急,虽然d^{(1)}(i,j)对损失矩阵没有贡献,但它仍然在跟踪过程了发挥了作用。我们往下看。

(3)置信矩阵

置信矩阵的设计和损失矩阵十分相似,都是从几何和外观两个角度着手,来描述观测值的可信度。由于在编程实现时,d^{(1)}(i,j)d^{2}(i,j)都需进行归一化处理,因此如果它们的值如果远大于1,我们就有理由认为它们是错误的,应该被舍弃。

1、几何置信度

上式,表示如果d^{(1)}(i,j) \leq t^{(1)},那么b^{(1)}_{i,j} =1,否则b^{(1)}_{i,j}=0。t^{(1)}是一个常数,由概率统计中的假设检验方法得来,作者用置信区间为95%的分布来建议,得到t^{(1)}=9.4877。

我们看到d^{(1)}(i,j)虽然在损失矩阵中没有贡献,但是可以用来判断某一次检测结果是否可靠。

2、外观置信度

外观置信度和几何置信度的定义相同。

3、总置信度

可看到只有b^{(1)}_{i,j}b^{(2)}_{i,j}都为1,也就是检测结果在几何上和外观上都“可靠”时,b_{(i,j)}才为1,这时候才能说检测结果是可靠的。

(4)计数器

对于每一个跟踪器k,DeepSORT会记录自上一次匹配成功时起,经过的帧数a_k。如果该跟踪器匹配成果,则会重新置为0。一旦a_k大于某一给定阈值A_{max},那么就认为目标离开了视场,跟踪器被删除。

如果检测出新的物体,便会定义一个新的“候选”跟踪器,如果这个跟踪器在前三帧中有任意一帧没有成功匹配,则删除这个“候选”跟踪器;只有前三帧全部匹配成果,“候选”跟踪器采用“正式”被启用,这样的设计能够减少异常检测对跟踪的影响。

四、算法流程

原文中给出了算法的流程,如下下图所示:

值得注意的是,遍历跟踪器的顺序是依据计数器的大小排列的,从小到大遍历。之所以这样设计,是因为计数器的值a_k越大,则说明物体被遮挡的时间越长(如果物体没有离开视场的话),当物体再次出现时匹配的误差就越大,因此作者让这些误差较大的跟踪器最后匹配,以给“精度更高“的跟踪器以更高的权重。

五、小结

DeepSORT在SORT的基础上,应用预先训练的CNN来提取外观信息,将其融入匈牙利算法的权重设置。这一改进使得IDswitch的概率降低了45%,并仍能满足实时的要求。

 

参考资料:

1、原文:https://arxiv.org/abs/1703.07402

2、源码:https://github.com/nwojke/deep_sort

  • 7
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值