参考代码:MapTracker
动机与出发点
为了提升帧间检测的稳定性通常会添加时许信息,这个可以BEV特征处做时序融合,也可以是用当前帧query去cross-attn历史帧信息,则更多的时候是将之前帧信息与当前做融合或者cross-attn实现信息传递,是一种只在当前帧做检测的思路。这篇文章提出使用tracking的思路去做帧间融合,也就是历史帧的目标信息和匹配关系会随着时间流转到当前时刻,融合也是分为BEV特征和query维度的:
- 1)BEV特征(BEV query)融合:将上一帧BEV特征通过egomotion变换到当前帧位置下用于当前帧query的初始化,没有重叠的区域就用原本embedding的值(default val),之后再与历史帧做跳帧融合,如使用距离当前ego距离为1m、5m、10m、15m处帧数据,这个融合的过程可以直接warp对齐之后做融合
- 2)vector query融合:将上一帧object query做帧间对齐之后与当前帧的query做concat操作,再与历史帧的query做inst级别的cross-attn操作,这样就相当于历史帧中的query流转到了当前时刻(做数据的时候就要把跟踪关系做好,同一个clip用同一个实例ID就行),同时也有新定义query去处理新出现的目标
使用tracking的方式去做感知具有如下优势:
- 1)基于DETR的检测器得到简化,当前帧的query与GT之间的对应关系(主要为vector query)在上一帧就已经建立好了,不用再在当前时刻做匹配,这样收敛速度更快,效果更好
- 2)帧间目标连贯性更好(少毛刺),帧间做tracking会传递和对齐query,使得同一个目标query表达相对稳定,时序叠加之后毛刺现象
下面就是无时序模型、时序检测模型、时序tracking模型的结果直观对比:
方法设计
文章的方法pipeline见下图所示:
针对于时序融合定义了BEV query和vector query两处buffer用于去融合时序特征,这里buffer的容量做到了20个,但是使用的时候是具有选择性(跳帧策略:距离当前ego距离为1m、5m、10m、15m处帧数据),这样可以增加性能的同时减少计算量。
BEV特征与query在当前时刻的初始化
基于检测的时序模型采用当前时刻query做后续流程,不会引入历史帧的信息。对于tracking的思想是使用历史帧信息,历史帧信息中query与GT匹配关系、query特征表达均会传递到当前帧,在给新目标分配额外object query的同时,用以上信息完成帧间流转之后去检测。其实这部分过程也就是上图中的BEV Query Propagation和Vector Query Propagation。
BEV特征与query时序融合
完成BEV和Decoder中query初始化(仅使用上一帧的信息)之后便是去融合历史帧的信息,对于历史帧不是全部采用而是采用跳帧策略。对于BEV query部分时序融合就是concat+conv实现,而object query就是使用cross-attn与历史帧信息交互,见下图
另外,为了使得帧间信息传递(主要针对object query)时候上图中的PropMLP模块能够学到帧间迁移特性,在损失函数中增加了 L t r a n s L_{trans} Ltrans约束,思想就是用上一帧query经过该模块对齐之后预测结果应该与单纯依据egomotion变换得到的结果近似。这个trick已在StreamMapNet中使用了。
对于BEV query和object query两个维度它们的具体流程见下图:
那么依据tracking做query初始化、时序特征融合、跳帧策略这几个变量对性能的影响:
实验结果
nuScenes下性能比较:
Argoverse2下性能比较: