1. 从“各说各话”到“同台对话”:为什么我们需要统一的BEV空间?

如果你玩过那种需要组队合作的游戏,比如《英雄联盟》或者《守望先锋》,你肯定知道沟通有多重要。想象一下,你的队友一个在用英语报点,一个在用中文,还有一个在用摩斯电码,这团战还怎么打?自动驾驶系统里的摄像头、激光雷达(LiDAR)和毫米波雷达,在感知世界时,就有点像这些说不同“语言”的队友。

摄像头拍的是2D的彩色照片,它特别擅长“看”东西——识别这是辆车、那是个行人、远处还有个红绿灯,语义信息非常丰富。但它有个致命弱点:它不知道物体离自己到底有多远。一个像素点,可能对应着前方1米处的一片叶子,也可能对应着100米外的一栋大楼。激光雷达则恰恰相反,它通过发射激光束并接收反射,能生成精确的3D点云,每个点都有准确的(x, y, z)三维坐标,几何结构信息一流,但它“看”东西没那么“懂”,点云是稀疏的,而且缺乏颜色和纹理细节。毫米波雷达则对速度非常敏感,但空间分辨率很低。

过去,为了让这些传感器“合作”,工程师们想了不少办法。最常见的一种思路叫“点级融合”(Point-level Fusion),比如大名鼎鼎的PointPainting。它的做法是:先用摄像头识别出图像里每个像素是什么(比如“汽车”),然后把这些语义标签像喷漆一样,“喷”到激光雷达那些对应的3D点上。听起来很直观对吧?但问题就出在这个“对应”上。

激光雷达的点太稀疏了!一篇论文里给出了一个让我印象深刻的数字:对于一个典型的32线激光雷达,一次扫描能打到的点,大概只有摄像头像素总数的5%左右。这意味着,摄像头辛辛苦苦识别出的95%的丰富语义信息,在融合时直接被丢弃了!这就像你队友用中文说了十句关键的战术信息,但你只听懂了其中半句,这仗还怎么赢?尤其是对于BEV地图分割这种极度依赖密集语义信息的任务,点级融合的效果就大打折扣。

另一种思路是把激光雷达点投影到摄像头图像上,做成RGB-D深度图,然后用处理2D图像的方法来处理。但这就引入了严重的几何失真——图片上挨着的两个点,在真实3D空间里可能相距十万八千里,这对于需要精确几何位置的3D物体检测来说,简直是灾难。

所以,我们需要一个“通用翻译官”,一个所有传感器都能无障碍“发言”、且信息无损的“会议室”。这个会议室,就是鸟瞰图(Bird‘s-Eye View, BEV)空间。在BEV空间里,我们从上往下俯视整个场景,x和y轴构成地面平面,这天然符合我们对驾驶环境的认知(地图也是2D的)。更重要的是,将不同传感器的特征转换到这个空间时,可以最大程度地保留各自优势:激光雷达的3D点云可以轻松“压扁”成2D BEV特征图而不损失几何结构;摄像头的特征也可以通过一定的技术,生成密集的BEV特征图,保留其语义密度。这样一来,大家就在同一个频道上了,融合变得简单而高效。BEVFusion的核心突破,正是率先系统性地构建并优化了这个“统一BEV空间”的完整框架。

2. BEVFusion核心组件拆解:从数据到决策的流水线

理解了为什么需要BEV空间,我们来看看BEVFusion具体是怎么搭建这条高效流水线的。整个过程可以类比为一条现代化的汽车装配线,每个环节都经过精心设计,确保最终产品的质量和速度。

2.1 单模态编码器:提取原始“素材”

流水线的起点是原材料加工。对于摄像头输入的连续多帧图像,BEVFusion会使用一个成熟的2D卷积神经网络(CNN)主干网络(比如ResNet或Swin Transformer)来提取特征。这个网络会把高分辨率的图片变成一系列富含语义信息的特征图,它知道哪里是车轮,哪里是车窗,但暂时还不知道它们具体在三维世界的哪个位置。

