研究问题
将摄像头特征投影到激光雷达的点云中会丢失摄像头特征的语义密度,从而削弱了这些方法的效果,尤其是在面向语义的任务(如3D场景分割)中。提出了 BEVFusion,一种高效且通用的多任务多传感器融合框架。在共享的鸟瞰视角(shared Bird’s-Eye View, BEV)表示空间中统一多模态特征,能够很好地保留几何和语义信息。
通过改进的 BEV 池化技术,分析并优化了视图变换中的关键效率瓶颈,将延迟降低了超过 40 倍。BEVFusion 本质上与具体任务(task-agnostic)无关,几乎无需结构性改动即可无缝支持不同的 3D 感知任务。在 nuScenes 基准测试中,它确立了新的SOTA,在 3D 目标检测任务中实现了 1.3% 的 mAP 和 NDS 提升,以及在 BEV 地图分割任务中实现了 13.6% 的 mIoU 提升,同时计算成本降低了 1.9 倍。
前置知识
自动驾驶系统配备了多种类型的传感器。例如,Waymo 的自动驾驶车辆配备了 29 个摄像头、6 个雷达和 5 个激光雷达(LiDAR)。不同的传感器提供了互补的信号:例如,摄像头捕获丰富的语义信息,激光雷达提供精确的空间信息,而雷达则能够即时估算速度。因此,多传感器融合对于实现准确且可靠的感知至关重要。
不同传感器的数据本质上属于完全不同的模态:例如,摄像头以透视视角捕获数据,而激光雷达以 3D 视角捕获数据。为了解决这种视角差异,我们需要找到一种适合多任务、多模态特征融合的统一表示方法。由于 2D 感知领域的巨大成功,一个自然的想法是将激光雷达点云投影到摄像头视角中,并使用 2D 卷积神经网络(CNN)处理生成的 RGB-D 数据。然而,这种从激光雷达到摄像头的投影会引入严重的几何失真(参见图 1a),这使其在几何任务(如 3D 目标识别)中效果较差。
另一种方向:通过语义标签、CNN 特征 或来自 2D 图像的虚拟点来增强激光雷达点云,然后使用现有的基于激光雷达的检测器预测 3D 边界框。但这些基于点级的融合方法几乎无法应用于面向语义的任务,例如 BEV 地图分割。其主要原因是摄像头到激光雷达的投影会导致语义信息的严重丢失(参见图 1b)。
本文提出的BEVFusion在共享的鸟瞰视角(shared Bird’s-Eye View, BEV)表示空间中统一多模态特征,能够很好地保留几何和语义信息。
在将所有特征转换为 BEV 表示的过程中,发现主要的效率瓶颈在于视角变换中的 BEV 池化操作:单这一操作就占用了模型运行时间的 80% 以上。为了解决这一瓶颈,我们设计了一种专用内核(specialized kernel),通过预计算和区间压缩显著优化了这一过程,达到了超过 40 倍的加速效果。
最后,采用全卷积的 BEV 编码器(fully-convolutional BEV encoder)来融合统一的 BEV 特征,并附加少量任务特定的输出模块,以支持不同的目标任务。
模型框架
如图 2 所示,BEVFusion 专注于多传感器融合(即多视角摄像头和激光雷达)以完成多任务 3D 感知(即检测和分割)。针对不同的传感器输入,我们首先使用特定于模态的编码器提取其特征。随后,我们将多模态特征转换为统一的 BEV 表示,保留几何和语义信息。
在视角变换过程中,我们发现了效率瓶颈,并通过预计算和区间压缩加速了 BEV 池化。接着,我们对统一的 BEV 特征应用基于卷积的 BEV 编码器,以缓解不同特征间的局部不对齐问题。最后,我们附加少量任务特定的输出模块以支持不同的 3D 任务。
特征提取
不同的特征可能存在于不同的视角中。例如,摄像头特征位于透视视角中,而激光雷达/雷达特征通常位于 3D 或鸟瞰视角中。即使对于摄像头特征,每个特征也具有不同的视角(例如前方、后方、左侧、右侧)。这种视角差异使特征融合变得困难,因为不同特征张量中的同一元素可能对应于非常不同的空间位置(此时,简单的逐元素特征融合方法无法奏效)。
因此,找到一种共享表示至关重要,使得:(1) 所有传感器特征都能无信息损失地轻松转换到该表示中;(2) 这种表示适合于不同类型的任务。
为什么选择 BEV?
BEV 是许多 3D 感知任务(如目标检测、分割等)的自然输出空间,简化了任务设计的复杂性。
能够同时保留 几何信息 和 语义信息,解决了不同模态特征间的信息不对称问题。
视角转换的细节:
激光雷达到 BEV 的投影:
将 3D 点云的高度维度压平,生成二维的 BEV 表示。
因为点云本身是稀疏的,这种投影不会引入几何失真(与透视视角的摄像头不同)。
摄像头到 BEV 的投影:
将摄像头图像的每个像素反向投影到 3D 空间射线中,再映射到 BEV 平面。
结果:生成稠密的 BEV 特征图,完整保留摄像头捕获的语义信息。
特征转换
摄像头到 BEV 的转换并非易事,因为与每个摄像头特征像素关联的深度本质上是模糊的。参考 LSS 方法 [6],我们显式地预测每个像素的离散深度分布。然后,我们将每个特征像素散射到摄像头射线上 DD 个离散点,并根据对应的深度概率对其关联的特征进行重缩放(如图 3a 所示)。
此过程生成了大小为 $$N×H×W×$$的摄像头特征点云,其中 $$$$是摄像头的数量,$$(H,W$$ 是摄像头特征图的尺寸。这样的 3D 特征点云沿 $$x,y$$轴以步长 $$$$(例如 0.4 米)进行量化。我们使用 BEV 池化操作聚合每个 $$r×$$BEV 网格内的所有特征,并沿 $$z$$轴展平特征。
尽管 BEV 池化的实现相对简单,但其效率却出乎意料地低,在 RTX 3090 GPU 上耗时超过 500 毫秒(而模型的其余部分仅需约 100 毫秒)。造成这种情况的主要原因是摄像头特征点云的规模非常庞大:对于一个典型的工作负载,每帧可能会生成大约 200 万个点,比激光雷达特征点云的密度高出两个数量级。为了解决这一效率瓶颈,我们提出通过预计算和区间缩减来优化 BEV 池化过程。
预计算
BEV 池化的第一步是将摄像头特征点云中的每个点与一个 BEV 网格关联起来。与激光雷达点云不同,摄像头特征点云的坐标是固定的(只要摄像头的内参和外参保持不变,这通常在适当标定后是成立的)。
受到这一点的启发,我们预计算了每个点的 3D 坐标和 BEV 网格索引。我们还根据网格索引对所有点进行排序,并记录每个点的排名。在推理过程中,我们只需要基于预计算的排名重新排序所有特征点。这个缓存机制能够将网格关联的延迟从 17 毫秒减少到 4 毫秒。
区间缩减
在张量表示中,ID 会在 BEV 网格中连续分布。BEV 池化的下一步是通过某种对称函数(例如均值、最大值或求和)聚合每个 BEV 网格内的特征。如图 3b 所示,现有的实现 [6] 首先计算所有点的前缀和,然后减去边界处索引变化的值。然而,前缀和操作需要在 GPU 上进行树形归约,并且会产生许多未使用的部分和(因为我们只需要边界上的那些值),这两者都很低效。为加速特征聚合,我们实现了一个专门的 GPU 核心,该核心直接在 BEV 网格上并行化:我们为每个网格分配一个 GPU 线程,计算其区间和并将结果写回。这个核心消除了输出之间的依赖关系(因此不需要多级树形归约),并避免将部分和写入 DRAM,从而将特征聚合的延迟从 500 毫秒减少到 2 毫秒(图 3c)。
特征融合
将所有传感器特征转换为共享的 BEV 表示后,我们可以轻松地通过逐元素操作(如拼接)将它们融合在一起。尽管在相同的空间中,LiDAR BEV 特征和摄像头 BEV 特征由于视图变换器中深度的不准确,仍然可能在空间上存在一定程度的错位。为了解决这个问题,我们应用了基于卷积的 BEV 编码器(带有一些残差块)来补偿这种局部错位。我们的方法可能会从更精确的深度估计中受益(例如,通过真实深度来监督视图变换器 [42], [53]),但这一点我们将在未来的工作中进行研究。
多任务Head
我们将多个任务特定的头应用于融合后的 BEV 特征图。我们的方法适用于大多数 3D 感知任务。对于 3D 物体检测,我们遵循 [17], [49] 的方法,使用类特定的中心热图头来预测所有物体的中心位置,并使用几个回归头来估计物体的大小、旋转和速度。对于地图分割,不同的地图类别可能会重叠(例如,人行道是可行驶空间的子集)。因此,我们将这个问题表述为多个二分类语义分割任务,每个类别一个分割任务。我们遵循 CVT [8] 的方法,使用标准的焦点损失 [54] 来训练分割头。
实验结果
评估了 BEVFusion 在 相机-LiDAR 融合 上的表现,涵盖了 3D 物体检测 和 BEV 地图分割,这两个任务分别关注几何和语义信息。
训练细节
模型: 我们使用 Swin-T [57] 作为图像特征提取网络,并使用 VoxelNet [11] 作为 LiDAR 特征提取网络。我们应用 FPN [58] 来融合多尺度的相机特征,以生成大小为输入图像的 1/8 的特征图。我们将相机图像下采样到 256×704,并对 LiDAR 点云进行体素化,分别使用 0.075m(用于检测)和 0.1m(用于分割)作为体素大小。由于检测和分割任务需要具有不同空间范围和大小的 BEV 特征图,我们在每个任务特定的头部之前应用网格采样和双线性插值,显式地在不同的 BEV 特征图之间进行转换。
数据集: 我们在 nuScenes [59] 和 Waymo [60] 上评估我们的方法,这两个数据集是大规模的 3D 感知数据集,包含超过 40,000 个已标注的场景。两个数据集中的每个样本都配有 LiDAR 和周围的相机输入。
实验对比
3D目标检测
BEV地图分割
思考
这个方式类比2D上就是先通过自监督或者CLIP方式训练一个特征提取器,然后在这个特征提取上加入各种任务头进行分类、检测、分割等。但是在3D中如何得到一个好的特征提取器比较麻烦,本文将多模态输入转换到BEV表示中能尽可能多的保存下信息用到后续的各种3D任务中。