BEV感知十年演进:从鸟瞰视角到空间智能,我们到底经历了什么
如果你是2018年左右入行做自动驾驶感知,大概率经历过那个“画框时代”:前视摄像头测距、雷达点云聚类、后融合把一切叠到目标列表里,然后导航模块拿着一个“目标列表”去做决策。那时候我们讨论的是单目深度准不准、毫米波是不是会漏检。但真正让整个感知架构发生质变的,是BEV(Bird's Eye View,鸟瞰视角)感知——它把感知从“图像空间”搬到了“物理空间”,也让自动驾驶第一次有了统一的、可学习的时空坐标系。
这篇文章我想沿着BEV感知近十年的演进路径,把几个关键转折点、典型方法、工程落地中的硬骨头以及我从实际项目中踩过的坑,一次性说透。适合正在做自动驾驶感知、打算入场做BEV方向,或者只是好奇“为什么现在的车都能自己画道路线”的朋友。
1. 为什么说BEV是感知范式的一次原点级革命
1.1 透视视角下的“三大困局”逼出了鸟瞰表达
先回到最朴素的问题:为什么大家折腾了那么久,最后都转向了BEV?因为透视视角(即相机看到的前视图像)在自动驾驶这个物理场景里有三个绕不开的短板。
第一个短板叫遮挡。前视相机看到的是透视投影,前面的车会挡住后面的车,行人会被路牌挡掉一半。虽然单车智能可以用“推测”来补,但推测的前提是你得先有一个空间模型。第二个短板叫尺度非线性。同样的一个行人,距离5米和50米在图像上的像素尺寸差一个量级,模型要同时学会“大目标”和“小目标”的语义,本质上是让同一个网络去表达多个尺度的同一物体,这很难。第三个短板是与下游模块的接口割裂。规划模块需要的是“我的车周围360度都有什么”,而你喂给它的是“8路相机各自看到的图像”,中间还隔着坐标系变换,信息一转换就损失。
BEV表达天生就是站在“世界坐标系”说话的。它把周边所有传感器观测到的信息,统一投影到自车所在水平面的一张栅格图上,每个栅格代表真实世界的一小块区域。规划需要“右后方向有没有车逼近”,直接从BEV图对应区域查特征就行,不需要再做几何拼接。
1.2 多传感器融合最容易踩的坑,被BEV一个坐标系抚平了
过去做前融合和后融合,团队里吵得最多的就是“你那个激光雷达坐标系和我的相机坐标系差了多少毫米”。传统做法是做硬同步+标定,然后写死一个外参矩阵。问题是车辆运行中,标定会有微小漂移,悬架压缩、路面颠簸都会让外参发生动态变化。一旦外参不准,后融合还能靠逻辑校验补救,前融合直接就“错位叠影”。
BEV最大的隐性红利在于:它天然就是一种“特征级前融合”的表达方式。相机图像经过特征提取后,被提升到BEV空间生成图像特征栅格;激光雷达点云也可以直接栅格化成BEV特征;毫米波雷达同样可以投影到同一张图里。三者共享同一个坐标系,不用再纠结“以谁为主”,网络自己学习各路传感器的置信度和互补关系。这个思路直接催生了后来各种“Camera-LiDAR Fusion in BEV”的论文和量产方案。
1.3 意识转变:从“识别物体”到“理解空间”
做感知的人往往会有一种执念:我要把每个目标都检测得特别准,框框要贴合得严丝合缝。BEV的出现逼着大家换了一种思路——比起“它是什么”,更要紧的是“它占住了哪块空间、往哪个方向动”。
当你把一辆车表达成一个3D框投影到BEV网格里,和把它表达成“障碍物占据概率较高的连续区域”,本质上就是两种哲学。前者是“识别派”,后者是“占据派”。BEV栅格天然偏向第二种,因为栅格本身就是空间划分。这个转变的意义在后续几年越来越明显:决策规划根本不关心它是不是一辆“轿车”,只关心那块空间能不能走;BEV的空间化表达,直接降低了感知与决策之间的“翻译损耗”。
2. BEV感知的核心方法论演进:从LSS到Transformer霸主
2.1 LSS:把像素“提升”到空间的第一套优雅解法
我最早接触BEV感知,是从“Lift, Splat, Shoot”这篇工作开始的。这套方法的巧妙之处在于,它回答了一个核心问题:相机图像上的一个像素,投影到BEV空间里该落在哪里?
单目相机本质上丢掉了深度信息。LSS的做法是先让网络为每个像素预测一个离散的深度分布(比如从0到60米,每隔1米一个bin),而不是只预测一个确定深度值。这样每个像素就被“抬起”成一个沿着相机射线的、带权重的点云柱——这就是“Lift”。接着把这些点按坐标投到BEV网格里,每个格子统计落入其中的特征,类似“撒点填充”——这就是“Splat”。最后在BEV网格上做2D卷积,就能输出统一的BEV特征图,接到检测头、分割头都行。
这套方法最打动我的一点是“深度分布”这个设计。它没有让网络硬着头皮输出一个深度值,而是输出一个分布,保留了不确定性。在遮挡、光照不好、纹理缺失的情形下,分布会变平,相当于告诉下游“这个像素的深度我拿不准,但大概率在这个区间”,这种表达方式非常诚实。
当然,LSS也有硬伤。它对深度bin的离散粒度非常敏感,bin太粗,远处目标像被橡皮擦抹过;bin太细,训练收敛难度指数上升。而且“Splat”这一步如果实现得不高明,会引入大量重复计算。后来工业界做了很多工程化修补,但LSS奠定了“图像到BEV”的基本范式:该提升的提升,该栅格化的栅格化,几何先验可以注入网络结构,而不是全靠注意力硬学。
2.2 BEVFormer:注意力机制终于对BEV下了手
在LSS之后,基于几何投影的方法在相当长时间里是主流。但Transformer在视觉领域崛起后,大家开始想:能不能不用显式几何投影,而是让网络自己学会“从图像特征到BEV特征”的对应关系?
BEVFormer提供了一个非常漂亮的答案。它先把BEV空间划分成一个个网格,每个网格对应一个查询向量(query)。然后让这些查询向量通过可变形注意力(Deformable Attention),去与相机图像的特征交互——每个BEV网格会学习“该看哪几个图像区域”。关键它还引入了一个时域注意力机制:将上一帧的BEV特征作为当前帧查询的额外输入,这样模型能利用历史信息来恢复当前的动态目标,甚至在目标被遮挡时,也能根据上一帧的位置“猜”出当前的位置。
我当时用开源的BEVFormer复现过一版,和一个LSS基线对比,最直观的感觉是:远处小目标召回率上来了。为什么?因为可变形注意力可以动态调整采样位置,相当于模型自己去选“看哪里”,而不是依赖几何投影的固定索引;再加上时域信息的累积,远处低分辨率目标靠多帧积累也能被“猜”出来。
这里要提醒一个容易被忽略的细节:BEVFormer收敛比LSS慢得多。LSS有明确的几何先验,相当于给网络发了一张“地图”,它只要学会填内容;BEVFormer是让网络从零去学地图结构,训练要出效果,通常需要更长的周期和更大的batch size。如果你在小显卡上复现,不要急着下结论说“Transformer没用”,先确保训练预算够。
2.3 从网格到查询:三种BEV生成路线的对比
这些年在BEV感知的论文里,把“如何生成BEV特征”这条路分成三类比较清晰:基于几何投影(LSS是代表)、基于空间注意力(BEVFormer是代表)、基于纯端到端学习(比如直接输入多视角图像,输出BEV分割的隐式映射)。我整理了一个表格方便对照:
| 路线 | 代表范式 | 空间结构先验 | 遮挡鲁棒性 | 部署难度 | 适用场景 |
|---|---|---|---|---|---|
| 几何投影 | LSS系方法 | 强(依赖深度估计) | 中等 | 低 | 算力受限、量产快速落地 |
| 空间注意力 | BEVFormer系方法 | 弱(靠注意力学习) | 高 | 中等 | 数据充足、追求性能上限 |
| 端到端隐式学习 | 各种“咬文嚼字”模型 | 极弱 | 高 | 高 | 研究探索、下一代架构 |
三类方法没有绝对优劣。我见过不少量产项目,最终选的是“几何投影+可变形注意力微调”的混合路线:先用LSS式深度监督把网络训稳,再在BEV特征后接几个Deformable Attention层做精修,效果往往比单一路线都稳。
2.4 BEV带来的不只是感知:一把打通检测、分割与预测
BEV感知最有想象力的地方在于,它的输出格式天然统一,检测、语义分割、可行驶区域识别、车道线识别,全都可以挂在同一个BEV特征图上,用不同的头输出。本来你要维护三个独立的模型、三套数据集、三套部署流程,现在变成一套主干网络、一张BEV特征、三个轻量头。
后来又在这个基础上加上了轨迹预测头,甚至运动规划头。BEV特征图上的每个栅格不仅表达“这里是什么”,还可以表达“这里正在发生什么运动”,下游直接根据BEV特征做多目标轨迹预测,这就把感知和预测的边界彻底模糊了。
3. BEV工程落地中最狠的几刀:算力、数据与标定的三重考验
3.1 算力优化:车载芯片上把BEV模型“瘦身”的真实经验
论文里的BEV模型动辄上百GFLOPs,但量产车上能给的算力预算是固定的。以某量产车型项目为例,整个感知模型跑在车规级芯片上,BEV部分只能分到大约40毫秒的推理时间。在这个预算下做BEV感知,最核心的三个字是:稀疏化。
第一刀砍在图像特征提取。对8路相机同时做高分辨率特征提取是奢侈的,量产方案普遍做法是:先检测相机视野内的“感兴趣区域”,只对ROI区域做高分辨率特征;或者干脆用一个轻量主干(比如轻量化卷积网络)提完特征,再上采样。第二刀砍在BEV网格分辨率。BEV栅格从比如0.5米一格降到0.25米一格,计算量是四倍差距;很多场景(高速巡航)根本不需要那么精细,但城市拥堵场景又需要精细,于是出现了多分辨率BEV的设计——近处用细网格、远处用粗网格。
第三刀是剪枝与蒸馏。我踩过最深的坑是“剪枝完精度暴跌,还找不到原因”。后来定位到问题出在深度估计分支:深度分布输出被剪枝过度,导致远处目标的BEV投影位置发生漂移。解决方法是把深度分支设置成不可剪枝层,并在蒸馏时让教师模型(大模型)多输出“深度分布软标签”而不是只输出最终检测框。
3.2 数据困境:BEV标注贵得离谱,自动标注绕不开
透视图视角下,2D框标注一个人花几秒;BEV视角下,标注一个3D框需要看多视角图像、估计朝向、标出三维尺寸,成本可能是前者的5到10倍。更麻烦的是,车道线、可行驶区域、障碍物占据这类“面状标注”,在BEV栅格上逐格标注,人力成本不可想象。
行业里普遍采用的解法是自动标注+人工校验。先用高精度的多传感器融合模型离线跑一遍数据,生成BEV标签,再让人工只修正置信度低的区域。这里有一个工程细节:校验员看BEV标签时,最好把BEV俯视图和对应透视图像同步显示,否则没有空间感的人很难判断“这个框偏了0.2米”是否真的偏了。
我和某实验室合作过一个模拟项目,里面用了一个很朴素但有效的“时间累积标注法”:对静止障碍物,把连续几十帧的检测结果累积起来做均值,求出一个高置信度的位置;对运动目标,用插值拟合轨迹,再反向投影到每一帧生成标签。这样生成的BEV标注质量,在很多区域甚至超过了人工标注的一致性。
3.3 标定问题:外参误差在BEV空间里会被放大
传统目标检测里,外参标定稍微差一点,2D框可能只偏移几个像素,肉眼都看不出。但到了BEV感知,外参误差会被放大到“分米级”,因为一个像素的误差在50米外可能对应0.5米的空间偏移,直接导致本车“以为”障碍物在车道内,实际它在相邻车道。
这带来的直接结论是:BEV感知系统的标定不是“调一次就好”,而是要持续监测、在线补偿。我见过比较成熟的量产方案,会在行驶中用路面特征(车道线、路沿)反推外参漂移量,做在线修正。哪怕你的模型训练时用了完美的标定数据,上车后如果没有在线标定配合,精度依然会崩。
另一个细节:内外参标定必须覆盖相机畸变,尤其是鱼眼相机。鱼眼镜头的畸变非常大,如果校正参数不准,BEV投影远处直接扭曲。我建议在训练数据制作阶段就对图像做去畸变处理,而不是让网络自己学习畸变规律,后者既浪费参数,又学不彻底。
3.4 泛化能力:换一个城市,BEV模型还会不会玩
透视图像模型过拟合场景,大家很早就知道,但BEV模型的过拟合有更隐蔽的表现。有一次我在模拟项目里训练了一个BEV模型,在园区场景测试效果很好,换到一个结构更宽的道路环境,突然开始把路边的绿化带识别成“可行驶区域”。
后来复盘发现,问题出在数据构成:训练数据里绿化带和可行驶区域的“纹理搭配”相对固定,模型学到了“看起来像这种绿植纹理的区域就是可行驶的”,而没有学到真正的空间几何约束。在BEV空间里,网络理应能学会“路沿边界”这个强几何线索,但如果数据里路沿总是被其他车挡住、标注又恰好缺了那一块,模型就会偷懒学纹理捷径。
解决这类问题的思路:一是做场景数据增广时,刻意打乱纹理与空间的关联性;二是在BEV特征上强约束“路面几何一致性”,比如加入LIDAR生成的路面高度监督,迫使网络依赖空间结构而不是表面纹理。
4. 从BEV走向占用网络:垂直维度的必要性终于浮出水面
4.1 BEV的“扁平化”傲慢,让它看不见悬空物
BEV把所有东西压到二维平面,这在结构化道路上是够用的:车辆、行人、路面障碍物都在地表附近。但现实世界是三维的,立交桥、悬挂的树枝、伸出来的广告牌、侧翻的卡车,它们的“占据空间”有一部分悬在空中。BEV栅格里找不到这些对象,因为它们在地面上的投影可能只是一小块阴影。
我做过一个纯BEV方案的低速园区项目,遇到一个很头疼的问题:路边伸出来的树枝在BEV特征里几乎不可见,但车辆的传感器(尤其是激光雷达)明明能扫到。这说明BEV这种表达天生在垂直维度上丢信息,不是模型能力不够,而是表征空间的容量有限。
4.2 占用网络:对三维空间做“体素级”占据预测
占用网络的基本思路,是把自车周围的3D空间划分成一个个小立方体(体素),网络要预测每个体素是被占用、空闲还是未知。和BEV栅格相比,它增加了垂直维度;和3D目标检测相比,它不强制区分“这是一个车”还是“这是一个树”,只回答“这里能不能过”。
这种表达对规划模块极其友好。规划要判断“这个路口能不能左转”,直接查占用网格的前方区域有没有连续空闲通道就行,不需要去猜“躲过那辆右转车之后,路沿后面是不是有一个消防栓”。占用网络最早从激光雷达点云分割演化而来,后来也出现了纯视觉的占用网络方案,用相机图像直接预测三维占用——从原理上讲,它其实是BEV感知在空间维度上的一次升维。
4.3 视觉占用网络与BEV的协同,而不是相互取代
有不少人觉得占用网络会“干掉”BEV,我的判断是短期内不会,两者更多是共存关系。BEV的优势在于成熟、高效、下游友好——2D的检测/分割头可以直接用,规划模块也习惯了BEV栅格。占用网络的优势在于空间完备性,但算力开销和标注难度比BEV高一个量级。
现实中的方案通常是级联的:先用一个高效的BEV网络做快速的目标检测和可行驶区域分割,再在特定危险区域(比如近距离盲区、路口)启用占用网络做精细3D建模。占用网络补足BEV的“垂直盲区”,BEV用速度弥补占用网络的“计算赤字”。这套“粗BEV+细占用”的组合,在城市NOA和代客泊车场景里已经有落地雏形。
5. 一位实践者的BEV感知项目复盘:那些论文里没写的细节
5.1 模拟项目背景与整体设计
我在某高校实验室做过一个BEV感知Demo,目标是用6路环视相机实现园区内行人和车辆的BEV检测与轨迹预测。因为当时实验室没有激光雷达可用,所以核心路线选了纯视觉的BEV方案。
整体设计是:6路鱼眼相机做去畸变→轻量卷积主干提特征→Transformer的BEVFormer式注意力模块做BEV特征生成→检测头输出3D框并投影到BEV→一个轻量的LSTM层输出未来3秒轨迹。训练数据是自采的一段园区数据(约2小时),用高精度RTK与人工标注生成BEV标签。现在回头看,这个设计最成功的一点是“分级复杂度”:POC阶段先用最朴素的方法跑通全链路,再逐步替换更复杂的模块,而不是一上来就堆Transformer。
5.2 排坑记录:深度分布收敛慢、注意力过拟合与时序跳变
第一部分是深度分布收敛极慢。起初模型在训练集上表现良好,但验证集上一塌糊涂。后来发现是深度监督信号给得太晚,早期训练全靠检测框回传的梯度来“教”深度分支,而这个梯度经过多层反传后很弱。解决方法是添加辅助损失:把激光雷达投影出来的稀疏深度图作为弱监督信号,强制深度分支在训练早期就学会“大概的深度轮廓”。这个改动让收敛速度至少快了40%,且最终精度更高。
第二部分是注意力模块在小数据集上的过拟合。BEVFormer这类模型参数多、数据需求量大,而我们只有2小时数据。我做了两件事:一是把标准的可变形注意力替换成窗口化的局部注意力,让每个BEV网格只看邻域内的相机区域,相当于加了局部性先验;二是给注意力权重加了一个“几何距离衰减”的偏置——离当前BEV网格越远的图像区域,初始权重越低。这个偏置贴近物理直觉,模型不需要从头学习“远处的像素偶尔也能影响近处位置”这种罕见模式。
第三部分是时序跳变。用BEVFormer时,会发现连续帧预测的同一辆车,在BEV空间的位置会有高频抖动。问题出在时域注意力对上一帧特征过度依赖:一旦上一帧预测有误差,误差会像“回声”一样在后续帧里累加。我调整了时域注意力对“上一帧BEV特征”和“当前帧图像特征”的权重比例,限制了历史特征的最大贡献比例,抖动明显改善。这也是一个经验之谈:时域融合不是越多越好,要留出“当前观测纠正历史误差”的通道。
5.3 选型建议:你的场景到底适合哪种BEV方案
很多人问我“新项目到底该用LSS还是BEVFormer”,我的回答永远是反问三个问题:你的算力预算是多少?数据量够不够?场景是高速还是城区?
预算少、数据中等、高速场景为主——无脑选LSS系方法。它稳定、易训、参数少,速场景结构化程度高,深度估计不需要特别精准也能出效果。资金和数据充足、场景以城区复杂路口为主——上BEVFormer或类似的注意力架构,它能利用时序信息处理遮挡,而且对远处目标的召回率有明显优势,代价就是算力开销大、收敛慢。既没算力又没数据,选择做2D检测+几何投影到BEV,不要强行学习。
还有一类场景我觉得是纯视觉BEV目前最强的分野:代客泊车。泊车场景速度低、结构固定、传感器近,纯视觉BEV能在近距离提供非常精准的占用估计和车位检测,成本远低于激光方案,加上垂直维度其实变化不大(都在一个平面层),BEV和占用网络在这里可以打得很好。
5.4 下一步演进的个人判断
在写这篇复盘时,我已经在关注两条BEV之外的新线索。一条是语义 occupancy——让网络不仅预测占据,还预测每个体素“是什么类型”,这样决策可以知道“前方悬空的是树枝还是广告牌”,因为这两者带来的行为逻辑完全不同。另一条是端到端大模型对BEV的替代或融合——现在很多端到端方案直接把多视角图像输入一个巨大的Transformer,隐式地输出轨迹,彻底跳过了显式BEV环节。
但我的观点是,显式BEV不会立刻消失。端到端模型的问题是“不可解释性”和“故障定位困难”,一旦在真实路上出了安全问题,你甚至不知道该改哪一层。而BEV作为中间表征,天然提供了一个“人可读”的接口——工程师看一眼BEV特征图,就能判断模型到底“看见”了什么,这是端到端黑盒短期无法替代的工程价值。
最后再分享一条实操体会:做BEV感知不要一上来就追新模型,先把“坐标系”想清楚,把你的传感器标定、数据标注、外参监测这三个基本功打扎实,无论以后换LSS、BEVFormer还是占用网络,你都能比别人更快落地。BEV这十年演进的本质也在这里——不是某几篇论文的胜利,而是一代做感知的人慢慢学会了用“空间”而不是“图像”去思考自动驾驶问题。