本文首发于公众号【DeepDriving】,欢迎关注。
简介
上篇文章介绍了多目标跟踪算法SORT
,该算法虽然速度很快,但是也存在ID
切换频繁等问题。针对这些问题,作者时隔一年后又在文章《Simple Online and Realtime Tracking with a Deep Association Metric
》中提出了DeepSORT
算法。与SORT
仅仅采用边界框的IOU
作为匹配时的距离度量不同的是,DeepSORT
采用一种更可靠的距离度量方法,该方法结合了物体的运动和外观信息,其中外观信息是通过一个在大规模行人重识别数据集上离线训练的CNN
网络提取的。基于这些改进,DeepSORT
提升了跟踪算法的鲁棒性,将ID
切换率减少了45%
,并同时保持容易部署、高效运行的优点。
论文地址:https://arxiv.org/abs/1703.07402
代码地址:https://github.com/nwojke/deep_sort
具体实现
状态估计
跟SORT
一样,DeepSORT
还是对每个目标采用线性恒速模型进行建模并用标准卡尔曼滤波器进行状态估计,不过状态向量由7
维变成了8
维:
x = [ u v r h u ˙ v ˙ r ˙ h ˙ ] T \mathbf{x} =\begin{bmatrix} u & v & r & h & \dot{u} & \dot{v} & \dot{r} & \dot{h} \end{bmatrix}^T x=[uvrhu˙v˙r˙h˙]T
相应的,观测向量变为:
z = [ u v r h ] T \mathbf{z} =\begin{bmatrix} u & v & r & h \end{bmatrix}^T z=[uvrh]T
其中 ( u , v ) (u,v) (u,v)表示物体边界框的中心点, r r r和 h h h分别表示边界框的长宽比和高度, ( u ˙ , v ˙ , r ˙ , h ˙ ) (\dot{u}, \dot{v}, \dot{r} , \dot{h}) (u˙,v˙,r˙,h˙)表示它们在图像中的变化率。
对于每个track
,都要计算其距离上一次成功与检测结果匹配的那帧与当前帧的差,在代码中是用time_since_update
变量来表示。这个变量在调用卡尔曼滤波器的predict()
函数进行预测后会加一,在track
与检测结果匹配成功并更新状态后则会被清零。如果这个值大于预设的阈值
A
m
a
x
A_{max}
Amax,那么就认为目标已经消失,这个track
会被删除。
如果当前帧的检测结果detection
未能与任何已存在的track
匹配成功,那么就为其创建一个新的track
。这个新的track
在被创建后的三帧内都处于未确定状态,在此期间如果每帧都有检测结果与之匹配成功才会把它的状态转为确定态,否则将会被删除。
track
的状态转移过程如下图所示:
匹配问题
运动信息度量
为了将运动信息运用到匹配问题中,作者采用马氏距离(Mahalanobis distance
)来度量卡尔曼滤波器预测的状态与新到达的测量值之间的匹配程度:
d ( 1 ) ( i , j ) = ( d j − y i ) T S i − 1 ( d j − y i ) d^{(1)}(i,j)=(\mathbf{d}_{j}-\mathbf{y}_{i})^{T}\mathbf{S}^{-1}_{i}(\mathbf{d}_{j}-\mathbf{y}_{i}) d(1)(i,j)=(dj−yi)TSi−1(dj−yi)
b ( i , j ) ( 1 ) = 1 [ d ( 1 ) ( i , j ) ≤ t ( 1 ) ] b^{(1)}_{(i,j)}=\mathbb{1}[d^{(1)}(i,j) \le t^{(1)}] b(i,j)(1)=1[d(1)(i,j)≤t(1)]
其中
y
i
\mathbf{y}_{i}
yi表示第
i
i
i个track
,
d
j
\mathbf{d}_{j}
dj表示第
j
j
j个detection
,
S
i
−
1
\mathbf{S}^{-1}_{i}
Si−1表示二者的协方差矩阵。
b
(
i
,
j
)
(
1
)
b^{(1)}_{(i,j)}
b(i,j)(1)作为此距离度量的指示器,当马氏距离
d
(
1
)
(
i
,
j
)
d^{(1)}(i,j)
d(1)(i,j)小于等于阈值
t
(
1
)
t^{(1)}
t(1)时被赋值为1
否则置为0
,论文中阈值
t
(
1
)
t^{(1)}
t(1)设置为9.4877
。
当运动的不确定性较低时,马氏距离是一个比较合适的数据关联度量指标。但是,卡尔曼滤波器预测的状态只是在图像空间中对物体位置的粗略估计,尤其是没有考虑相机自身运动会在图像平面中引入快速位移,因此马氏距离不适合作为处理有遮挡情况下的度量指标。为此,作者加入第二个度量指标,即外观信息。
外观信息度量
对于每个检测边界框
d
j
d_{j}
dj,为其计算外观描述子
r
j
r_{j}
rj并且
∥
r
j
∥
=
1
\left \| r_{j} \right \| =1
∥rj∥=1。对于每个track
,则为其保留
L
k
=
100
L_{k}=100
Lk=100个关联的外观描述子
R k = { r k ( i ) } k = 1 L k \mathcal{R_{k}}=\left \{ {r^{(i)}_{k}}\right \} ^{L_{k}}_{k=1} Rk={rk(i)}k=1Lk
把表示第
i
i
i个track
和第
j
j
j个detection
在外观空间的最小余弦距离作为第二个度量指标,定义如下:
d ( 2 ) ( i , j ) = m i n { 1 − r j T r k ( i ) ∣ r k ( i ) ∈ R i } d^{(2)}(i,j)=min\left \{ 1-r^{T}_{j}r^{(i)}_{k} \quad | r^{(i)}_{k} \in \mathcal{R_{i}}\right \} d(2)(i,j)=min{1−rjTrk(i)∣rk(i)∈Ri}
同样的,为该度量指标设置一个二值指示器:
b ( i , j ) ( 2 ) = 1 [ d ( 2 ) ( i , j ) ≤ t ( 2 ) ] b^{(2)}_{(i,j)}=\mathbb{1}[d^{(2)}(i,j) \le t^{(2)}] b(i,j)(2)=1[d(2)(i,j)≤t(2)]
当余弦距离小于等于阈值
t
(
2
)
t^{(2)}
t(2)时,
b
(
i
,
j
)
(
2
)
b^{(2)}_{(i,j)}
b(i,j)(2)被赋值为1
否则置为0
。
综合度量
结合运动信息和外观信息,最终的距离度量指标为马氏距离和余弦距离的加权和:
c ( i , j ) = λ d ( 1 ) ( i , j ) + ( 1 − λ ) d ( 2 ) ( i , j ) c_{(i,j)}=\lambda d^{(1)}(i,j)+(1-\lambda)d^{(2)}(i,j) c(i,j)=λd(1)(i,j)+(1−λ)d(2)(i,j)
每个指标的权重由超参数
λ
\lambda
λ控制,作者在实验中发现在存在相机自身运动的场景中将
λ
\lambda
λ设置为0
会有比较好的结果。这样设置相当于只有外观信息参与计算匹配过程中的代价矩阵,但是这并不表示马氏距离没有用,因为track
和detection
之间的匹配是否有效还需要判断两个度量距离指示器的乘积是否为1
:
b ( i , j ) = ∏ m = 1 2 b ( i , j ) ( m ) b_{(i,j)}=\prod_{m=1}^{2} b^{(m)}_{(i,j)} b(i,j)=m=1∏2b(i,j)(m)
b
(
i
,
j
)
b_{(i,j)}
b(i,j)相当于一个门控信号,只有两个距离都在各自阈值范围内该信号才有效。因此,马氏距离仍然被用于抑制一些不合理的匹配。具体来说,即使track
和detection
因外观相似匹配成功,如果它们的马氏距离大于阈值,这个匹配还是会被认为是无效的。
级联匹配
当一个物体被长时间遮挡,由于没有新的测量值进行校正,卡尔曼滤波器对其位置的预测会越来越不准确,不确定度会越来越大。一般凭直觉会认为,数据关联度量指标应该会增加测量到跟踪(measurement-to-track
)的距离来解释这种概率质量的扩散。但是与这种直觉相反的是,当两个track
竞争同一个detection
时,马氏距离会更有利于匹配具有更大不确定性的track
(这里为什么会这样我看了原文的解释也没看懂)。因此,作者引入了一个级联匹配操作,在数据关联中优先考虑出现更频繁的目标。级联匹配的伪代码如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5PuJTU7L-1680163682745)(pic/deep_sort_cascade_matching.png)]
对于处于未确定状态track
和未匹配成功且time_since_update=1
的track
,还会对它们进行一次与SORT
中一样的基于IOU
的匹配,这有助于解决由于外观特征突然有大的改变而导致匹配失败的情况,从而增强算法的鲁棒性。
DeepSORT
的算法流程大致如下:
外观特征提取
为了提取行人目标的外观特征,作者设计了一个CNN
模型并在一个大规模的行人重识别数据集上进行离线训练,训练好的模型被用于在线跟踪时提取目标的外观特征。这个CNN
网络包含2
个卷积层和6
个残差网络块,输出一个128
维的向量用来表示目标的外观特征,具体结构如下:
最后,需要对该网络输出的128
维向量使用了L2
归一化来将特征映射到单位超球面上,以便计算余弦距离来度量相似度。
总结
DeepSORT
在SORT
的基础上进行了扩展,采用物体的外观信息作为匹配时的距离度量,并在跟踪流程中加入级联匹配方法,大大提升了算法的鲁棒性。