0. 前言
- 英文标题:BEVFusion: Multi-Task Multi-Sensor Fusion with Unified Bird’s-Eye View Representation
- 发表单位:MIT
- 发表期刊:ICRA 2023
- 论文地址:https://arxiv.org/abs/2205.13542
- 官方源码:https://github.com/mit-han-lab/bevfusion
- mmdetection3D集成版:https://github.com/open-mmlab/mmdetection3d/tree/main/projects/BEVFusion
- 英伟达部署版:https://github.com/NVIDIA-AI-IOT/Lidar_AI_Solution/tree/master/CUDA-BEVFusion
多传感器融合对于准确和可靠的自动驾驶系统至关重要。最近的方法基于点级(point-level
)融合方法:使用图像特征对激光点云进行增强。但是,相机到激光(camera-to-LIDAR
)投影的方法丢掉了图像的语义密度,特别对于3D场景分割任务。在本文中,我们使用 BEVFusion
打破了这种根深蒂固的惯例,这是一种高效且通用的多任务多传感器融合框架。它统一了共享鸟瞰图(BEV
)表示空间中的多模态特征,很好地保留了几何和语义信息
。为了实现这一点,我们分析并使用BEV pooling
方法提升了在视图转换(view transformation
)过程中的重要瓶颈,将延迟减少了40倍以上。BEVFusion
基本上是任务无关的,无缝地支持不同的3D感知任务,几乎没有架构变化。
BEVFusion
在nuScenes上建立了新的sota,在3D目标检测上,提升了1.3%的MAP和NDS,在BEV地图分割上,提升了了13.6%的mIoU值,并且计算成本降低了1.9倍。
1. 介绍
自动驾驶系统配备了丰富的传感器,比如Waymo的自动驾驶车辆有29个摄像机,6个毫米波雷达,5个激光雷达。 不同的传感器提供互补的信号:比如摄像头能够获取到丰富的语义信息,激光雷达能够提供准确的空间信息,毫米波雷达能够提供目标的速度估计。因此,多传感器融合对于准确和可靠的感知具有重要意义。
来自不同传感器的数据以不同的模式表示:例如图像捕获的数据是一种透视图,而激光雷达是一种3D视角。为了解决视角带来的差异,我们必须找到一个适合多任务多模态特征融合的统一表示
。
- LiDAR-to-camera
由于2D感知的巨大成功,自然的想法是将LiDAR
点云投影到摄像机上,并使用2D CNN
处理RGB-D
数据。但是激光投影至图像(LiDAR-to-camera
)会带来严重的几何畸变(见下图 1a
),这种方法对于依赖几何特征的任务不太友好,比如3D目标感知任务。
- camera-to-LiDAR
最近的传感器融合方法遵循另一个方向。它们试图使用语义标签(PointPainting
), CNN的特征(PointAugmenting
,DeepFusion
),或者从2D图像获取的虚拟点(Multimodal Virtual Point 3D Detection
)来增强激光点云,然后再使用现有的基于LiDAR
方法预测3D bounding box
。虽然在大规模检测基准上表现出了显著的性能,但这些点级融合方法几乎不适用于面向语义的任务,如BEV地图分割。这是因为相机到激光雷达的投影在语义上是有损的(见图 1b
):对于典型的 32线激光雷达,只有 5% 的相机特征将与 LiDAR 点匹配,而其他所有特征都将被丢弃。
本文中提出的BEV方法,同时保持几何结构和语义密度
(见图 1c
)。然而在将所有特征转换至BEV时,我们确定了视图转换过程主要效率瓶颈:仅 BEV 池化操作就占用了模型运行时的 80% 以上。我们提出了一种具有预计算和区间缩减的专用内核来消除这个瓶颈,实现了超过 40 倍的加速。最后,我们应用全卷积BEV编码器来融合统一的BEV特征,并附加一些特定于任务的头部来支持不同的目标任务。
2. 相关工作
- 基于LiDAR的3D感知
- 单阶段3D目标检测:
VoxelNet
;PointPillars
;SECOND
;CBGS
;3DSSD
;MVF
;使用PointNets
或者SparseConvNet
提取点云特征,并在BEV空间进行检测。- anchor-free的3D目标检测:
centerpoint
;HotSpotNet
;offboard(3D Auto Labeling)
;RangeDet
;Object DGCNN
;- 两阶段目标检测:PointRCNN;
Fast Point R-CNN
;PV-RCNN
;PV-RCNN++
;LiDAR R-CNN
。- 3D语义分割:类似于
U-Net
的结构,PVNAS
等。
- 基于相机的3D感知
- 在2D目标检测上增加3D分支:
FCOS3D
基于2D目标检测FCOS
。- 类似于
DETR
方法。DETR3D
;PETR
;Graph-DETR3D
.- View transformer方法:
BEVDet
基于LSS
的扩展,M2BEV
基于OFT
的扩展。CaDDN
;BEVDet4D
;BEVFormer
;PETRv2
;CVT
;Ego3RT
。
- 多传感器的3D感知
proposal-level
方法:以目标为中心,不能进行地图分割任务。
MV3D
:在3D空间生成proposals,然后投影至图像,提取ROI。F-PointNet
;F-ConvNet
;CenterFusion
:提取图像的proposal并生成3D的锥视图。FUTR3D
;TransFusion
:在3D空间定义目标queries,然后在融合图像特征。
point-level
方法:把图像的语义特征投到LiDAR
的前景上,然后再使用基于激光的目标检测任务。
- 输入级(点云层)的装饰:
PointPainting
;PointAugmenting
;MVP
;FusionPainting
;AutoAlign
;FocalSparseCNN
;feature-level
的装饰:Deep Continuous Fusion
;DeepFusion
;
与所有现有方法相比,BEVFusion
在共享的 BEV
空间中执行传感器融合,并平等地对待前景和背景、几何和语义信息。BEVFusion
是一个通用的多任务多传感器感知框架。
3. 方法
BEVFusion
专注于用于多任务3D感知(即检测和分割
)的多传感器融合(即多视角摄像机和激光雷达
)。框架图如下所示,对于每个传感器输入,首先使用特定模态的编码器提取各自的特征,然后将多模态特征转换为一个统一的BEV表示,既保留了几何和语义信息。我们还是用precomputation and interval
来加速BEV pooling。然后,我们将基于卷积的BEV编码器应用于统一的BEV特征,以缓解不同特征之间的局部错位。最后,我们附加了一些特定于任务的头来支持不同的 3D 任务。
3.1 统一表示
不同特征通常存在于不同视图中。例如,相机特征在透视图中,而LiDAR
/Radar
特征通常在3D/鸟瞰视图中。即使对于相机特征,它们中的每一个都有不同的视角(前后左右)。视角上的差异使特征融合变得困难,因为不同特征张量中的相同元素可能对应于完全不同的空间位置。因此,找到共享表示是至关重要的。第一所有的特征比较容易转换且没有信息损失,第二共享特征对所有任务都是合适的。
To Camera
: 将激光数据转换至图像视角,会造成几何信息损失
。比如深度图上的两个邻居可以在 3D 空间中彼此相距很远。这使得相机视角对专注于对象/场景几何形状的任务不太有效,例如 3D 目标检测。To LiDAR
:camera-to-LiDAR
投影会有语义损失
,相机和激光雷达特征的密度截然不同,导致只有不到5%的相机特征与LiDAR
点匹配(32线激光雷达)。放弃相机特征的语义密度严重损害了模型在面向语义的任务上的性能(例如BEV地图分割)。To Bird's-Eye View
: 既保留了激光点云的几何结构,同时又保留了相机特征的语义信息。对激光而言,LiDAR-to-BEV
投影沿高度维度展平稀疏LiDAR特征,不会产生几何失真。对相机而言,camera-to-BEV
投影将每个相机特征像素投射至3D空间的一根线,保留了全部的相机语义特征。
3.2 高效地Camera-to-BEV转换
相机到 BEV 的转换并非易事,因为与每个相机特征像素相关的深度本质上是模棱两可的。和LSS
和BEVDet
一样,我们显式地预测每个像素的离散深度分布。我们将每个特征像素分散到沿相机光线的 D
个离散点,并通过它们对应的深度概率重新缩放相关特征(如下图Figure 3a所示)。一个图像特征会生成N*H*W*D
维度的点云。
N
: 相机个数(H, W)
: 相机的feature map大小。
这种3D特征点云沿x,y
轴量化,步长为r=0.4
。我们使用 BEV pooling操作来聚合每个 r × r
BEV 网格中的所有特征,并沿 z 轴
展平特征。
虽然简单,但在 RTX 3090 GPU 上,BEV pooling
效率非常低且缓慢,但在 RTX 3090 GPU 上需要超过 500 毫秒(而模型的其余部分只需要大约 100 毫秒)。造成这结果的原因是相机产生的点云非常大:一般每帧可以生成大约2百万个点,比LiDAR特征点云密集两个数量级。为了提升这个瓶颈的效率,我们提出了使用预计算和间隔缩减(precomputation and interval reduction)
优化BEV pooling
。
- Precomputation
BEV pooling
的第一步是将相机特征点云中的每个点与BEV网格相关联。与 LiDAR
点云不同,相机特征点云的坐标是固定的(只要相机的内外参保持不变,这通常是经过适当校准后的情况),受此启发,我们预先计算每个点的 3D 坐标和 BEV 网格索引
。同时我们根据网格索引对所有点进行排序并记录每个点的排名,在推理过程中,我们只需要根据预先计算的排名对所有特征点进行重新排序。这种缓存机制可以将网格关联的延迟从17ms减少到4ms
。
- Interval Reduction
在网格关联之后,同一BEV
网格中的所有点在张量表示中将是连续的。然后,BEV pooling
的下一步是通过一些对称函数(例如均值、最大值和总和)聚合每个 BEV
网格内的特征。
- LSS方法 :如
Figure 3b
所示,首先计算所有点的前缀和,然后减去索引变化边界处的值。前缀求和操作需要在 GPU 上进行tree reduction
,并产生许多未使用的部分和(因为我们只需要边界上的值),这两者都是低效的。- 本文方法:为了加速特征聚合,我们使用了一个专门的 GPU 内核,它直接在 BEV 网格上并行化:为每个网格单元分配一个 GPU 线程,该线程计算其间隔总和并将结果写入回。这个内核消除了输出之间的依赖关系(因此不需要多级树缩减),并避免将部分和写入 DRAM,
该方法将特征聚合的延迟从500ms减少到2ms
。
3.3 全卷积融合
拿到所有传感器的BEV
特征表示后,可以很容易将它们按照元素进行整合在一起(比如concateation
方式)。虽然在同一空间中,由于view transformer
的深度不准确,LiDAR BEV
特征和camera BEV
特征仍然可以在一定程度上在空间上错位。为此,我们使用基于卷积的 BEV
编码器(有一些残差块)来补偿这种局部错位。
我们的方法可能受益于更准确的深度估计(比如在view transformer
中加入gt
深度监督[CaDDN
, pseudo-lidar(38)
]),我们将其留给未来的工作。(这部分在最新的官方代码中貌似已经有了,后续看代码的时候再确认)
3.4 多任务Heads
bevfusion
可以将多个特定任务的head应用于融合的 BEV 特征图。bevfusion
的方法适用于大多数 3D 感知任务。本文展示了两个示例:3D 目标检测和 BEV 地图分割。
- Detection
使用了中心heatmap的head预测目标的中心,使用了一些回归head预测目标的size,rotation和velocity。这些方法可以参考Transfusion
、CenterPoint
和MVP
论文。
- Segmentation
不同的map类别可能会有重叠(例如,crosswalk 可行驶区域的子集)。因此,我们将此问题使用多个二进制语义分割解决,每个类一个。我们采用 CVT
论文的方法,使用标准focal loss
训练分割头 。
4. 实验
本论文评估了BEVFusion
在三维物体检测和BEV地图分割上的相机-激光雷达融合,涵盖了几何和面向语义的任务。这个框架也很容易扩展至支持其他传感器(比如毫米波)和其他3D感知任务(比如3D目标跟踪和运动预测)。
实验中,使用了6个相机(N=6
),每个相机的feature map为(H, W ) = (32, 88)
,也就是从原图256×704
进行了8倍
的下采样。采用BEVDet方案,深度信息被离散分部至[1, 60]
米,步长为0.5
米。
- Model
- 图像backbone使用
Swin-T
,LiDAR的backbone使用VoxelNet
。- 使用
FPN
方法融合了多尺度特征,生成8倍下采样的feature map
作为输入。- 我们将相机图像下采样到
256×704
,并用0.075m
(用于检测)和0.1m
(用于分割)对LiDAR
点云进行体素化。- 检测和分割的范围也不一样,在检测头之前使用了双线性插值,以应对不同的检测任务。
- Training
不同于PointPainting
,PointAugmenting
和TransFusion
冻结相机编码器,本文训练整个网络的方式是一种端到端的方式。对图像和 LiDAR
数据进行增强来防止过拟合。优化器使用AdamW
,weight decay
为0.01.
- Dataset
本文实验基于nuScenes
数据集,它支持3D目标检测/跟踪和BEV地图分割任务。标注了40157
个样本,每个包含6个单目相机,和一个32线激光雷达。
- 3D目标检测
- BEV地图分割