文章地址:https://arxiv.org/abs/1809.04427
代码:https://github.com/longcw/MOTDT
0 摘要
在线多目标跟踪是实时视频分析应用中的基本问题。流行的基于检测的追踪框架中的一个主要挑战是如何将不可靠的检测结果与已有的跟踪轨迹相关联。在本文中,我们建议通过从检测和跟踪的输出中收集候选框来处理不可靠的检测结果。生成丰富的候选框的直觉是检测和跟踪可以在不同场景中相互补充。高可信度的检测结果可以防止长期跟踪漂移,并且追踪的预测结果可以处理由遮挡引起的检测噪声。为了实时从大量候选者中找到最佳选择,我们提出了一种基于全卷积神经网络的新颖评分函数,它在整个图像上共享大多数计算。此外,我们采用在大型行人重识别数据集上训练得到的深入学习的外观表示,以提高我们的跟踪器的识别能力。大量实验表明,我们的跟踪器可以在广泛使用的行人跟踪基准测试中实现实时和最先进的性能。
1 简介
在许多视频分析和多媒体应用中,例如视觉监控、运动分析和自动驾驶,跟踪复杂场景中的多个目标是一个具有挑战性的问题。多目标跟踪的目的是估计特定类别对象的轨迹。在这里,我们通过利用行人重新识别来解决行人追踪的问题。
多目标跟踪在过去十年中从对象检测的进步中获益良多。流行的基于检测的跟踪方法在每帧图像上应用检测,并且跨帧关联检测结果以生成目标轨迹。在这样的跟踪框架中,类内遮挡和不可靠检测都是巨大的挑战[1,2]。类内遮挡和目标的相似外观都可能会导致数据关联错误。多个线索的融合,包括运动、形状和目标外观,可以缓解这一问题[3,4]。另一方面,检测结果并不总是可靠的。拥挤场景中的姿势变化和遮挡经常导致检测失败,例如误报、检测确实和检测框定位不精确。一些研究提出以批处理模式处理不可靠的检测[2,5,6]。这些方法通过引入来自未来帧的信息来解决检测噪声。采用整个视频帧或临时窗口中的检测结果并通过解决全局优化问题链接到轨迹。批处理模式下的跟踪是非因果性的,不适用于对时间要求严格的应用场景。与这些论文相比,我们专注于在线多人跟踪问题,仅使用当前和过去的帧。
为了在在线模式下处理不可靠的检测,我们的跟踪框架从每个帧中的检测和追踪轨迹输出中选择最佳候选,如图1所示。在大多数现有的基于检测的追踪方法中,当谈论到数据关联时,与现有轨迹相关联的候选者仅由检测结果组成。严等人[4]提出将跟踪器和目标检测器视为两个独立的身份,并保持它们的结果作为候选者。他们根据手工制作的特征选择候选者,例如颜色直方图、光流和运动特征。生成冗余候选者的直觉是检测和跟踪可以在不同场景中相互补充。一方面,在检测丢失或边界不准确的情况下,来自跟踪器的可靠预测可用于短期关联。另一方面,高置信度的检测结果对于防止轨迹在背景上的长期漂移是必不可少的。如何以统一的方式对检测和轨迹的输出进行评分仍然是一个悬而未决的问题。
最近,深度神经网络,尤其是卷积神经网络(CNN),在计算机视觉和多媒体领域取得了很大进展。在本文中,我们充分利用深度神经网络来解决不可靠的检测和类内的目标遮挡。我们贡献有三点:
- 首先,我们通过将检测和跟踪结果组合为候选者,并基于深度神经网络选择最佳候选者来处理在线跟踪中的不可靠检测。
- 其次,我们提出了一种分层数据关联策略,它利用空间信息和深度学习的行人重识别(ReID)特征。
- 第三,我们展示了我们的跟踪器在广泛使用的行人跟踪基准测试中的实时和最先进的性能。
2 本文方法
2.1 整体思路
在这项工作中,我们通过检测和追踪的输出结果中收集候选框来扩展传统的基于检测的跟踪。我们的框架由两个连续的任务组成,即候选框选择和数据关联。
我们首先使用统一的评分函数来衡量所有候选框。如第2.2节和第2.3节所述,将经过区别训练的目标分类器和精心设计的跟踪评分机制融合在一起,以形成评分函数。随后进行框的非最大值抑制(NMS)。在获得没有冗余的候选框之后,我们使用外观表示和空间信息来将已有轨迹与所有选候选框进行分层关联。我们的外观表示如第3.4节所述,基于行人重识别数据集训练得到。第3.5节详细介绍了分层数据关联。
2.2 实时目标分类
结合检测和追踪的输出将导致过多的候选框。我们的分类器通过使用基于区域的全卷积神经网络(R-FCN)来共享整个图像上的大多数计算[12]。因此,与对重度重叠的候选区域裁剪的图像块进行分类相比更加高效。这两种方法的时间消耗比较可以在图3中找到。
我们的高效分类器如图2所示。给定图像帧,使用具有编码器解码器架构的全卷积神经网络来预测整个图像的得分图。编码器部分是具有实时性能的轻量级卷积主干,并且我们引入具有上采样的解码器部分以增大输出得分图的空间分辨率以用于稍后的分类。通过
x
=
(
x
0
,
y
0
,
w
,
h
)
x =(x_0,y_0,w,h)
x=(x0,y0,w,h)将要分类的每个候选者定义为感兴趣区域(RoI),其中
(
x
0
,
y
0
)
(x_0,y_0)
(x0,y0)表示左上角点,w和h表示该区域的宽度和高度。为了计算效率,我们期望每个RoI的分类概率由共享分数图直接投票。一种直接的投票方法是为图像上的所有点的前景概率,然后计算RoI内点的平均概率。但是,这种简单的策略会丢失目标的空间信息。例如,即使RoI仅覆盖目标的一部分,仍然可以获得高置信度得分。
为了将空间信息显式编码到得分图中,我们采用位置敏感的RoI池化层从 k 2 k^2 k2个位置敏感得分图z中估计分类概率。特别地,我们通过规则网格将RoI分成k×k个区间。每个区间具有相同的尺寸 ⌊ w k × h k ⌋ \lfloor \frac{w}{k}×\frac{h}{k} \rfloor ⌊kw×kh⌋,并且表示目标的特定空间位置。我们从大小为 k 2 k^2 k2的得分图中提取k×k个区域的响应。每个得分图仅对应于一个区间。RoI 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个得分图。
在训练过程中,我们在真实边界框周围随机抽取RoI作为正例,并从背景中获取相同数量的RoI作为反例。通过端到端地训练网络,解码器部分顶部的输出,即 k 2 k^2 k2个得分图,学习对目标的特定空间位置的响应。例如,如果k = 3,我们分别对目标的左上角,顶部中心,右上角,…,右下角得到9个得分图。通过这种方式,RoI池化层对空间位置敏感,并且在不使用学习参数的情况下具有强大的目标分类辨别能力。请注意,所提出的神经网络仅针对候选框的分类进行训练,而不是针对边界框回归进行训练。
2.3 轨迹置信度和评分函数
给定一个新视频帧,我们使用卡尔曼滤波器估计每个现有目标的新位置。这些预测用于处理在由于目标的视觉特性变化和拥挤场景中的遮挡引起的检测失败时的目标位置确定。但它们不适合长期跟踪。如果检测结果长时间没有更新卡尔曼滤波器的参数,则可能会降低卡尔曼滤波器的精度。跟踪置信度旨在使用时间信息来衡量滤波器的准确度。
通过来自连续帧的候选框的时间关联可以生成运动轨迹。我们可以将轨迹分成一组小轨迹,因为轨迹可以在其生命周期中被中断和检索多次。每次从丢失状态检索轨迹时,卡尔曼滤波器将被重新初始化。因此,仅利用最后一个小轨迹的信息来表示大轨迹的置信度。定义
L
d
e
t
L_{det}
Ldet表示一个目标轨迹生成之前关联到该轨迹的检测的次数,
L
t
r
k
L_{trk}
Ltrk表示对一个目标而言最后一次检测框被关联生成轨迹之后的预测的帧数。轨迹的置信度定义为:
我们需要
L
d
e
t
≥
2
L_{det} \geq 2
Ldet≥2(即追踪之前至少有两次检测框关联到了该轨迹)来构建一个相对合理的运动模型。
一个候选框x的得分由分类概率和追踪置信度组合得到:
C
d
e
t
C_{det}
Cdet表示来自检测的候选框,
C
t
r
k
C_{trk}
Ctrk表示来自追踪的候选框。数据关联的候选框最终基于统一得分的NMS进行筛选。定义最大IOU为
τ
n
m
s
\tau_{nms}
τnms,最小分数阈值为
τ
s
\tau_s
τs。
注:个人认为,本部分为本文的亮点,作者的意思是在当前帧中,目标的检测和基于kalman滤波对目标位置的预测结果都不足够可靠,应该选择置信度较大的那个结果,对应如图1所示。对于检测而言,其置信度就是分类模型判断MOT标注的检测块属于前景目标的概率,当然因为MOT的检测结果就是基于检测算法得到的,这些块被预测成前景目标的概率一般也比较大,很接近1。对于追踪而言,一个目标持续采用追踪预测而不是检测结果的时间越长,追踪的置信度越小,所以作者定义了追踪的置信度公式(2),这里是要求这个追踪轨迹生成之前至少有两次和检测结果匹配了的,这样才认为是一个合理的追踪轨迹。公式(2)中,计算追踪置信度的时候, L t r k L_{trk} Ltrk表示持续使用追踪预测的帧数,值越大追踪置信度越小,作者定义了一个对数关系。
2.4 基于行人重识别特征的外观表示
候选框之间的相似度度量是数据关联的关键组件。在相似度评价上,我们认为通过数据驱动方式得到的外观信息比手动设计的特征更加出色。我们采用深度学习模型从RGB图像上提取特征向量,并通过特征向量之间的距离进行相似度度量。
我们利用“Deeply-learned part-aligned representations for person reidentification”论文提出的网络架构结合大规模的行人重识别数据集进行目标的外观表示。这篇论文中使用的网络
H
r
e
i
d
H_{reid}
Hreid由来自于GoogleNet的卷积骨架和K个局部对齐的全连接层组成。对于一个输入图像块
I
I
I,其特征可以表示成
f
=
H
r
e
i
d
(
I
)
f = H_{reid}(I)
f=Hreid(I)。使用两个图像块
I
i
,
I
j
I_i,I_j
Ii,Ij的特征向量的欧式距离作为两者之间的差距
d
i
j
d_{ij}
dij。训练过程中,组成三元组
T
=
{
<
I
i
,
I
j
,
I
k
>
}
T=\{<I_i,I_j,I_k>\}
T={<Ii,Ij,Ik>}进行训练,其中
<
I
i
,
I
j
>
<I_i,I_j>
<Ii,Ij>是来自于同一个人的正样本对,
<
I
j
,
I
k
>
<I_j,I_k>
<Ij,Ik>是来自于不同人的负样本对。给定N个三元组,损失函数的目的是最小化下式:
m
>
0
m > 0
m>0是一个预定义的margin。忽略比较容易区分的三元组,即
d
i
k
−
d
i
j
>
m
d_{ik} - d_{ij} > m
dik−dij>m,从而加强学习到的特征表示的区分能力。
2.5 分层的数据关联
利用轨道的预测来处理在拥挤的场景中发生的检测丢失。受类内遮挡的影响,这些预测可能与其他目标有关。为了避免将其他不需要的目标和背景带入外观表示,我们使用不同的特征将轨道与不同的候选者进行分层关联。
具体来说,首先将检测结果通过外观特征和已有的追踪轨迹进行匹配。然后将未匹配上的检测结果和追踪轨迹根据IOU进行匹配。然后将匹配上的轨迹的外观特征使用最新检测的外观特征进行更新。最后将未匹配到的检测设置为新的追踪目标。整个的最终算法如下图所示:
3 实验
3.1 实验设置
在MOT16数据集上进行算法性能评估。该数据集包含7个训练视频和7个测试视频。使用训练集中的5个视频分析各部分的作用,最终在测试机上测试结果,取得了SOTA的效果。
实现细节:使用SqueezeNet作为R-FCN的骨架网络。在单块1080Ti显卡上,计算大小为1152 * 640的输入图像的得分图(经过squeezeNet和解码模块)的耗时仅为8ms。位置敏感得分图的k为7,使用RMSProp训练,学习率1e-4,batchsize 32,20k次迭代。在剩下的两个训练集视频和coco数据集上训练行人检测模型。 τ n m s = 0.3 , τ s = 0.4 \tau_{nms} = 0.3,\tau_s = 0.4 τnms=0.3,τs=0.4用于候选框筛选。使用三个数据集(Market1501,CUHK01和CUHK03)的结合训练行人重识别模型。数据关联时 τ d = 0.4 , τ i o u = 0.3 \tau_d = 0.4,\tau_{iou} = 0.3 τd=0.4,τiou=0.3。下面的实验都是基于这样的超参数。
评价标准:使用了多目标追踪准确率(MOTA)、每帧误报数(FAF)、大部分持续追踪的目标数量(MT,>80%覆盖率)、大部分丢失的目标数(ML,<20%覆盖率)、假正例(FP)、假反例(FN)、ID切换(IDS)、识别查全率(IDR)、识别的F1(IDF1)、处理速度(FPS)。
3.2 在验证集上分析结果
每一个部件的作用:Baseline使用Kalman滤波预测追踪的位置,使用IOU进行检测和轨迹的关联。
不同外观特征对结果的影响:
3.3 在测试集上的结果
耗时测试:
和其他算法对比:
4 代码分析
代码执行流程如下:
-
定义追踪器tracker = OnlineTracker(),在构造函数中设定了分类的最小分数阈值0.4,最小外观特征距离0.64,判定目标丢失的最大帧数30,使用kailamn滤波进行目标未来位置预测,加载了用于图像块属于前景/背景的分类器和用于行人目标表观特征提取的ReID模型,对于一路视频,记录三种追踪对象,分别是已经在追踪的目标、暂时丢失的目标和已经移除的追踪目标。
-
对于用于测试的各MOT视频队列,读取各视频帧图像和该帧标注的目标位置信息(忽略了标注的目标score,因为后面要使用分类模型进行重新判定)进行目标的追踪信息更新,具体的实现函数是mot_track.py中的update函数,该函数是追踪的核心实现,下面的流程都包含在本函数内,且都以单视频帧为处理目标。
2.1. 对本路视频已有的追踪目标在当前帧的位置使用kalman滤波器进行预测;
2.2 对每一个MOT标注的检测框,假设其检测置信度为1,结合其位置信息构造成一个STrack对象,表示其为一个潜在的追踪对象,记录了目标的位置、置信度、基于检测结果构造而成(from_det = True)。该帧的所有基于检测构造的STrack对象记录在名为detections的列表中;
2.3 基于图像分类器进行图像更新,对应于self.classifier.update(image),所谓更新就是使用分类器模型对图像进行前向运算,提取出图像的特征。
2.4 对于已经存在的和暂时丢失的追踪对象,如果对象对象处于被激活的状态,则根据2.3节的公式(2)计算追踪目标的score值( α \alpha α=0.05),结合目标的位置构造STrack对象,标记这些对象是通过追踪构造的(from_det = False),构造的临时追踪对象记录到tracks列表中,并合并到detections列表中,这样detections列表中前面部分表示对本视频帧中检测到的目标,后面表示追踪预测的目标位置;
2.5 对detections中的所有目标进行分类,其实现是对2.3步骤提取的图像特征图应用Roi池化层得到各roi框对应的特征,然后应用平均池化和sigmoid操作得到各roi属于前景目标的概率,将计算得到的概率替换掉detections中对各检测目标的初始为1的score值;
2.6 现在detections中包含了检测和追踪的所有目标位置和score值,有可能对某个目标各存在一个检测和追踪的结果,那么就需要按照图1所示的思想保留置信度较大的那个结果。实现思路是对整个detections应用nms操作,这样率属于同一个目标的检测框和追踪预测框因为其IOU较大,自然也就只保留了置信度较高的那个。最后将保留下来的结果来自于检测的保存到了detections队列中,来自于追踪的保留到了pred_dets队列中;
2.7 对detections中的图像块使用ReID模型提取目标表观特征,存储到对应的STrack的特征队列中;
2.8 下面要开始进行追踪轨迹的关联匹配的操作:
首先对于该路视频已在追踪的目标,按照是否已激活进行区分,计算已激活的追踪和最近检测结果的目标表观特征之间的欧式距离矩阵,然后使用线性指派将已激活的追踪和最新检测结果进行匹配,对于匹配上了的追踪检测对,则使用最新检测结果更新已追踪的目标的属性,更新内容包括设置目标time_since_update = 0,time_by_tracking = 0,tracklet_len += 1,使用最新检测结果和预测结果得到最优位置信息,标记该追踪目标是被激活的状态,更新目标得分和表观特征;
对于上面匹配过程中没有匹配到的检测目标,有可能是该路视频暂时丢失的追踪目标又被重新检测到了,所以把这些没有匹配的检测和暂时丢失的追踪目标进行匹配,还是计算外观特征的欧式距离矩阵,使用线性指派进行匹配,对于匹配上的结果,表示暂时丢失的追踪目标又被重新找回来了,这样就需要重新激活暂时丢失的追踪目标(设置time_since_update = 0,time_by_tracking = 0,tracklet_len = 0,is_activated = True,复用原有的目标ID,更新表观特征),并将其暂存到refind_stracks队列;
对于经过上述两个步骤还没有被匹配到的检测目标,将其和pred_dets合并,将合并结果和2.8第一步中未匹配到的追踪按照IOU进行指派,目的是将未匹配到的检测和已有的追踪和通过表观特征未匹配的追踪按照IOU进行匹配,匹配上之后同样进行信息更新(time_since_update = 0,来自于检测则设置time_by_tracking = 0,来自于追踪则设置time_by_tracking += 1,tracklet_len += 1,结合检测和追踪预测得到最优位置,更新得分和表观特征),对于还未被匹配的追踪,可能该追踪目标已经是丢失状态了,将其记录到lost_tracks;
将根据IOU匹配未匹配上的检测和未激活的追踪按照IOU进行匹配,匹配上了更新追踪为已激活状态,更新位置和表观特征信息,对于未匹配上的未激活追踪,表示这些追踪目标已消失,将其放入removed_stracks;
对于当下还未匹配的检测,可表示出现了新的目标,将其设置为未激活的追踪目标;
对于处于暂时丢失状态的追踪对象,如果当前帧和目标被追踪的最后时刻的帧差大于了30,则确认这些目标已消失,将其记录到removed_stracks队列中;
最后,将确认的追踪、重新找回来的追踪和暂时未激活的追踪都记录到tracked_stracks中,也分别记录暂时丢失的追踪对象和已经被移除的追踪对象,最后将tracked_stracks中已经被激活的追踪对象和暂时丢失的追踪对象中目标score大于0.3且消失时间不超过4帧的追踪目标一块返回。至此,对单帧图像的更新结束。
-
2.9 得到单帧图像的追踪结果后,可以进行目标的显示操作和追踪结果记录用于最后的性能评估。
个人认为,本文和Deepsort的思想很接近,亮点就是2.3节对检测和追踪进行分别评分,按照分值较大的原则进行选取。工程中的确也发现了检测结果不理想(框大了或者小了)之后对追踪造成了负面影响,后面项目中借鉴下作者这里的思想,看下能否改善工程应用效果。