最近MOT的新文章不是特别多,正好趁此机会来回顾一些比较经典的文章,以弥补那些年为了赶调研进度没能精读而错过的一些方法。本文就是逛知乎的时候看到的文章,我就去读了一下这篇2018年的论文,虽然和今天那些动辄MOTA达到60、70的SOTA相比已经是距离挺远的了,但是其中的思路还是对后来研究者有不少启发的。
简介
MOTDT是清华大学TNList实验室发表的收录于ICME2018的一篇文章,作者基于TBD范式提出从检测结果和跟踪结果中收集候选框从而解决检测不可靠的问题,这种产生冗余候选框的思路来源于检测和跟踪可以在不同场景下信息互补。高质量的检测可以阻止长期跟踪产生的轨迹偏移,轨迹的预测又可以防范由于遮挡造成的噪声检测。为了实时从大量候选框中进行最优选择,我们提出了一种基于全卷积神经网络的新的评分函数,该函数共享了整个图像的大部分计算。此外,外观的表示学习采用一个深度神经网络在三个大规模行人重识别数据集上训练得到。实验表明,由检测、外观特征提取、分层数据关联构成的这个多目标跟踪框架MOTDT达到实时SOTA表现。
-
论文标题
Real-time Multiple People Tracking with Deeply Learned Candidate Selection and Person Re-Identification
-
论文地址
http://arxiv.org/abs/1809.04427
-
论文源码
https://github.com/longcw/MOTDT
介绍
众所周知,多目标跟踪(Multiple Object Tracking,MOT)的任务要求是估计同类多个目标的轨迹,如今我们解决跟踪问题(帧间关联)大多依赖行人重识别技术。不过,在TBD(Tracking-by-Detection)范式的基础下,检测任务过去数年的发展为MOT带来了新的活力,因此现在的跟踪器大多采用的思路是先通过检测器在每一帧上得到检测框,然后根据某个度量标准(如外观相似度)来将帧间的目标关联到一起从而形成轨迹。
同类目标的遮挡和不可靠的检测是目前MOT的主要挑战。同类目标的遮挡和目标之间相似的外观都会造成帧间数据关联时的歧义混淆,很多工作发现通过同时考虑目标的运动、几何和外观特征可以缓解这个问题,这也是目前主流的解决方案。另一方面,检测器得到的检测结果有可能也是不可靠的,密集场景下姿态的变化和人与人之间的遮挡经常造成错误的检测如误检、漏检、边界框不准确等。前人针对这个问题提出了离线方法(也叫batch模式),这种方法可以引入未来帧的信息,具体是通过一个固定大小的滑窗或者整个视频上进行轨迹的关联,将其转换为batch内的全局优化问题。不过,很遗憾,这种策略是没法在实时性要求的场景下实现的,但这种实时视频流跟踪往往又是MOT最主流的攻坚领域。
论文在online模式下设计了一种解决不可靠检测的框架,该框架如上图所示,它从每帧的检测框和跟踪框输出中选择最优的候选框。现有的TBD方法在数据关联时,与现有轨迹关联的候选框仅有检测结果构成,但有前人发现应该将跟踪器和检测器看作两个互相独立的部件,并将其结果均作为候选框,这也是本文的出发点。 因为这两个任务是可以互补的。一方面,跟踪器可靠预测出来的跟踪框可以用来短时进行数据关联以防漏检和不准确的边界框检测;另一方面,高置信度的检测框对于放置长期跟踪时轨迹偏移向背景也是至关重要的。 不过,我这里个人觉得其实检测框和跟踪框相比,后者是天然弱势的,因为跟踪框本质上还是源于检测框,比较是tracking-by-detection。
不过前人选择候选框的方式是基于手工特征的,如颜色直方图、光流和运动特征。所谓选择候选框,其实就是为冗余的候选框打分,如何设计一个统一的方式来为检测框和跟踪框打分还是一个需要研究的问题。考虑到CNN的发展,作者引入深度神经网络来解决不可靠检测和同类目标遮挡问题。首先,引入深度神经网络来完成候选框的打分;第二,提出分层数据关联策略,充分利用空间信息和外观信息(ReID特征);最后,实验表明,作者提出的MOT框架MOTDT可以实现实时跟踪下的SOTA结果。
MOTDT
在这篇论文中,作者通过从检测框和跟踪框的输出中生成候选框的方式拓展了TBD跟踪框架,该框架包含两个序列任务:候选框选择和数据关联。
首先,评估所有的候选框采用一个统一的评分函数,这个函数由一个判别训练的目标分类器和一个精心设计的轨迹段置信度计算模块构成。随后,NMS用来基于候选框的评分进行冗余候选框消除。最后,在消除冗余的候选框的基础上,使用外观表示和空间信息来分层关联候选框和已有轨迹。
目标分类器
组合预测框和检测框构建的候选框数目不少,所以作者这里采用R-FCN(基于区域的全卷积网络)来构建目标分类器,该结构在整个图像上共享大多数计算。因此它比那些在图像块上进行分类的结构高效得多。
这个网络结构如下图所示,给定一帧图像,得分图(图上的score maps)通过全卷积得到。每个候选框都可以定义为一个感兴趣区域(RoI) x = ( x 0 , y 0 , w , h ) \mathbf{x}=\left(x_{0}, y_{0}, w, h\right) x=(x0,y0,w,h),其中 ( x 0 , y 0 ) (x_0, y_0) (x0,y0)表示左上角点坐标, w w w和 h h h表示区域的宽高。为了计算的高效,我们希望每个RoI的分类概率可以通过共享的score maps投票得到。有个直接的策略就是从图像上所有像素点的概率值上跳出RoI范围内的,然后求平均就得到了RoI的前景概率。然而这个简单的策略其实放弃了空间信息,例如,即使RoI只覆盖对象的一部分,仍然可以获得较高的置信度。
为了显式地将空间信息编码进score maps中,作者采用了位置敏感的RoI pooling层处理score maps并从最终得到的 2 ^2 2个位置敏感的score maps z \mathbf{z} z中估计目标的分类概率。具体来说,将一个RoI区以网格的方式划分为 k × k k \times k k×k个bins,每个bin的尺寸为 ( w k , h k ) (\frac{w}{k}, \frac{h}{k}) (kw,kh),表示目标的一个特定位置。然后,从 k 2 k^2 k2的score maps上提取 k × k k \times k k×k个bins的结果,每个score map只对应一个bin。最终一个RoI区域 x \mathbf{x} x的最终分类置信度计算式如下,其中 σ ( x ) = 1 1 + e − x \sigma(x)=\frac{1}{1+e^{-x}} σ(x)=1+e−x1表示sigmoid函数,而 z i z_i zi表示第 i i i个score map。
p ( y ∣ z , x ) = σ ( 1 w h ∑ i = 1 k 2 ∑ ( x , y ) ∈ b i n i z i ( x , y ) ) p(y \mid \mathbf{z}, \mathbf{x})=\sigma\left(\frac{1}{w h} \sum_{i=1}^{k^{2}} \sum_{(x, y) \in b i n_{i}} \mathbf{z}_{i}(x, y)\right) p(y∣z,x)=σ⎝⎛wh1i=1∑k2(x,y)∈bini∑zi(x,y)⎠⎞
在训练过程中,我们在GT框周围随机抽取RoI作为正样本,并从背景中抽取相同数量的RoI作为负样本。通过对网络进行端到端的训练,解码器部分的顶部输出,即 k 2 ^k2 k2的score maps,会学会对物体的特定空间位置做出反应。举例而言,如果 k = 3 k=3 k=3那么就会有 9 9 9个score maps对应左上角到右下角9个位置。按照这个策略,RoI pooling层对位置敏感且具有判别性目标分类能力,而不需要可学习参数。上图这个网络就是用于候选框分类的,无法进行边框回归。
轨迹段置信度计算模块和评分函数
对于当前帧,用卡尔曼滤波来估计现有轨迹在该帧上的位置,可以一定程度上解决遮挡等造成的错误检测,但是卡尔曼滤波并不适用于长期跟踪,因为长时间不使用检测来更新卡尔曼滤波器的话,它的准确率会大大下降。因此,设计了轨迹段置信度计算模块来评估使用时序信息的卡尔曼滤波器的准确率。
一个轨迹段是连续帧上候选框关联形成的,可以将一个目标的完整轨迹拆分为多个轨迹段,因为一个轨迹可以在其生命周期内多次中断和恢复。每次一个轨迹从丢失状态恢复的时候,卡尔曼滤波器会被重新初始化。因此,仅仅需要使用最后的轨迹段的信息来进行轨迹段置信度计算。这里不妨定义 L d e t L_{det} Ldet为关联到这个轨迹段上的检测框数目, L t r k L_{trk} Ltrk为在这个轨迹段上,最后一个detection被关联后来自轨迹预测框的数目,继而定义下面的轨迹段置信度计算公式。
s t r k = max ( 1 − log ( 1 + α ⋅ L t r k ) , 0 ) ⋅ 1 ( L d e t ≥ 2 ) s_{t r k}=\max \left(1-\log \left(1+\alpha \cdot L_{t r k}\right), 0\right) \cdot \mathbb{1}\left(L_{d e t} \geq 2\right) strk=max(1−log(1+α⋅Ltrk),0)⋅1(Ldet≥2)
上式中, 1 ( ⋅ ) \mathbb{1}(\cdot) 1(⋅)是指示函数,输入为真得1,否则得0。要求 L d e t ≥ 2 L_{det} \geq 2 Ldet≥2来在这个轨迹作为候选框之前构建合理的使用观测到的检测框运动模型。
融合上面的目标分类器得到的分类置信度和轨迹段置信度计算模块得到的置信度,构建统一的打分函数(scoring function)如下,其中 C d e t C_{det} Cdet表示来自检测框的候选框, C t r k C_{trk} Ctrk表示来自跟踪框的候选框, s t r k s_{trk} strk取值在 ( 0 , 1 ) (0,1) (0,1)之间来惩罚来自不确定轨迹的候选框。
s = p ( y ∣ z , x ) ⋅ ( 1 ( x ∈ C det ) ) + s trk 1 ( x ∈ C trk ) ) \left.s=p(y \mid \mathbf{z}, \mathbf{x}) \cdot\left(\mathbb{1}\left(\mathbf{x} \in C_{\text {det }}\right)\right)+s_{\text {trk }} \mathbb{1}\left(\mathbf{x} \in C_{\text {trk }}\right)\right) s=p(y∣z,x)⋅(1(x∈Cdet ))+strk 1(x∈Ctrk ))
通过上面的打分函数得到的分数送入NMS算法进行候选框选择,定义 T n m s \mathcal{T}_{n m s} Tnms为IOU阈值,定义 T s \mathcal{T}_{s} Ts为置信度阈值。
外观表示
候选框间的相似度计算是数据关联的关键,实验表明以数据驱动的深度学习外观表示模型超过了手工设计的方法,所以作者这里采用行人重识别领域的一个网络Deeply-learned part-aligned representations for person reidentification用于外观特征的学习,在三个常用的ReID数据集上进行训练,具体细节可以参考原文,这里记这个网络为 H r e i d H_{reid} Hreid。给定一个行人的RGB图像 I \mathbf{I} I,其外观特征向量为 f = H reid ( I ) f=H_{\text {reid }}(\mathbf{I}) f=Hreid (I),文中使用特征向量之间的欧氏距离来评估两个行人图像 I i \mathbf{I}_{i} Ii和 I j \mathbf{I}_{j} Ij之间的相似度。训练时,网络采用三元组损失进行训练,这属于ReID的内容,这里不更细展开了。
分层数据关联
人群密集时轨迹预测可以一定程度上缓解漏检的问题,但是受到同类目标遮挡的影响,这些预测框也可能包含其他目标。为了避免将其他不需要的对象和背景带入外观表示,我们使用不同的特征分层地将轨迹与不同的候选框相关联。
具体而言,首先对来自检测的候选框进行基于外观表示的数据关联,最大相似度阈值定义为 T d \mathcal{T}_{d} Td。接着,对剩下的候选框和未被关联的轨迹基于IOU进行关联,阈值为 T i o u \mathcal{T}_{iou} Tiou。只有当轨迹关联上检测框的时候才会更新外观表示。最后,在剩下的检测框的基础上初始化新的轨迹。整个算法如下图所示。
利用分层数据关联,我们只需要从每帧检测中提取一次候选框的ReID特征。结合之前的高效评分函数和轨迹段置信度计算,MOTDT框架可以以实时速度运行。
实验
作者首先进行消融实验对比了各个组件的效果,结果如下表,其中C表示目标分类器,T表示轨迹段置信度计算,A表示外观特征,实验表明每个部分都很重要。
然后对比了一下ReID模型和手工特征效果,虽然深度模型是好一些,但没有我想象中好那么多,可能那时候ReID还没有特别成熟吧。
最后在MOT16上和当前SOTA进行对比,精度速度都很快。
总结
这篇论文中作者提出了一种新的TBD多目标跟踪框架MOTDT,充分利用了深度神经网络的强大,通过从检测框和跟踪框*同生成候选框来解决检测不可靠的问题,为此设计了多个高效的模块,在主流的benchmark上达到当时的SOTA。