前言: 跟踪问题相比检测问题来说,除了当前帧检测出来的目标之外,跟踪问题如何能够利用上之前的检测来对当前帧不可见的目标(由于遮挡导致无法检测到目标)来进行预测呢?通过引入recurrent memory module的方式。仔细地读了一遍这篇文章,感觉还需要结合代码才能理解这篇文章,实现上相对来说还是比较复杂的.
论文:https://arxiv.org/abs/2103.14258
代码:https://github.com/TRI-ML/permatrack
研究背景
online multi-object tracking 中dominant方法就是Tracking-by-detection,并且alternates between localization以及association steps(这里不是很理解,关联部分的源码理论上了解还不足)。Tracking-by-detection的方式在很大程度上依赖瞬时观测的质量,当物体不是完全可见时,会出现失效的情况。相比于人类的跟踪,一旦物体被识别,我们就会意识到它的物理存在,即使在完全遮挡下也能大致定位它。目前tracking-by-detection的方式还是无法解决完全遮挡情况的预测问题。
更加详细的说明是:目前tracking-by-detection的做法是利用detector检测目标的location,然后再将location和之前的trajectories(轨迹)链接到一起,一旦detector无法检测到目标,就会造成轨迹的fragment,即使是对目前ByteTrack(写这篇博客的时间MOT17的SOTA)来说,同样也无法解决超过30(可以设定)帧未检测到的目标,30帧之内的目标主要可以通过appearance feature来和轨迹关联起来。从根本原因上来看是遮挡造成了locations出现丢失,即文中提出的localization step is completely independent from the previous history.
本文方法:
本文中引入了联合目标检测和跟踪的端到端可训练方法,在CenterTrack框架上,输入是pairs of frame,同时扩展到任意长度的视频中。
此外增加了一个spatio-temporal, recurrent memory module,能够利用之前历史推理当前帧目标的位置以及identity,是在线方式。
对于如何训练这个模型,首先构建了一个大规模的合成数据集(为不可见目标提供了标注),并提出了在遮挡情况下监督tracking的几种方式。最后在合成和真实数据上联合训练。
本文贡献
实验结果:
在KITTI以及MOT17上取得了outperform the state of the art的结果。Tesla V100 GPU速度10FPS
本文针对long range 遮挡问题,在CenterTrack的基础上引入spatial-temporal module来对完全遮挡的目标进行预测,保持trajectory的连贯性,从而提升模型的检测性能。
就本文提到的tracking-by-detection工作中。博主大概归纳成两个思路:
- 一种是基于detection之后,改进data association的工作(主要集中在计算关联相似性的特征上(motion,appearance feature,trajectory feature,human pose feature),匹配上应该是使用的匈牙利匹配,除此之外,还有一些data association流程上的改进,比如ByteTrack的二次关联方法。
- 另外一种就是在Siamese架构上(pairs input)上的一些工作,这些主要是考虑到tracking任务本身就是基于视频的一个spatial-temporal任务,如何构建detections在时间上的连续性(这部分的工作了解不多,不知道这些方法在inference以及指标上的效果,主要是不太清楚引入比如说本文的ConvGRU是否能够保证实时的运行效率,或者说针对location预测的问题(序列预测),相比于传统的线性估计器,ConvGRU又能带来多大的提升呢?)
问题:
- 这种两种方式的性能差异(指标+FPS)到底有多大?
博主认为趋势上肯定是要向着序列问题发展,之前实验过FariMOT(标准的第一种方式),在训练过程中实际上不需要考虑frame之间的时序关系,也就相当于最终网络没法学习时序信息,单纯依靠iou+网络学习到的差异化appearance+线性估计器(kalman)来进行关联- 实际上基于我们增加时序信息的目的是当前的detections中考虑先前的detection结果,假定我们的detector无限好,则对于不考虑时序问题的模型会出现trajectory break的问题(就当前的数据关联算法来看是没法解决long range遮挡的问题的)。当前博主的思路主要有两个:修改数据关联的方式,第二个可能就是从下图中也可以看出来的对于long range遮挡处理较好的本文中的方法
这种检测情况都能检测出来,属实离谱(话说每次看论文都觉得离谱,爽啊,哈哈哈),博主觉得这种考虑时序的问题,主要是解决fragmented trajectory的问题,也就是轨迹线的变化问题,然而实际上我们并不需要检测出完全遮挡住的目标,我们只需要保证long range完全遮挡前后能够保持相同的id即可,也就能够指标上的目的。实际在online的tracking中,通过给出完全遮挡的边界框来维持kalman估计器有效,能够减少丢失轨迹 T l o s t \mathcal{T_{lost}} Tlost的数量。
输入:a pairs of frames { I t − 1 , I t } \{I^{t-1},I^t\} {It−1,It}以及 t − 1 t-1 t−1时刻的locations编码 H t − 1 H^{t-1} Ht−1,locations编码是上一个时刻detected objects对应的heatmap。通过concatenate方式连接在一起。
骨干网络: f f f,输入经过骨干网络后得到特征图 F t = f ( H t − 1 , I t − 1 , I t ) F^{t}=f\left(H^{t-1}, I^{t-1}, I^{t}\right) Ft=f(Ht−1,It−1,It)
预测head:
- 当前帧的目标中心 { p ^ 0 t , p ^ 1 t , … } \left\{\hat{\mathbf{p}}_{0}^{t}, \hat{\mathbf{p}}_{1}^{t}, \ldots\right\} {p^0t,p^1t,…}
- 边界框的size: { s ^ 0 t , s ^ 1 t , … } \left\{\hat{s}_{0}^{t}, \hat{s}_{1}^{t}, \ldots\right\} {s^0t,s^1t,…}
- 相对于上一帧的偏移: { d ^ 0 t , d ^ 1 t , … } \left\{\hat{\mathbf{d}}_{0}^{t}, \hat{\mathbf{d}}_{1}^{t}, \ldots\right\} {d^0t,d^1t,…}
预测阶段,首先根据当前的预测以及相对于上一帧的偏移确定上一帧的位置得到上一帧的中心点位置 p ^ i t − d ^ i t \hat{\mathbf{p}}_{i}^{t}-\hat{\mathbf{d}}_{i}^{t} p^it−d^it,基于这个位置找到 t − 1 t-1 t−1时刻最接近的那个中心点 p ^ ∗ t − 1 \hat{\mathbf{p}}_{*}^{t-1} p^∗t−1,也就相当于将中心点关联上了。
本文中进一步指出当前CenterTrack中存在的问题是:仅考虑一对frame简化了模型的体系结构,但限制了模型的表现能力。
输入frames为 { I 1 , I 2 , … , I n } \left\{I^{1}, I^{2}, \ldots, I^{n}\right\} {I1,I2,…,In},然后每一帧单独的通过骨干网络 f f f得到 { F 1 , F 2 , … , F n } \left\{F^{1}, F^{2}, \ldots, F^{n}\right\} {F1,F2,…,Fn}
为了学习a permanent representations of objects in a video,引入ConvGRU
ConvGRU是classical GRU的扩展,将1维的状态vector使用2Dfeature map M M M进行替换,并将用于计算状态更新的全连接层替换成卷积
在 t t t时刻时,将 F t F^t Ft传递给ConvGRU,同时结合之前的状态 M t − 1 M^{t-1} Mt−1来计算新的状态 M t = G R U ( M t − 1 , F t ) M^{t} = GRU(M^{t-1},F^t) Mt=GRU(Mt−1,Ft),这个状态 M t M^t Mt表示之前所有帧 { 1 , … , t − 1 } \{1, \ldots, t-1\} {1,…,t−1}看到的目标 { o 1 , o 2 , … } \left\{o_{1}, o_{2}, \ldots\right\} {o1,o2,…},在经过 t t t时刻可见目标的编码以及一些可学习参数之后。通过ConvGRU建模了输入视频中对象的时空evolution,相当于将特征融合起来,对视频构建了时空特征,博主任务这种构造方式不仅仅局限于当前目标跟踪的任务,在其他基于视频的任务中同样也能够起到作用。
通过ConvGRU得到融合了先前位置信息以及特征信息,得到时空特征 M t M^t Mt,基于 M t M^t Mt得到预测 f p , f o f f , f s , f d f_{\mathbf{p}}, f_{o f f}, f_{s}, f_{\mathbf{d}} fp,foff,fs,fd进而得到目标的bounding boxes,并将bounding boxes链接到轨迹上。除此之外,还有一个新的headvisibility head f v f_v fv,输出为边界框是否可见的特征图 V t V^t Vt,此外,还有一个 P t P^t Pt
这里 V t V^t Vt和 P t P^t Pt的主要区别为是否对不可见的目标生成一个高斯分布, P t P^t Pt同时为不可见的目标生成了一个高斯分布,而在 V t V^t Vt中不可见目标则没有生成heatmap,最终的预测时间上是输入不可见目标的,也就是在 V t V^t Vt上确定最终的输出目标, P t P^t Pt主要用来对出现遮挡的目标进行训练,在评估的时候,对于遮挡情况是没有提供gt labels的。因此,验证阶段不输出完全遮挡的目标,这种做法的优势在于能够尽可能地保持id在从遮挡情况中恢复出来的一致性,从而提升跟踪性能。
损失函数为:
L = 1 N ∑ t = 1 N L p t + L v t + λ o f f L o f f t + λ s L s t + λ d L d t L=\frac{1}{N} \sum_{t=1}^{N} L_{\mathbf{p}}^{t}+L_{\mathbf{v}}^{t}+\lambda_{o f f} L_{o f f}^{t}+\lambda_{s} L_{s}^{t}+\lambda_{\mathrm{d}} L_{\mathbf{d}}^{t} L=N1t=1∑NLpt+Lvt+λoffLofft+λsLst+λdLdt
其中 N N N表示输入序列的长度, λ o f f , λ s , λ d \lambda_{o f f}, \lambda_{s}, \lambda_{\mathbf{d}} λoff,λs,λd用于调整不同损失之间的差异
这里需要解决两个问题,首先第一个问题就是假设 P t P^t Pt将所有遮挡的object也看成是正样本(即,对应着生成一个高斯分布),那么对于一直处于相机盲区(完全处于遮挡情况下)的目标,通过网络学习会出现目标没出现之前就会猜测一个轨迹出来,这个猜测有些类似无中生有,从直观上讲不合理。第二个问题就是一开始观测到一个目标之后,在t时刻出现遮挡,然而在遮挡过程中目标出现了停顿,不符合人类和神经网络对于遮挡目标的假设:遮挡目标会保持恒定的速度,并且对于运动相机来说,这种问题就更没法解决了。
符号表示
N N N:输入视频序列长度, { O 1 , O 2 , … , O N } \left\{O^{1}, O^{2}, \ldots, O^{N}\right\} {O1,O2,…,ON}:对应的object annotations, O t = { o 1 t , o 2 t , … , o m t } O^{t}=\left\{o_{1}^{t}, o_{2}^{t}, \ldots, o_{m}^{t}\right\} Ot={o1t,o2t,…,omt}:t时刻所有的边界框信息, o i t = ( p , s , i d , v i s ) o_i^t= (\mathbf{p}, \mathbf{s}, i d, v i s) oit=(p,s,id,vis):t时刻第i个边界框的表示, p \mathbf{p} p:边界框的中心点, s \mathbf{s} s:边界框的size, i d id id:边界框的id, v i s vis vis:边界框的可见程度, v i s ∈ [ 0 , 1 ] vis \in[0,1] vis∈[0,1].这个可见程度是0~1区间的数值,不知道是怎么确定这个数值大小的
本文首先确定解决第一个问题的方法:
增加预处理,在 t = 0 t=0 t=0时刻假定所有的目标(包括可见和完全遮挡)都是不可见的,接着当接连出现两次可见状态时,我们认定该目标是可见的,这种处理方式能够将完全遮挡的目标去除掉。
关于接连出现两次可见状态的方式为:
定义两个阈值 T v i s T_{vis} Tvis, T o c c l T_{o c c l} Toccl.从第一帧开始,对于第i个边界框 o i 1 o_{i}^{1} oi1
- 当 v i s i 1 < T v i s v i s_{i}^{1}
visi1<Tvis 时,将 o i 1 o_{i}^{1} oi1看成是negative样本。负样本博主的理解是在focal loss计算损失时,看成是背景,对应负样本,并计算损失- 当 T vis < v i s i 1 < T occl T_{\text {vis }}
Tvis <visi1<Toccl 时,这些样本点被忽略.负样本博主的理解是在focal loss计算损失时,既不是正样本点,也不是负样本点,不参与损失的计算当中- 当连续两次出现 v i s i 1 > T o c c l v i s_{i}^{1}>T_{o c c l} visi1>Toccl,将 o i 1 o_{i}^{1} oi1看成是positive样本,也就是在 P t P^t Pt中给 o i 1 o_{i}^{1} oi1生成一个高斯heatmap,并一直持续下u去
这里再多说明一下,从理解上来讲,只要是出现连续两次 v i s i 1 > T o c c l v i s_{i}^{1}>T_{o c c l} visi1>Toccl都将其看成是正样本,并且一直都是.
第二个问题的解决办法
propagating the last observed object location with its constant velocity in the camera frame is also the state of the art approach for handling occupations in MOT.基于这句话,作者认为应该按照人类或者神经网络的普通思路,遮挡目标保持恒定的速度.因此利用遮挡前的目标的速度和位置在3D空间中计算下一个帧的位置,并投影到图像坐标系下。对于真实数据集是根本无法实现的,但是通过仿真平台可以实现这个工作。
具体的计算方式为,在t时刻出现遮挡,确定目标在遮挡前的世界坐标系下的两个坐标 P i t − 1 , P i t − 2 ∈ R 3 \mathbf{P}_{i}^{t-1}, \mathbf{P}_{i}^{t-2} \in \mathbb{R}^{3} Pit−1,Pit−2∈R3,根据这个坐标计算出速度向量 V i = P i t − 1 − P i t − 2 \mathbf{V}_{i}=\mathbf{P}_{i}^{t-1}-\mathbf{P}_{i}^{t-2} Vi=Pit−1−Pit−2,基于速度向量得到下一帧的位置 P ~ i t = P i t − 1 + V i \tilde{\mathbf{P}}_{i}^{t}=\mathbf{P}_{i}^{t-1}+\mathbf{V}_{i} P~it=Pit−1+Vi,通过投影变换到相机坐标系中的位置 p ~ i t = K [ R ∣ t ] P ~ i t \tilde{\mathbf{p}}_{i}^{t}=\mathbf{K}[\mathbf{R} \mid \mathbf{t}] \tilde{\mathbf{P}}_{i}^{t} p~it=K[R∣t]P~it,其中 K \mathbf{K} K是相机的内参, [ R ∣ t ] [\mathbf{R} \mid \mathbf{t}] [R∣t]是相机的extrinsic matrix,作为遮挡目标的ground truth label。
当k时刻目标从遮挡中恢复出来之后,由于采用上述的生成方式k-1时刻目标的ground truth位置上和k时刻观测到的位置可能存在着较大的差异,通过位置偏置来监督学习,也就是让位置偏移预测的内容为两个gound truth之间的差值博主认为这个地方对于模型位置偏移的预测不太友好。
采用在合成数据上训练一段时间,在真实数据上fine-tune的方式不适合本文,因为后续在真实数据上的fine-tune有可能会导致模型对轨迹地学习出现遗忘。
本文采用的方式是联合合成数据和真实数据进行训练,真实数据长度为2.这里选取2的主要原因博主觉得,首先真实数据中会出现上一个时刻存在标签,下一个时刻的标签丢失的问题,也就是在 P t P^t Pt由于遮挡会将原本的正样本转变为负样本,同合成数据存在着不一致,序列越长这种不一致的问题就越严重。博主觉得这里还是有不合理的地方的,但是相比于fine-tune,这种方式的处理明显要更好一些。为了训练对轨迹的期望能力,是没法将这部分损失从真实数据中隔离出来的。总损失为:
L = 1 N ∑ t = 1 N L s y m t + 1 2 ∑ t = 1 2 L r e a l t L=\frac{1}{N} \sum_{t=1}^{N} L_{s y m}^{t}+\frac{1}{2} \sum_{t=1}^{2} L_{r e a l}^{t} L=N1t=1∑NLsymt+21t=1∑2Lrealt
- 数据集
KITTI+MOT17,同时使用ParallelDomain(PD)合成了一个数据集,本文方法适用于2D场景,同时在3Dtracking任务中也同样适用- 评价指标
CLEAR MOT指标:MOTA(注: 强调检测性能多一些), fraction of tracks,track intersection over union(track IoU),HOTA
track IoU的定义:给定 T T T帧视频的真实标签 G = { g 1 , … , g T } G=\left\{g_{1}, \ldots, g_{T}\right\} G={g1,…,gT}以及预测值 D = { d 1 , … , d T } D=\left\{d_{1}, \ldots, d_{T}\right\} D={d1,…,dT},只有predicted track能够assign到每一个ground truth轨迹上时才是truth trajectory,否则的话就看成是False positive,然后TrackIoU的定义就是 I O U ( D , G ) = ∑ t = 1 T g t ∩ d t ∑ t = 1 T g t ∪ d t \mathbf{I O U}(D, G)=\frac{\sum_{t=1}^{T} g_{t} \cap d_{t}}{\sum_{t=1}^{T} g_{t} \cup d_{t}} IOU(D,G)=∑t=1Tgt∪dt∑t=1Tgt∩dt,根据预先设定好的IoU阈值,可以类似计算mAP,同样设置IoU阈值为0.5可以计算Track AP
- ConvGRU特征维度为256,使用 7 × 7 7\times7 7×7卷积,序列长度为17,批大小为16,训练21个epoch,使用Adam优化器进行处理,学习率 1.25 e − 4 1.25 \mathrm{e}-4 1.25e−4,并且每7个epoch下降10倍, T occl = 0.15 , T vis = 0.05 T_{\text {occl }}=0.15,T_{\text {vis }}=0.05 Toccl =0.15,Tvis =0.05表示目标有15%和5%的部分是可见的。
基于PD数据集训练和验证,增加ConvGRU的conv尺寸能够提升性能,同时输入序列增加能够帮助long range的detection进行关联。这里主要是通过ConvGRU提升了长程的关联能力这里的疑问
- 训练数据集是否只在visible objects上进行训练?
是的- 为什么附加的中心点位置特征图 H t − 1 H^{t-1} Ht−1效果反而不好呢?
作者指出这个信息是冗余的
- 结果第一行使用所有的GT,带来了之前方法中提到的在目标没出现前也会猜测轨迹的问题,而通过对这个问题的解决方式能够带来性能上极大的提升。
- 引入2D恒定速度之后,性能不佳,作者分析原因为相机对于2D的运动是不稳定的。而3D恒定速度假设能够在模型上取得较好的结果,提升性能
- 附加上后处理上采用恒定速度假设对于CenterTrack和本文模型的影响,为什么引入恒定速度的后处理还能有那么大的提升呢?
- KITTI这个竖线是在KITTY上训,在PD验证集上验证嘛?
- 随着数据集数量的增加,with invisible object labels和without invisible object labels差异越来越大。
在PD数据集上训练出来的模型直接在KITTY验证集上进行测试,也能够得到优于CenterTrack的模型。从这个数据上来看,合成数据的多样性挺好,泛化能力比较强(我觉得这里应该是用了比较多的视频来训练的)。
直接微调模型有助于减少domain之间的差异,但是会造成遮挡目标的欠学习,而联合训练两个数据集能够取得最佳的结果。最后使用相同的数据集比较CenterTrack同本文方法的学习能力。
在本文中提出了PermaTrack,端到端的联合object detection和tracking的方法。主要是通过ConvGRU融合历史信息来对目标的locations进行推理,对遮挡问题进行学习。
我猜是没有标签的,不然这篇文章也用不着重新生成一个完全遮挡情况下的数据集了,而且在验证阶段不输出遮挡情况下的bounding boxes。哈哈哈(说实话这样没毛病,但着实太不严谨了,先遗留下来,待我之后仔细确认)
在data association上的一些工作
多目标跟踪任务主要由两个部分构成: detection以及association,大部分方法是将两个问题分开来解决,整个范式的话称作tracking-by-detection,这种tracking-by-detection的方式主要分成两类:在线的和离线的。对于当前state-of-the-art的trackers来说,在跟踪阶段会保持一组active trajectory,然后看当前detector的检测结果(设置了较高的置信度阈值之后得到的)是否能和现有的轨迹关联上,对于关联不上的detection bounding boxes会生成新的轨迹。SORT使用motion来计算similarity实现当前detection关联到轨迹上。DeepSORT增加了appearance feature来进行关联。更加新的trackers中使用more complex特征(人体姿态,通过spatio-temporal graph convolution学习到的trajectories representations)使用线性模型来传播假设(我猜想这里说的应该是类似卡尔曼滤波那种线性估计器对未来的状态进行估计得到估计的feature或者其他啥的),前面说的complex feature也是人为手动设计的,作者任务这种手动设计的feature是不及本文的方法的。
基于上述tracking-by-detection框架,在detector检测到的boxes传递给data association时,将所有的检测boxes(实际上是置信度阈值较小0.1)都传递过来,采用二次关联的方式,第一次将高置信度阈值(0.6)的boxes和存在的轨迹关联上,接着将置信度阈值在(0.1-0.6)之间的boxes关联到未能够匹配上的trajectories,新的trajectory仅仅由高置信度阈值的boxes生成。
offline方法:首先创建一个spatio-temporal graph spanning the whole video,将detector检测到的boxes看成nodes,edge则是nodes(boxes)之间的iou以及appearance similarity构建。关联的工作可以通过maximum flow或者minimum cost problem。并且计算复杂度较高(注:这里我觉得应该是offline中的一种基于graph的方式)
目前一些方法将detection和tracking combine到单个模型中,输入是pairs input(成对的),同时利用pairwise association,但是这些方法只能够处理single-frame occlusion
注:这里暂时留两个疑问:
这些pairs input的在结构(损失,inference)相比于单幅输入图像的有什么差异?
为什么说这些方法只能够处理single-frame occlusion?还有一些传统的方法:Learning object permanence from video
在tracking object detection上的一些工作
- 早期的方法单独处理frame,使用Siamese network来构建association。之后给object detector增加了一个spatio-temporal memory module来处理任意长度的视频。
待查看参考文献:Delving deeper into convolutional networks for learning video representations.
使用Parallel Domain(PD)simulation platform来生成,对于所有的遮挡目标同样提供生成的伪ground truth。感觉这里面的数据确实好。