对于激光雷达点云,处理方式有所不同。点云是一堆无序的(x, y, z,反射强度)点集合。这里通常采用体素化(Voxelization)的方法,把3D空间划分成一个个小格子(体素),将落在同一个格子里的点云特征(比如使用PointNet提取的局部特征)聚合起来。然后,使用稀疏3D卷积网络(如SparseConvNet)对这些体素进行特征提取。这一步的输出是3D的体素特征,已经具备了一定的几何结构感知能力。

2.2 视角转换器:将素材“搬运”到统一车间

这是BEVFusion最精妙也最关键的环节,尤其是对于摄像头特征的处理。我们需要把摄像头在2D图像平面上看到的特征,“搬运”到3D的BEV空间。这就像要根据一张平面照片,复原出照片里每个物体在真实世界中的位置,难度可想而知。

BEVFusion借鉴并大幅优化了LSS(Lift, Splat, Shoot)的思想。具体来说,对于摄像头特征图上的每一个像素点,网络不再简单地猜测一个深度值,而是预测一个深度概率分布。比如,一个像素可能对应着距离摄像头5米、10米、15米……等多个深度,每个深度都有一个概率。这个过程由一个可学习的“视角转换模块”完成。

接下来是“Lift”(提升):每个像素特征会根据它的深度分布,被“复制”并投射到多条不同深度的3D空间射线上,形成一个庞大的、带有特征权重的3D点云。然后是“Splat”(展开):将这些3D点根据它们的(x, y)坐标,落入对应的BEV网格中。同一个BEV网格里可能会落入来自不同摄像头、不同像素的多个点,这时就需要用一个聚合函数(比如求和或求平均)把这些特征融合起来,最终形成一张密集的2D BEV特征图。这张图上的每个格子,都包含了来自摄像头视角的、丰富的语义信息。

对于激光雷达,这一步就简单多了。因为经过3D稀疏卷积提取的特征已经是3D体素格式,我们只需要沿着高度(Z)轴方向,将不同高度的体素特征压缩(例如通过卷积或最大池化)聚合,直接投影到2D BEV平面上,就得到了激光雷达的BEV特征图。这张图的特点是几何位置精准,但相对稀疏。

2.3 BEV特征融合与编码:在车间里“组装”

现在,我们有了两张来自不同车间的“半成品”:一张是语义密集但位置可能略有偏差的摄像头BEV特征图,另一张是位置精准但语义稀疏的激光雷达BEV特征图。它们已经被“搬运”到了同一个BEV车间,坐标系统一了。

融合的第一步非常简单直接——拼接。将这两张特征图在通道维度上直接连接起来,形成一个融合特征图。然而,由于摄像头深度估计可能存在微小误差,两张特征图在局部区域可能没有完全对齐(比如摄像头特征里的“车头”和激光雷达特征里的“车头”在BEV格子上差了一两个像素)。

为了解决这个细微的错位,BEVFusion并没有使用特别复杂的结构,而是采用了一个经典的基于卷积的BEV编码器(通常由多个残差卷积块组成)。这个编码器的作用就像一位经验丰富的装配工人,他能通过观察拼接后的特征,自适应地调整和融合局部信息,让两种特征更好地对齐和互补,最终输出一个更强大、更统一的BEV特征表示。

2.4 多任务头:定制化“出厂”

拿到了统一的、高质量的BEV特征,我们就可以在上面安装不同的“工具头”,来完成各种下游任务,而无需改动前面的流水线。这就是BEVFusion“通用框架”威力的体现。

对于3D目标检测,常见的做法是采用“中心点热图”预测。网络会学习预测一个热力图,热点位置就是物体的BEV中心。然后,再通过回归头预测这个位置物体的长、宽、高、朝向、速度等属性。由于BEV特征本身包含了丰富的几何和语义信息,这种检测方式非常自然且高效。

对于BEV地图分割,任务是在BEV平面上对每个像素进行分类,判断它是车道线、可行驶区域、人行道还是障碍物等。这可以被建模为多个二值分割问题。直接在统一的BEV特征上接一个轻量的分割头(通常是几层卷积),就能取得非常好的效果。因为摄像头提供的密集语义信息在这里得到了淋漓尽致的发挥。

3. 性能飞跃的关键:如何将视角转换加速40倍?

