BEVFusion 算法详解 配套动态图bevfusion_dynamic.gif本文将 BEVFusion 按“统一 BEV 表示 相机/LiDAR 双流特征 BEV 空间融合 任务头”的工程主线拆解。注意学术上常见的 BEVFusion 主要有两篇代表性工作Liu et al., ICRA 2023BEVFusion: Multi-Task Multi-Sensor Fusion with Unified Bird’s-Eye View Representation重点是统一 BEV 表示、优化 BEV Pooling、多任务融合。Liang et al., NeurIPS 2022BEVFusion: A Simple and Robust LiDAR-Camera Fusion Framework重点是相机流不依赖 LiDAR、双流 BEV 特征与动态融合、LiDAR 故障鲁棒性。两者核心思想高度一致不要把一个模态强行投影到另一个模态中而是把相机和 LiDAR 的特征都变换到车体坐标系下的 BEV 平面在 BEV 空间做融合。1. BEVFusion 要解决什么问题自动驾驶感知常用Camera LiDARCamera语义丰富能看清颜色、纹理、交通标志、车道线、类别信息但天然缺深度3D 定位困难。LiDAR几何准确距离、形状、尺度强但点云稀疏远距离/小目标/语义类别信息弱。早期融合方法通常分为融合方式做法主要问题LiDAR → Camera把点云投影到图像平面再用 2D CNN 处理会造成几何扭曲3D 空间相邻关系被破坏Camera → LiDAR 点级融合把图像语义/特征“涂”到 LiDAR 点上LiDAR 点很稀疏大量图像像素特征被丢弃语义密度损失严重Proposal / Query 融合用 3D proposal 或 LiDAR query 去图像中取特征依赖 LiDAR 或候选框对地图分割等非目标任务泛化差BEVFusion相机和 LiDAR 各自编码后统一到 BEV再融合关键难点是相机到 BEV 的高效变换与跨模态对齐BEVFusion 的基本判断是对自动驾驶而言多数下游任务最终都发生在地面坐标系/鸟瞰图空间例如 3D 检测框、可行驶区域、车道线、停车区域、轨迹预测等。因此与其在 Camera View 或 Point View 中融合不如先统一到Bird’s-Eye View。2. 总体架构典型 BEVFusion 可以抽象为 5 个阶段多视角相机图像2D Backbone NeckDepth Prediction / Lift-SplatCamera BEV FeatureLiDAR 点云Voxel / Pillar EncodingSparse 3D BackboneLiDAR BEV FeatureBEV Fusion ModuleBEV Encoder3D Object Detection HeadBEV Map Segmentation HeadTracking / Motion / Occupancy 等扩展任务一句话版多相机图像 - 图像特征 - 预测深度 - 投到 BEV LiDAR 点云 - 体素/柱编码 - 3D 稀疏卷积 - 压到 BEV Camera BEV LiDAR BEV - BEV 空间融合 - 检测/分割/其他任务头3. 坐标系与 BEV 网格BEVFusion 的融合不是直接把特征张量拼起来而是先保证每个特征位置对应同一个物理空间。常见坐标系包括Camera coordinate每个相机自身坐标系。Image coordinate图像像素坐标(u, v)。LiDAR coordinate点云坐标系。Ego / Vehicle coordinate以自车为中心的统一坐标系。BEV grid把 ego 坐标系中的(x, y)离散成二维网格。假设 BEV 范围为x ∈ [x_min, x_max] y ∈ [y_min, y_max] z ∈ [z_min, z_max] resolution r meters / cell则某个 3D 点(x, y, z)会被映射到 BEV 网格i floor((x - x_min) / r) j floor((y - y_min) / r)只要 Camera BEV 和 LiDAR BEV 使用同一组范围、分辨率和自车坐标系它们就可以在 BEV 空间做逐格融合。4. 相机分支从多视角图像到 Camera BEV4.1 多视角图像编码输入通常是 6 路环视图像front, front-left, front-right, back, back-left, back-right每张图像先经过 2D Backbone 和 Neck例如ResNet / Swin Transformer / Dual-Swin-TFPN / BiFPN / 自定义 Neck得到图像特征F_img ∈ R^{N_cam × C × H × W}其中N_cam是相机数量H、W是下采样后的特征图尺寸。4.2 深度分布预测相机特征仍在透视视角中。要投到 3D/BEV需要估计每个像素可能处于哪些深度。常见做法是把深度离散为D个 bind ∈ {d_1, d_2, ..., d_D}对每个像素预测一个深度概率分布P_depth(u, v, d_k) softmax(depth_logits(u, v))同时保留该像素的语义特征f(u, v) ∈ R^C4.3 Lift沿相机射线升维对于图像像素(u, v)和深度d_k通过相机内参K反投影到相机坐标系X_cam d_k · K^{-1} [u, v, 1]^T再通过外参变换到自车坐标系X_ego T_ego_cam · X_cam对应的 3D 特征可写为F_3D(X_ego) P_depth(u, v, d_k) · f(u, v)直观理解每个图像像素不是只对应一个 3D 点而是沿着相机射线撒出一串候选 3D 点每个候选点的权重由深度概率决定。4.4 Splat / BEV Pooling聚合到 BEV 网格将上一步产生的大量 3D 特征点按(x, y)量化到 BEV cell 中然后聚合F_cam_bev(i, j) Σ P_depth(u,v,d_k) · f(u,v) for all projected points falling in cell (i, j)聚合函数可以是summeanmaxlearned poolingICRA 2023 的 BEVFusion 重点优化了这一步相机特征升维后点数巨大朴素 BEV Pooling 会非常慢。论文使用precomputation interval reduction优化 BEV PoolingPrecomputation相机标定和深度 bin 固定时像素-深度点落到哪个 BEV grid 可以提前算好。Sorting / Rank把属于同一 BEV grid 的点排在一起。Interval Reduction对每个 BEV grid 直接做区间聚合避免大量无用 prefix-sum 中间结果。这样可以把相机到 BEV 的变换从主要瓶颈变成可实时部署的模块。5. LiDAR 分支从点云到 LiDAR BEVLiDAR 输入是点集合P {(x_i, y_i, z_i, intensity_i, timestamp_i, ...)}典型流程如下5.1 Voxelization / Pillarization把点云划分为体素或柱voxel floor((point - range_min) / voxel_size)VoxelNet / SECOND / CenterPoint使用 3D voxel sparse convolution。PointPillars把高度方向压成 pillar更轻量。5.2 点特征编码每个 voxel/pillar 内部的点经过 PointNet-like MLP 或其他编码器得到局部几何特征F_voxel ∈ R^{N_voxel × C}5.3 Sparse 3D Backbone Height Compression使用稀疏 3D 卷积提取空间特征然后沿高度维压缩到 BEVF_lidar_bev ∈ R^{C_l × H_bev × W_bev}LiDAR BEV 的优点是几何位置准缺点是语义密度低远处目标和小目标容易稀疏。6. BEV 空间融合模块当相机和 LiDAR 都变成同一个 BEV 网格后就可以融合F_cam_bev ∈ R^{C_c × H × W} F_lidar_bev ∈ R^{C_l × H × W}最简单的融合是拼接F_cat Concat(F_cam_bev, F_lidar_bev) F_fuse Conv(F_cat)但实际中常加入注意力/动态选择A sigmoid(MLP(GAP(F_cat))) F_fuse A ⊙ Conv(F_cat)含义是某些区域 LiDAR 可靠例如近距离车辆轮廓、3D 尺寸某些区域 Camera 可靠例如远处目标类别、道路标线、交通语义动态融合让网络按区域/通道选择更有价值的模态信息。ICRA 2023 版本在融合后使用fully-convolutional BEV encoder用于进一步融合上下文并缓解相机深度估计带来的局部错位。NeurIPS 2022 版本则强调Dynamic Fusion Module包含 channel/spatial fusion 和 adaptive feature selection。7. 任务头设计7.1 3D Object Detection HeadBEVFusion 常接 CenterPoint / TransFusion / anchor-free 或 anchor-based 检测头。检测输出通常包括类别 heatmap 中心点偏移 offset 高度 z 尺寸 w, l, h 朝向 yaw 速度 vx, vy常见损失L_det L_heatmap λ_box · L_box λ_vel · L_vel其中heatmap 常用 focal lossbox regression 常用 L1 / Smooth L1yaw 可用 sin/cos 或方向分类 回归。7.2 BEV Map Segmentation Head地图分割输出可包括drivable areapedestrian crossingwalkwaylane dividerstop linecarpark area由于类别之间可能重叠常做多标签二分类F_fuse - Conv Head - K binary masks损失可用L_seg Σ_k FocalLoss(mask_k, gt_k)7.3 多任务学习总损失可写为L_total λ_det · L_det λ_seg · L_seg λ_aux · L_auxBEVFusion 的优势之一是检测、地图分割、跟踪、占用预测等任务都可以共享同一 BEV backbone仅替换或增加任务头。8. 训练流程一个工程化训练流程通常如下1. 准备数据多相机图像、LiDAR 点云、标定参数、3D box、BEV map 标签 2. 数据增强图像增强 点云增强 BEV 空间增强 3. 图像分支2D Backbone/FPN - depth distribution - Camera BEV 4. 点云分支voxelization - sparse 3D backbone - LiDAR BEV 5. BEV 融合concat/attention/dynamic fusion - BEV encoder 6. 任务头检测头 分割头 7. 损失回传端到端更新或先单模态预训练再融合训练8.1 数据增强要点BEVFusion 中最容易出错的是几何一致性。如果对图像做 resize/crop/flip需要同步更新相机内参或图像增强矩阵如果对点云做全局旋转/缩放/翻转需要保证 BEV 标签、LiDAR 点和相机投影关系一致。实践中常使用image resize / crop / flip / color jitterLiDAR global rotation / scaling / translationBEV-space random flip / rotate / scalemodality dropout用于增强单模态故障鲁棒性9. 推理流程伪代码# imgs: [N_cam, 3, H, W]# points: [N_points, point_dim]# calib: camera intrinsics/extrinsics, ego transformsimg_featsimage_backbone_and_neck(imgs)# Camera branchimg_context,depth_logitsdepth_net(img_feats)depth_probsoftmax(depth_logits,dimdepth)frustum_featureslift(img_context,depth_prob,calib)cam_bevefficient_bev_pool(frustum_features,calib,bev_grid)# LiDAR branchvoxelsvoxelize(points,voxel_size,point_cloud_range)lidar_bevsparse_lidar_backbone(voxels)# Fusioncam_bev,lidar_bevalign_resolution(cam_bev,lidar_bev)fusedfusion_module(concat(cam_bev,lidar_bev))fusedbev_encoder(fused)# Task headsboxesdetection_head(fused)bev_maskssegmentation_head(fused)returnboxes,bev_masks10. 为什么 BEVFusion 有效10.1 避免语义密度损失点级融合只把图像特征赋给 LiDAR 点。对于 32 线 LiDAR点云远比图像像素稀疏大量图像特征会被浪费。BEVFusion 让所有图像特征通过 depth distribution 投到 BEV因此保留了更完整的语义密度。10.2 避免几何扭曲把 LiDAR 投到图像平面会让真实 3D 空间的邻近关系被透视投影扭曲。BEV 空间更接近地面移动场景的真实几何拓扑。10.3 支持多任务3D 检测框、地图分割、道路结构、轨迹预测都天然适合 BEV 表示所以 BEVFusion 不需要为每个任务重新设计融合逻辑。10.4 对 LiDAR 故障更鲁棒NeurIPS 2022 的 BEVFusion 特别强调相机流不依赖 LiDAR 点作为 query。即使 LiDAR 局部缺失或 FOV 受限相机流仍然可以生成 Camera BEV系统不会完全失效。11. 与相关方法对比方法核心思路融合位置优点局限PointPainting图像语义涂到点云点级简单易接 LiDAR 检测器图像特征利用率低依赖点云密度MVXNet / EPNet图像特征与点云局部融合点/体素级可增强点云语义仍以 LiDAR 为主跨任务泛化弱TransFusion通过 object query 融合图像特征proposal/query 级3D 检测强更偏检测任务依赖候选/查询BEVDet / LSS相机投到 BEVCamera-only BEV无 LiDAR成本低几何精度依赖深度估计BEVFusionCamera 和 LiDAR 都转 BEV 后融合BEV 特征级几何 语义兼顾多任务强依赖标定、深度估计、BEV pooling 效率12. 工程实现关键点12.1 标定精度Camera-to-BEV 极度依赖内外参。如果外参偏差Camera BEV 与 LiDAR BEV 会错位融合反而可能变差。12.2 BEV 分辨率分辨率越小定位越精细但计算和显存越大。常见选择0.1m / 0.2m / 0.4m per cell检测任务通常需要更细地图分割可以根据场景取舍。12.3 深度 bin 设计深度 bin 太少会投影粗糙太多会使 BEV pooling 点数暴增。可以用uniform depth binsnon-uniform binsdepth supervisiontemporal depth refinement12.4 模态缺失训练如果要部署到真实系统建议训练时加入camera dropoutLiDAR dropoutLiDAR foreground droppinglimited FOV simulationrainy/night/domain augmentation这样推理时某个模态退化不会导致系统崩溃。12.5 实时性优化主要耗时点多相机 2D backboneCamera-to-BEV view transformationSparse 3D backboneBEV encoder heads优化方向轻量 backbonehalf precision / TensorRToptimized BEV pooling CUDA kernelprecompute projection index减小 depth bins 或 BEV 范围多任务共享 BEV encoder13. BEVFusion 的局限对标定敏感多相机和 LiDAR 外参错误会造成 BEV 错位。相机深度估计仍是难点远距离、遮挡、低光照下 Camera BEV 可能不稳定。BEV pooling 显存压力大多相机、高分辨率、大 depth bins 会产生海量 frustum points。时间信息利用不足原始 BEVFusion 主要是单帧工程上常需要融合多帧/时序模块。多模态同步要求高相机和 LiDAR 时间戳不同步会影响动态目标定位。14. 一句话总结BEVFusion 的本质不是“把相机贴到点云上”而是把 Camera 的 dense semantic feature 和 LiDAR 的 accurate geometric feature 都映射到自车坐标系下的 BEV 网格再在 BEV 空间用卷积/注意力进行统一融合最后共享给检测、分割等多任务头。这也是它相比传统点级融合更适合自动驾驶多任务感知的根本原因。15. 参考资料Liu, Zhijian, et al.BEVFusion: Multi-Task Multi-Sensor Fusion with Unified Bird’s-Eye View Representation.ICRA 2023 / arXiv:2205.13542. https://arxiv.org/abs/2205.13542MIT HAN Lab official implementation: https://github.com/mit-han-lab/bevfusionLiang, Tingting, et al.BEVFusion: A Simple and Robust LiDAR-Camera Fusion Framework.NeurIPS 2022 / arXiv:2205.13790. https://arxiv.org/abs/2205.13790ADLab-AutoDrive official implementation: https://github.com/ADLab-AutoDrive/BEVFusionMMDetection3D model zoo and BEVFusion baselines: https://mmdetection3d.readthedocs.io/en/latest/model_zoo.html