一、overview
TransTrack基于Query-Key目前最火热的Transformer架构构建。
最中间的key来自骨干网络对当前帧图像提取的特征图。
而query按照两个分支的需求分别来自上一帧的目标特征query集和一个可学习的目标query集。这两个分支都很有意思,我们先看下面这个检测分支,这里这个learned object query思路来自于DETR,是一种可学习的表示,它能逐渐学会从key中查询到目标的位置从而完成检测,想知道得更明白得可以去看看DETR论文。可以很明显地看明白,这个检测分支完成了当前帧上所有目标的检测得到detection boxes。
然后我们看上面这个跟踪框分支,这个object feature query其实就是上一帧的检测分支产生的目标的特征向量(也就是说转换关系是Ft object feature --> Ft-1 object feature query),这个object feature query从key中查询目标当前帧中位置,用CenterTrack的思路来理解,这可以认为是一个位移预测分支,它最终得到tracking boxes。
最后,由于跟踪框和检测框都在当前帧上了,进行简单的IOU匹配就能完成跟踪了,至此,MOT任务完成。
二、pipeline详解
直译:图3:TransTrack的架构细节。首先,将当前帧图像输入到CNN主干以提取特征图。然后,当前帧特征图和前一帧特征图都被送入编码器以生成复合特征。接下来,将学习到的对象查询解码为检测框,并将前一帧的对象特征解码为跟踪框。最后,使用IoU匹配将检测框与跟踪框相关联。
详解:在 MOT 任务中,理想的输出是视频中每一帧上的一组完整且正确排序的对象。为此TransTrack使用来自两个来源的查询来获得自适应线索。一方面,类似于通常的基于transformer的检测器,TransTrack将对象查询(object query)作为输入以提供常见的对象检测结果。 另一方面,TransTrack利用先前检测到的对象的特征来形成另一个“跟踪查询”,以发现后续帧中的关联对象。 在该方案下,TransTrack生成平行的两组边界框,称为“检测框”和“跟踪框”。最后TransTrack使用匈牙利算法,其中代价是框之间的IoU区域,从两个边界框集实现最终有序框集。pipeline如图3所示。
TransTrack的encoder将连续两帧合成的特征图作为输入,为了避免重复计算,将当前帧提取的特征暂时保存下来,再用于下一帧。 TransTrack 中使用了两个并行解码器。从编码器生成的特征图被两个解码器用作公共key。(所以这里是Cross attention, key与query相同极为self-attention) 两个解码器被设计为分别执行对象检测和对象传播。 具体来说,解码器将学习到的对象查询作为输入并预测检测框。另一个解码器将前一帧的对象特征,即“track query”作为输入,预测当前帧中相应对象的位置,其边界框称为跟踪框。
检测部分
仿照DETR,TransTrack利用学习对象查询(object query)进行对象检测。 对象查询是一组可学习的参数,与网络中的所有其他参数一起训练。 在检测过程中,关键是从输入图像生成全局特征图,对象查询在图像中查找感兴趣的对象并输出最终的检测预测,称为“检测框”。图3中的左侧解码器块完成此过程。
目标传播阶段
给定在前一帧中检测到的对象,TransTrack通过将它们的特征作为跟踪查询传递到下一帧来传播这些对象。该阶段由图3中右侧的解码器块执行。解码器与左侧的具有相同的架构,但从不同的来源获取查询。这种继承的对象特征传达了先前看到的对象的外观和位置信息,因此该解码器可以很好地定位当前帧上相应对象的位置并输出“跟踪框”。
box关联阶段
提供检测框和跟踪框,TransTrack使用框IoU匹配方法得到最终的跟踪结果,如图3所示。将Kuhn-Munkres(KM)算法应用于检测框和跟踪框的IoU相似度,检测框与跟踪框匹配。保留那些不匹配的检测框以创建新的轨迹。
看到匈牙利算法可能会比较亲切,这与SORT算法可能类似,但仔细阅读后发现TransTrack其实与Trackor++更为类似。
三、针对overview需要补充的知识点
DETR中的object query
1.每个Decoder有两个输入:一路是Object Query(或者是上一个Decoder的输出),另一路是Encoder的结果。
2.Object Query是一组nn.Embedding的weight (其实就是一组学到的参数)
3.DETR的输出是定长的:100个检测框和类别。DETR可以被认为具有100个adaptive archor,其中Encoder和Object Query分别对特征和Anchor进行编码,最后用Decoder+FFN得到检测框和类别。
参考:【论文笔记】从Transformer到DETR - 知乎