在最初的LSS等方法中,虽然思路正确,但有一个巨大的性能瓶颈,导致它在实际应用中,特别是对实时性要求极高的自动驾驶场景里,几乎不可用。这个瓶颈就是“视角转换”模块中的BEV池化操作。论文里提到,在未优化的版本中,仅这一步就占用了模型总推理时间的80%以上,耗时超过500毫秒!这显然是不可接受的。

BEVFusion的作者们像性能调优专家一样,对这里进行了深度剖析和外科手术式的优化,最终将这部分延迟从500+毫秒降到了惊人的12毫秒,实现了超过40倍的加速。他们是怎么做到的呢?这主要归功于两项关键技术:预计算和区间约简。

预计算 的核心思想是:对于一辆车,只要摄像头和激光雷达的安装位置和参数(内参、外参)固定不变,那么从摄像头图像像素到BEV网格的映射关系就是完全确定的!无论图像内容怎么变,一个像素点(比如图像左上角)对应的3D射线以及它可能落入的BEV网格范围是不会变的。因此,我们可以提前离线计算好两样东西:1)每个像素在所有离散深度下对应的3D坐标;2)这些3D坐标最终落在哪个BEV网格里,并记录下网格索引。在推理时,我们就不再需要实时进行复杂的坐标变换和投影计算,只需要根据预先算好的索引,把特征“放到”对应的格子里去。这一步优化,将“网格关联”的耗时从17毫秒降到了4毫秒。

区间约简 优化的是特征聚合这一步。在BEV池化中,同一个BEV网格里可能会落入很多个特征点,我们需要将它们聚合(比如求和)起来。传统的实现方式使用了“前缀和”算法:先计算所有特征点的累积和,然后通过索引边界做减法得到每个网格的和。这种方法在GPU上会产生大量不必要的中间计算和内存访问,效率很低。

BEVFusion实现了一个定制的、高效的GPU内核。它的思路非常直接:为每一个BEV网格分配一个独立的GPU线程。这个线程只负责计算自己这个网格内所有特征点的和。由于网格之间完全独立,不存在计算依赖,因此可以极致并行。同时,它避免了将大量中间部分和写入显存,极大地减少了内存带宽压力。这项优化堪称“神来之笔”,将特征聚合的耗时从近500毫秒直接压缩到了2毫秒!

正是这两项紧密结合的工程优化,彻底打通了摄像头到BEV转换的任督二脉,使得在共享BEV空间中进行实时、高效的多传感器融合从理论变为现实。这也告诉我们,一个好的算法框架,离不开极致的工程实现。

4. 实战体验:复现BEVFusion的核心步骤与调参心得

读论文是一回事,自己动手跑起来又是另一回事。下面我结合自己折腾BEVFusion代码的经验,分享一些关键步骤和容易踩坑的地方,希望能帮你更快地上手。

环境搭建与数据准备 这是第一步,也是劝退很多人的一步。BEVFusion的官方代码库依赖比较明确,主要是PyTorch、MMDetection3D(一个强大的3D检测工具箱)和SpConv(稀疏卷积库)。我的建议是严格按照官方提供的Dockerfile来构建环境,能避免99%的依赖冲突问题。数据方面,你需要下载nuScenes数据集,这个数据集很大(约300GB),包含了丰富的摄像头、激光雷达和标注信息。下载后,需要使用官方提供的脚本进行数据预处理,将原始数据转换成模型需要的格式。这个过程比较耗时,建议挂机运行。

关键配置文件解析 BEVFusion的配置系统继承自MMDetection3D,通过.py文件管理所有超参数。有几个文件你需要特别关注:

  • bevfusion/configs/bevfusion/ 下的配置文件,比如 bevfusion_lidar-cam_voxel0075_second_secfpn_8xb4-cyclic-20e_nus-3d.py,这个文件名虽然长,但信息量很大,它告诉你了用的融合模态(lidar-cam)、体素大小(0.075米)、3D主干网络(SECOND)、训练策略(周期20epoch)和数据集(nus-3d)。
  • 配置文件里会定义数据流水线、模型结构(编码器、视角转换器、融合头等)、训练和测试策略。如果你想修改模型,比如换一个摄像头主干网络(从ResNet换成Swin-T),通常只需要在这里改几行配置,体现了模块化设计的优势。

