Sparse4D: Multi-view 3D Object Detection with Sparse Spatial-Temporal Fusion
相关内容:总览,Sparse4D v1,Sparse4D v3,
单位:地平线(Sparse4D v1 原班人马)
GitHub:https://github.com/HorizonRobotics/Sparse4D
论文:https://arxiv.org/abs/2305.14018
时间:2023-05
找博主项目讨论方式:wx:DL_xifen
讨论QQ群:345458279
摘要
- 稀疏算法在多视角时序感知任务中,非常灵活
- 本文,提出另一个增强版本的Sparse4D ,改进了时序融合模块,是利用递归的方式实现了多帧特征采样
- 有效的解耦了图像特征和结构化的锚框特征,Sparse4D 可以实现时序特征的高效转换,从而仅通过稀疏特征的逐帧传递来促进时序融合。
- 递归的时序融合方法有两个主要的好处。
- 首先,它将时序融合的计算复杂度从O (T)降低到O (1),
- 其次,它使长时间信息的融合成为可能,从而由于时序融合而导致更显著的性能改进。
- Sparse4Dv2,进一步提高了稀疏感知的性能,达到了SOTA的结果在NuScenes 3D检测任务中。
1 引言
-
感知模块在自动驾驶系统中起着关键作用。
-
实现多传感器与时序特征的高效和有机融合是提高感知性能的关键研究方向
-
尽管基于BEV)的方法已经获得了大量的关注,并表现出了较高的感知性能,但我们并不认为它们代表最优的解决方案,理由如下:
- 从图像特征到BEV向量空间的转换涉及到重新组织和重新排列密集特征,而不引入额外的视角。然而,这种转换却增加了模型的复杂性
- 在感知范围、准确性和计算复杂度之间取得平衡对于获得最佳结果至关重要。不同的驾驶场景(如高速公路、城市或农村地区)需要特定的参数设置,以确保感知能力和计算效率之间的有效权衡。
- 在端到端自动驾驶的背景下,基于稀疏的算法产生的实例特征具有更大的意义,因为它们可以更容易地与基于图的模型集成。
-
与基于bev的算法不同,PETR系列算法利用基于query的体系结构和全局交叉注意力来实现多视图特征融合。
-
类似于原始的DETR,使用了全局注意力,导致高的算力消耗,不能被认为是一种完全的稀疏算法
-
基于上述原因,我们专注于稀疏算法,改进感知算法,助力端到端自动驾驶
-
我们选择了Sparse4D作为基线算法,进一步增加。
-
这个Sparse4D的时时序模块有一个明显的局限性,在执行特征融合之前,它需要采样多帧的历史数据,如图1(a).所示
-
这导致了随着历史帧的增加,线性增加了计算复杂度和现存占用。同时难以扩展历史特征。
-
为了克服上述问题,本文提出了迭代实例特征的方式,替代多帧采样。类似与基于query的跟踪器SteamPETR。
-
具体而言,第一帧,采用了单帧的Sparse4D,输出相应的3D边界框和特征。
-
对于后续的帧,我们转换前一帧的输出作为当前帧的输入,实例特征保持不变,而实例状态,如3D边界框,则会作为锚框利用自车运动信息,映射到当前帧上。
-
锚框的位置embeding也通过锚编码器显示地重新编码
-
为了充分利用时序实例特征,本文映入了时序交叉注意力模块在decoder的每一层。
-
通过时间投影初始化的实例主要处理轨迹,它们是之前在多个帧上被检测和跟踪的对象。
-
对于新出现的对象,我们使用单帧单层解码器初始化它们,选择得分最高的实例子集,然后传播到后续的解码器。
-
这种设计避免我们的时序模型增加锚框的数量,从而达到与非时序模型相当的推理速度
-
除了时序融合模块,Sparse4Dv2进行了如下的改进:
- 将双线性网格采样和加权和结合为一个CUDA算子,重建可变形聚合操作,显著减少了训练过程中的内存占用,并在一定程度上提高了训练速度。
- 将摄像机参数编码纳入可变形聚合中,并在训练过程中结合图像和输出坐标增强,以实现更高的感知精度和鲁棒性。
- 引入基于激光雷达点云的密集深度监控,便于训练优化,提高检测精度
-
在NuScenes数据集上进行了大量3D检测实验,结果显示了Sparse4Dv2具有强大的竞争力
-
超越了现有的SOLOFusion和VideoBEV的表现,同时又具有推理速度的优势。
2 Related Works
2.1 基于相机的3D检测
参考sparse 4D v1
2.2 多视角特征融合
参考sparse 4D v1
2.3 时序特征融合
参考sparse 4D v1
3 方法
3.1 整体架构
- 第一步:提取多视角特征图: I = { I s ∈ R N × C × H s × W s ∣ 1 ≤ s ≤ S } I=\left\{I_{s}\in\mathbb{R}^{N\times C\times H_{s}\times W_{s}}|1\leq s\leq S\right\} I={Is∈RN×C×Hs×Ws∣1≤s≤S}
- 其中S表示特征尺度数,N表示视角数
- 第二步,将特征图送入decoder,decoder包括1个单帧层和5个多帧层
- 单帧层包括3个模块:deformable aggregation, FFN, 输出层(微调bbox和分类)
- 多帧层,处理上述3个以外,还有2个多头注意力
- 交叉注意力用于增强时序特征的融合,自注意力用于实例特征之间的交互
- 首先,初始化一个实例特征集,其中包括anchor和特征
- 使用单帧网络对他们进行微调和评分,选择高分实例作为后续多帧网络的输入
- 多帧网络输入除了上述的高分实例,还有前一帧的输出(历史帧的实例)
- 每一层的anchor数量是一样的,无论是单帧层还是多帧层
- 多帧层的输出作为当前帧的检查结果
- 同理,将高分实例会保存,作为下一帧的输入。
3.2 实例时序传播
-
在Sparse4D中,一个实例有3个部分表征:anchor、实例特征、anchor embedding
-
Anchor是结构化信息,包括了实例的状态,有明确的物理含义
-
实例特征是高维语义特征,从图像中提取出来的,主要是通过图像编码器获取
-
anchor embedding 就是anchor进行的特征编码
-
一个小的anchor 编码器 Ψ \mathbb{\Psi} Ψ 用于映射anchor结构化信息到高维空间
-
这个设计 完全是解耦了图像特征和实例的状态信息,所以就非常容易添加先验知识。
-
对于实例时序传播,我们可以投影anchor,然后用anchor编码器 去编码投影后的anchor,同时保持特征不变就好。公式如下:
A t = P r o j e c t t − 1 → t ( A t − 1 ) , E t = Ψ ( A t ) , F t = F t − 1 A_t=\mathbf{Project}_{t-1\to t}(A_{t-1}),\quad E_t=\Psi\left(A_t\right),\quad F_t=F_{t-1} At=Projectt−1→t(At−1),Et=Ψ(At),Ft=Ft−1
-
其中, A A A 表示 anchor, E E E表示anchor embedding , F F F 表示特征, Ψ \Psi Ψ表示特征编码器
-
Sparse4D可以用于处理各种感知任务,仅仅是需要设计不同的anchor 和映射函数,针对不同的任务。
-
在3D检查任务中,anchor 设定为3D 边界框,同时映射函数可以如下:
A t − 1 = { x , y , z , w , l , h , sin y a w , cos y a w , v x , v y , v z } t − 1 I x , y , z ] t = R t − 1 → t ( [ x , y , z ] + d t [ v x , v y , v z ] ) t − 1 + T t − 1 → t [ w , l , h ] t = [ w , l , h ] t − 1 [ cos y a w , sin y a w , 0 ] t = R t − 1 → t [ cos y a w , sin y a w , 0 ] t − 1 [ v x , v y , v z ] t = R t − 1 → t [ v x , v y , v z ] t − 1 \begin{gathered} A_{t-1}=\{x,y,z,w,l,h,\sin yaw,\cos yaw,v_{x},v_{y},v_{z}\}_{t-1} \\ \text{I} x,y,z]_{t}=\mathbf{R}_{t-1\to t}([x,y,z]+d_{t}[v_{x},v_{y},v_{z}])_{t-1}+\mathbf{T}_{t-1\to t} \\ [w,l,h]_{t}=[w,l,h]_{t-1} \\ \left[\cos yaw,\sin yaw,0\right]_{t}=\mathbf{R}_{t-1\to t}\left[\cos yaw,\sin yaw,0\right]_{t-1} \\ \left[v_{x},v_{y},v_{z}\right]_{t}=\mathbf{R}_{t-1\to t}\left[v_{x},v_{y},v_{z}\right]_{t-1} \end{gathered} At−1={x,y,z,w,l,h,sinyaw,cosyaw,vx,vy,vz}t−1Ix,y,z]t=Rt−1→t([x,y,z]+dt[vx,vy,vz])t−1+Tt−1→t[w,l,h]t=[w,l,h]t−1[cosyaw,sinyaw,0]t=Rt−1→t[cosyaw,sinyaw,0]t−1[vx,vy,vz]t=Rt−1→t[vx,vy,vz]t−1 -
其中, d t d_t dt 是表示t与t-1之间的时间间隔, R t − 1 → t \mathbf{R}_{t-1\to t} Rt−1→t和 T t − 1 → t \mathbf{T}_{t-1\to t} Tt−1→t表示t-1到t时刻,自车的旋转矩阵和平移矩阵,
-
如果是3D 车道线检测任务,anchor可以定义为polyline,同时映射函数可以映射每一个3D点。
3.3 高效可变性聚合
-
可变性聚合实现多尺度多视角的特征融合,其中包括特征采样和加权融合。
-
其中,算法1 只需要多次加载和存储HBM, 也需要存储大量中间量在训练的反向传播中,特别是当尺寸 f f f特别大的时候,实际上,花费了大量的GPU的显存。
-
此外,频繁的HBM的访问也拖慢了推理的速度。
-
基于此,本文将特征采样和多尺度/多视角加权封装到一个可变性聚合中,作为一个cuda算子,直接一步输出多点的特征。
-
上述算子称之为:Efficient Deformable Aggregation (EDA)
-
EDA表现出优异的并行性能,允许在K维度和C维度上实现完全的并行化。
-
单个线程的计算复杂度只有 N × S N \times S N×S。
-
此外,对于多视角场景,一个点最多会被投影到两个视图中,从而导致单线程的计算复杂度仅为2S。
-
这种设计利用了gpu和AI芯片的并行计算能力,显著提高了效率,并减少了内存消耗和推理时间。
-
EDA可以作为一种多功能操作,适用于需要多图像和多尺度融合的各种应用。
相机参数编码
- 在sparse4D v1中,可变形聚合中的权值是通过一个全连接层来计算的。
- 在训练过程中,摄像机参数的信息逐渐嵌入到这个全连接层的参数中,这可以看作是一种隐式的神经表示或对训练集的过拟合。
- 这种方法会导致对相机参数的泛化效果不佳。
- 具体来说,当交换两幅图像的输入顺序时,权重顺序没有相应变化,影响感知性能。
- 此外,如果我们在训练过程中对摄像机参数应用大规模的数据增强,这种参数化的隐式表征,可能会显著的影响收敛速度。
- 为了解决这个问题,我们直接将摄像机参数输入到网络中,并将从输出空间到图像坐标空间的变换矩阵映射到一个高维的特征向量中
- 然后,我们将这个特征向量添加到实例特征中,并使用组合特征来计算相应视图的权重。
稠密的深度监督
- 在实验中,我们发现基于稀疏的方法在早期训练阶段缺乏足够的收敛能力和速度。
- 为了缓解这一问题,我们引入了以点云为监督的多尺度密集深度估计方法。
- 在推理过程中,这个子网络将不会被使用。
- 对于特征图的每个尺度,我们使用1×1卷积来输出预定义的等效焦距的深度值。
- 然后,将这些深度值乘以相机焦距与等效焦距的比率。
- 密集深度监督的损失函数使用了普通的L1损失
- 在加入密集深度监督后,我们将从Sparse4Dv1中删除深度重权模块
4 实验
-
benchmark
-
数据:NuScenes
-
指标:Average Precision (mAP), mean Average Error of Translation (mATE), Scale (mASE),
Orientation (mAOE), Velocity (mAVE), Attribute (mAAE) and nuScenes Detection Score (NDS),
-
-
实施细节
- backbone:ResNet50, ResNet101 , and VoVNet-99
- neck:FPN
- pretrained weights:ImageNet-1K +nuImages (ResNet),DD3D(VoVNet)
- epochs:100
- optimizer: AdawM
- without CBGS
- augmentation: image data augmentation and lidar rotation augmentation
- anchors: 600 temporal instances, 300 single-frame
- hyperparameters:Sparse4Dv1
-
消融实验以及分析