
自动驾驶圈子的技术风向在2022年有过一次非常明显的转向大家开始把多相机感知模型的输出从“图像坐标下的2D框”统一改成了“车体坐标系下的鸟瞰图”。BEV-former就是这股浪潮里几乎绕不开的一个名字。我最早注意到这篇工作是看组里同事跑完nuScenes评测后在群里贴出的结果当时还在用LSS路线的我们第一反应不是“涨点了”而是“原来深度估计可以不这么费劲”。这篇博文就围绕BEV-former做一次完整的简读重点放在它到底解决了什么问题、框架内部是怎么设计的、和LSS这类老方案差在哪、以及复现和工程落地时最容易踩的几个坑适合正在做BEV感知、多相机3D检测或者刚准备入行自动驾驶感知的同学参考。BEV-former的全称是Learning Birds-Eye-View Representation from Multi-Camera Images via Spatiotemporal Transformers出自华中科技大学和地平线。它的核心贡献可以概括为一句话用Transformer的注意力机制把多个相机拍摄到的图像特征直接转换到自车坐标系下的鸟瞰视角特征整个过程不依赖显式的深度估计网络。听上去好像不复杂但要在工程上真正跑通里面塞满了值得细抠的设计点。1. 在BEV-former之前多相机感知要解决哪三个关键难题1.1 图像视角下目标尺度差异太大统一到同一坐标系很难摄像头装上车之后不同位置的相机看到的同一辆车大小和形状完全不一样。前视相机里一辆卡车可能占满半个画面侧视相机里同一辆卡车可能只有一小块。如果模型在图像坐标系下做检测每个目标都要先解决“这个框在图像里有多大”的问题不同相机的特征也很难直接对比。更麻烦的是后续的规划控制模块根本不需要“图像坐标下的框”它需要的是“这辆车在自车前方多少米、偏左多少度、有多长多宽”这样的三维空间信息。这就逼着感知系统必须把多视角信息转换到底盘中心为原点的三维坐标系里而鸟瞰视角恰恰是规划控制最熟悉的表达方式之一。1.2 单目图像缺少深度维度3D定位能力先天不足单目相机成像本质上是把三维世界压到二维平面丢失了深度信息。人可以通过双目、运动视差、物体先验尺寸来弥补深度感知但模型不会天生具备这种能力。当时很多方案选择在2D检测后面再接一个深度回归分支或直接预测3D框中心效果都不太稳定。LSS这类方案走的是另一条路先给每个像素预测一组离散深度分布再把像素特征“撒”到三维空间里。这个方法思路清晰但深度分布预测的质量直接决定整个下游效果而弱纹理区域、夜间反光、远距离小目标恰恰是深度预测最容易崩的地方。1.3 多相机特征缺乏统一交互后处理融合容易出错传统多相机系统通常是“每路相机单独检测最后把结果投影到车体坐标系再做后融合”。这种方案实现简单但有几个顽固问题同一辆车被两个相机同时看到时图像特征层面完全没有交互后融合阶段只能靠手工规则处理重叠检测和置信度冲突相机盲区里的目标容易漏检另外图像特征也没有机会在不同视角之间互补。真正理想的做法是把所有相机图像特征先放到同一个空间里做充分交互再统一决策而不是各算各的。BEV-former正是朝着这个方向走的一步它不手工设计复杂的跨相机规则而是通过注意力机制让每个BEV位置自发地去多个相机图像里找信息。2. BEV-former核心机制拆解如何用Query把“图像空间”扭成“鸟瞰空间”2.1 整体前向流程我们按数据流顺序把BEV-former过一遍。输入是环视多相机图像通常6个相机前后左右各方向覆盖360度。图像先过一个主干网络ResNet类和FPN得到多尺度图像特征。与此同时模型初始化一组BEV Query形状类似于[H, W, C]默认常见设置里H和W都是200左右可以理解为把车体周围的一大片区域划分成200×200个网格每个网格对应空间中一个柱状区域。随后这些BEV Query经过若干层Transformer编码器层每层里依次做时间自注意力、空间交叉注意力和前馈网络最后输出一个稠密的BEV特征图。拿到BEV特征之后再接入3D检测头、地图分割头等任务头输出目标类别、3D中心点、尺寸、朝向角等结果。这个流程里最关键的设计全部在这几个Transformer编码器层里。下面逐个拆。2.2 BEV Query到底“查”的是什么理解BEV-former最关键的是理解BEV Query。它本质上是一组可学习的网格化特征每个网格点都对应车体周围固定的一个物理位置。好比你在停车场俯视图上打了一张方格纸每个格子是一个“虚拟传感器”它负责感知自己对应区域里有没有东西、东西长什么样。问题来了这个虚拟传感器怎么看到真实世界方法不是直接给它图像而是让它在三维空间里向周围“提问”。每个BEV Query会生成一组三维参考点默认做法是在该网格对应的柱体内、高度方向上采样若干个锚点覆盖路面到常见车辆顶部的高度范围。这些三维参考点通过相机内外参投影到各个相机的图像平面上然后去对应图像特征里采样。这样每个BEV Query就完成了从“车体坐标系的某个位置”到“多个相机图像的某些像素”的映射再通过注意力机制把图像信息拉回自己的特征里。这种设计最大的好处是空间位置关系从结构上被显式编码了。同一辆车出现在前视和侧视相机里在图像空间可能完全不重叠但在BEV空间它们会落到相邻的网格特征之间天然可以相互补充。这也是BEV Query和普通2D anchor的本质区别——它的人生坐标从一开始就是物理坐标系。2.3 空间交叉注意力从3D参考点到像素采样的投影逻辑空间交叉注意力是BEV-former把图像信息“搬”到BEV空间的核心环节。简化描述如下# 伪代码单个BEV Query的空间交叉注意力计算 for bev_query in BEV_queries: # [200, 200, C] ref_3d_pts height_anchors(bev_query) # 每个query生成一组3D参考点 image_pts project(ref_3d_pts, camera_intrinsics, camera_extrinsics) for cam_feat in multi_camera_features: if point_in_image(image_pts[cam]): sampled deformable_attention(cam_feat, image_pts[cam]) fused sampling_weight * sampled bev_out FFN(bev_query fused)每个3D参考点投影到某路相机后如果落在图像范围内就参与计算如果落在图像外直接跳过。这个“跳过”很关键相当于用相机内外参做了一次几何先验的注意力mask模型不会盲目去图像外面找信息。采样式注意力用的是Deformable Attention而不是标准多头自注意力。原因很现实图像特征图的尺寸不小如果用全局注意力每个BEV Query都要和所有图像位置做相似度计算计算量直接爆炸。可变形注意力只让每个Query预测一组采样偏移量在参考点周围取固定数量的采样点做注意力比如默认每层取4到8个点跨多个尺度特征图并行采样。这样一来计算量从全图的O(NM)降到了O(NK)K是常数训练和推理都扛得住。2.4 时间自注意力让遮挡目标不“消失”BEV-former能显著超越当时同类方案另一个关键设计是时间维度上的信息融合也就是时间自注意力。车辆在行驶过程中某一时刻被完全遮挡的目标可能在前几帧里是可见的。纯空间模型一旦目标被挡住就直接丢失了这个目标的特征。BEV-former的做法是保留前几帧的BEV特征在时间自注意力里让当前帧的BEV Query去和历史BEV特征做交互。这里有一个隐藏的细节车辆在运动当前帧自车坐标系下历史BEV里的目标位置会因为自车移动而偏移。比如前帧时目标在自车正前方10米这帧自车往前开了2米同一目标在当前坐标系下应该变成前方8米。如果不做任何处理让当前Query直接去历史特征里采样位置一定错位。BEV-former的处理方式是先用自车运动信息对历史BEV特征做坐标变换对齐再输入到时间自注意力里。第一帧没有历史信息时就用当前帧自身做了个占位初始化这个细节在复现时很容易漏掉。时间信息带来的收益在实测中非常明显。动态目标被前车挡住一两秒、行人在路旁树木后短暂消失、远处目标闪烁出现又消失这些场景加入时序融合后的检测稳定性都会好不少。2.5 多尺度融合和可变形注意力省算力的关键BEV-former的特征提取主干采用了类似FPN的多尺度结构浅层特征分辨率高、细节丰富深层特征语义强、抗干扰好。空间交叉注意力会在多个尺度的图像特征图上各自采样再把结果融合起来。这样小目标可以从高分辨率层拿到充分的纹理信息大目标又能从低分辨率层获得整体语义效果比单尺度稳很多。但多尺度也意味着要存储更多的特征图显存压力随之上来。所以在工程里大家一般会调整三个参数来控制计算开销BEV网格的尺寸、Transformer编码器层数、每个Query在每层采样的点数。论文默认配置相对激进复现的时候如果只有少量显卡先把H和W从200降到128甚至100效果损失通常不会太大但显存能省下将近一半。这点后面专门展开说。3. 横向对比BEV-former与LSS、传统方案的差异到底在哪3.1 LSS路线的核心思路回顾LSS全称Lift-Splat-Shoot是BEV感知里非常有代表性的早期路线。它的关键步骤是“lift”和“splat”。Lift阶段对图像上每个像素预测一组离散深度概率分布比如把5米到50米范围划分成几十个深度bin每个像素每层深度都对应一个可能的3D视锥点然后把图像特征按深度概率加权后“抬升”到三维空间。Splat阶段把这些三维点按照相机内外参累积到BEV网格里通过求和或者池化得到BEV特征。LSS的优点是思路直白深度分布可解释早期在多个任务上验证了BEV表达的价值。缺点是深度预测本质上是一个逐像素的高自由度任务计算量大而且一旦深度分布不准后面的BEV特征就是“地基偏移的大楼”。很多工程团队都会被迫在训练时加深度监督或安装激光雷达生成的深度标签来稳住深度分支这让数据成本变得很高。3.2 BEV-former走的完全是另一条路BEV-former没有逐像素深度预测这个中间步骤。它用空间交叉注意力直接学习“BEV网格里某个位置应该去图像哪里找信息”这个映射关系。投影点的位置由相机内外参决定但采样哪些像素、各采样点的重要程度全部由注意力自己学习。从数学上看LSS做的是Explict Depth DistributionBEV-former做的是Implicit Spatial Attention。前者先把图像特征推到三维空间再做池化后者把BEV位置主动投影回图像然后拉取特征。两者最终都在BEV空间工作但误差来源、计算特性和训练难度都不一样。最直观的差异是LSS的效果很难脱离深度分支的精度BEV-former则把这个问题转化为“学习在什么地方采样”的注意力问题边界更柔性。3.3 关键维度对比表维度LSS路线BEV-former2D到3D映射显式深度分布预测隐式注意力采样对深度标注依赖强可配合LiDAR深度标签弱纯视觉即可训练主要计算瓶颈逐像素×逐深度binBEV Query×采样点数多相机交互splat阶段特征累加注意力跨相机拉取信息时序扩展需额外设计时序融合模块内置时间自注意力稠密BEV特征有有落地难点深度预测稳定性训练成本高、收敛较慢3.4 为什么说BEV-former更“抗造”我自己在项目里体会最深的一点是BEV-former对弱纹理和反光区域的鲁棒性明显更好。LSS路线的深度分支在天空、白色卡车侧面、夜间大面积阴影这类区域预测出的深度分布往往散成一片splat之后特征像蒙了一层雾。BEV-former的注意力机制则更偏向寻找有辨识度的特征点比如车辆边缘、轮胎和地面的接触点、车道线端点这些区域特征清晰投影位置也更稳定所以最终BEV特征噪声更低。不过BEV-former并不是没有代价。Transformer的收敛速度比LSS慢训练需要的数据量和算力都要上一个大台阶。小规模数据集上LSS反而可能更容易训出可用的模型。所以做技术选型时不能只看精度的上限还要看团队手里有多少数据、多少卡、多久迭代一轮。4. 从论文到工程训练、调参、部署中最影响效果的细节4.1 端到端训练与标签分配机制BEV-former的检测头沿用了DETR系列的集合预测范式。训练时模型输出一组预测框用匈牙利匹配算法在预测框和真实框之间做最优匹配然后计算分类损失和回归损失。分类损失通常用Focal Loss回归损失是L1 Loss和GIoU Loss的组合。由于有匈牙利匹配整个过程是端到端训练的不需要像传统检测器那样设计Anchor匹配策略、不需要NMS后处理这也让整个系统简洁不少。这个设计有一个容易被忽略的训练技巧匹配阶段只关心预测框和真实框的位置关系而BEV特征的质量会影响匹配结果。如果某个区域BEV特征学得差预测框位置偏得厉害匈牙利匹配就可能把它匹配到错误的真值上形成负反馈。所以训练初期模型输出的框基本都是乱的需要比较长的warmup才能让匹配逐渐稳定下来。4.2 训练资源消耗与显存控制BEV-former的训练成本比大多数2D检测器高一个数量级。Transformer编码器层、多尺度特征、时间维度上的历史BEV特征三者叠加对显存的消耗非常惊人。论文级别的配置基本需要多张高端显卡普通实验室复现需要有一定心理准备。控制显存可以从几个方向入手。第一是降低BEV分辨率这是最直接的手段200×200降到144×144Query数量直接少约一半显存和计算量都跟着降。第二是减少时间自注意力使用的历史帧数只保留最近1到2帧时序收益依然能保留大部分。第三是检查多尺度特征是否有冗余如果检测目标主要是车辆和行人可以去掉最小尺度的特征显存能省不少精度损失极小。4.3 数据增强与相机标定的联动关系训练多相机BEV模型数据增强不是随便做做就行。图像的随机翻转、缩放、平移会让图像坐标系和车体坐标系的对应关系发生变化如果相机内参和外参不跟着同步调整空间交叉注意力里的三维参考点投影就会全部错位。复现BEV-former时最简单可靠的做法是只在BEV特征空间做增广或者在做图像增强时同步对相机内参做对应的矩阵变换保证投影关系一致。说到相机标定这里要重点提一句BEV-former对内外参的精度比LSS更敏感。因为LSS的深度分支可以部分弥补投影误差而BEV-former的三维参考点投影一旦偏了注意力就只能在一个错误位置附近采样且模型不太容易自行纠正。工程落地时外参受车辆震动影响发生微米级偏移都可能导致远处目标检测不稳定。很多量产团队都会加在线外参标定或外参扰动训练来缓解这个问题。4.4 推理速度与感知范围的取舍部署阶段最纠结的就是速度。BEV分辨率越大感知范围越细但推理延迟也越高。以我实测的体验200×200的配置在嵌入式平台上跑起来相当吃力通常需要剪到128×128级别同时把编码器层数从6降为3才能接近实时要求。除了分辨率相机数量也会影响计算量。BEV-former的空间交叉注意力只对落在图像内的参考点做计算6个相机时有大量参考点落在图像外实际计算量并不等于6倍单相机。但如果相机装得密、重叠视场大落在多个相机里的参考点会增加计算量还是会涨。这里有一个调优经验把不产生有效参考点的区域在BEV空间直接mask掉不分配Query能减少大量无效计算。比如一辆车正后方区域很多布置下是没有相机覆盖的与其让失去对应视野的BEV Query白学不如把这块区域留给后向相机真正覆盖到的范围。5. 复现BEV-former后最想提醒你避开的坑5.1 高度锚点设置不当投影点可能大量“出画”很多同学在复现时会把目光放在注意力公式上却忽略了一个近乎琐碎但直接影响结果的参数BEV Query在高度方向上采样的锚点范围。默认配置里高度方向通常只取几个离散层覆盖路面到常见车顶高度。但如果把锚点设得太高或太低投影到图像平面后点会落在图像边缘甚至完全出画特别是俯视角较低的相机上。出画的参考点越多这个Query能学到的信息越少整个BEV的边缘区域会形成“感知空洞”。我的建议是第一次跑通后先做一次可视化把若干BEV Query的参考点投影到六路图像上看分布是否合理。如果大量点集中在图像底部或超出边界优先调整高度范围和投影范围而不是动模型结构。5.2 mask处理不到位空白区域会给梯度“捣乱”空间交叉注意力只对落在图像内的参考点做计算这句话看着简单实现时却很容易出问题。需要显式构造一个二值mask标记哪些投影点是有效的有效点才参与注意力分数计算和梯度回传。如果漏了这一步或者mask形状没有和可变形注意力的采样点对齐那些出画的采样点会参与softmax归一化导致有效点被稀释训练时还会引入无意义的梯度噪声。这类bug在单卡小数据上不太容易暴露因为模型总能强行拟合一部分但一旦数据量上到完整数据集就会表现为loss降不下去或者验证集上某个相机方向的检测特别差。排查思路也很简单打印一轮前向的mask统计量看看有效点比例是否符合预期。5.3 历史帧对齐只平移不旋转大转角场景会崩时间自注意力里有一段靠自车运动信息对齐历史BEV坐标的操作。如果实现时图省事只做平移不做旋转在直行场景里看不出问题但一到十字路口、环岛、连续弯道自车转角一大历史BEV特征和当前坐标系的错位就会非常明显。模型会把历史特征里的物体位置错误地叠加到当前BEV空间造成重复检测或误检。正确的做法是使用完整的自车运动变换通常是平移和旋转的组合即一个刚体变换矩阵。历史帧的时间戳离当前越远这个对齐误差越大所以也不建议把历史帧拉得太长。实践中保留当前帧前1到2秒的BEV特征已经能覆盖大部分遮挡场景再往后对动态目标意义不大反而带入噪声。5.4 别只盯着NDS部署指标更重要论文里报告的nuScenes NDS、mAP等指标是在特定硬件、特定配置下得到的。复现到项目里时要额外关注三个工程指标单帧推理延迟、显存占用、以及感知范围边缘的目标召回率。很多BEV模型在自车周围30米内效果很好但60米开外目标在BEV特征里只剩下很少的格子检测质量断崖式下降。如果你想在高速场景使用建议训练时对远处目标做上采样或加大BEV网格覆盖率而不是简单堆Transformer层数。另外模型对遮挡目标的依赖一旦建立在时序特征上就要特别关注历史帧本身的质量。如果前帧其他传感器或系统误标了目标位置时间自注意力会把错误信息带到当前帧。这个问题目前没有一个完美的解决方案我的经验是在检测头输出端对低置信度目标做抑制减少历史特征里“脏”检测对当前帧的影响。我个人在实际操作中的体会BEV-former这篇工作对我的影响不只是多了一个可以刷榜的模型。它让人意识到2D图像到3D空间的映射不一定非要通过显式中间变量完成问对问题、去对地方取特征同样可以得到非常干净的结果。我建议读论文时别只看结构图和公式有条件的话亲自动手做一遍参考点可视化再对比一下有和没有时间自注意力时同一个遮挡场景的BEV特征差异。这种体感比任何文字描述都直接。这个方向后续还有BEVFormer V2引入了相机视角监督和多任务融合的处理思路但理解了第一版的核心机制之后这些演进学起来会快很多。落地时真正决定模型生死的不只是那份论文效果更多是这些细碎的工程细节希望这篇简读能帮你少走一点弯路。