训练与调试技巧 由于模型较大,数据量也大,训练BEVFusion需要强大的GPU(建议至少2-4张A6000或4090级别的卡)。启动训练后,重点关注Tensorboard或日志里的几个损失曲线:

  • 摄像头的深度估计损失:这反映了视角转换模块学习的好坏。如果这个损失下降很慢或震荡,可能需要检查学习率或数据预处理是否正确。
  • 检测任务的分类损失和回归损失:观察它们是否平稳下降。
  • 验证集上的mAP和NDS指标:这是最终效果的体现,通常每训练一个epoch都会评估一次。

我踩过的一个坑是学习率设置。因为模型包含图像CNN、稀疏卷积、视角转换器等多个部分,它们收敛速度可能不同。官方配置通常使用了“一维周期学习率”策略,效果不错。如果你资源有限想用小批量训练,切记要按线性规则缩放学习率,而不是简单地用原来的值,否则很容易训崩。

推理与可视化 训练完成后,用测试集进行推理,并生成预测结果。MMDetection3D提供了很好的可视化工具。你可以将模型预测的3D框和BEV分割结果,与真实标注一起渲染出来,直观地感受模型性能。特别要注意观察一些困难场景,比如远处的小物体、被部分遮挡的车辆、以及夜间或雨天的数据,看看融合模型是否真的比单模态模型有提升。通过可视化,你能更深刻地理解BEV特征空间里到底发生了什么。

5. 超越BEVFusion:当前局限与未来演进方向

BEVFusion无疑树立了一个强大的基线,但技术总是在不断前进。结合论文提到的局限和我自己的观察,我们来看看这个方向还有哪些可以深挖的点。

多任务学习的“跷跷板”效应 论文中提到,BEVFusion在联合训练检测和分割任务时,出现了性能下降,而不是理想的相互促进。这在多任务学习中很常见,被称为“负迁移”或“跷跷板效应”。可能的原因是,检测任务更关注前景物体(车、人),而BEV分割任务需要平等对待前景和背景(路面、车道线)。两个任务的梯度在共享的BEV编码器部分可能会发生冲突。未来的工作可能需要设计更精巧的多任务优化策略,比如梯度手术、动态权重调整,或者为不同任务设计部分独立的特征通路,在共享和专有之间找到更好的平衡。

深度估计的精度瓶颈 BEVFusion的摄像头到BEV转换,其精度上限取决于视角转换模块预测的深度分布质量。目前这部分是自监督学习的,没有用到激光雷达提供的精确深度真值进行强监督。一个很自然的改进方向是引入深度估计的辅助损失,用激光雷达点云作为监督信号,让网络学会预测更准确的深度。这可能会带来融合特征对齐精度的进一步提升,从而惠及所有下游任务。已经有后续工作(如BEVDepth)在这方面进行了探索并取得了效果。

时序信息的融入 原始的BEVFusion主要处理单帧数据。但自动驾驶是连续的过程,时序信息至关重要。后续的许多工作,如BEVDet4D、BEVFormer,都成功地将多帧历史信息(通常是连续几帧的BEV特征)引入模型,通过3D卷积或时空Transformer进行融合,极大地提升了速度估计的准确性和整体感知的稳定性。如何将BEVFusion的高效多传感器融合与强大的时序建模能力结合,是一个非常有价值的方向。

面向更复杂传感器与极端场景 目前BEVFusion主要融合摄像头和激光雷达。但在实际应用中,毫米波雷达的成本和全天候优势不容忽视。如何将毫米波雷达这种数据模态(通常是稀疏的、带有多普勒速度信息的点云)也优雅地融入统一的BEV框架,是一个工程和算法上的挑战。此外,对于极端天气(大雾、暴雨、大雪)、强烈眩光等场景,多传感器融合的鲁棒性仍需大量真实世界数据的锤炼和算法的针对性增强。

部署与硬件协同优化 最后,从研究到落地,还有很长的路要走。BEVFusion虽然通过预计算和区间约简大幅提升了速度,但其整体计算量对于车规级芯片(如英伟达Orin、地平线征程系列)仍然是一个挑战。未来的工作可能需要从模型轻量化(知识蒸馏、量化、剪枝)、算子深度优化以及与特定硬件计算单元(如Tensor Core、NPU)的协同设计等方面入手,真正实现高性能、低功耗的车端部署。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