一、BEV感知概述:从零理解这个“上帝视角”
大家好,我是你们的老朋友。今天咱们正式开讲BEV感知。
说实话,我第一次接触BEV这个概念是在2019年。当时我在做一个多传感器融合项目,摄像头、激光雷达、毫米波雷达各说各话——摄像头说“前面有个行人”,激光雷达说“那个位置有个点云簇”,毫米波雷达说“有个目标速度5m/s”。三个数据对不上,融合起来简直要命。
后来我意识到,问题出在“坐标系不统一”。摄像头在图像坐标系,激光雷达在自车坐标系,毫米波雷达在极坐标系。各说各的,怎么融合?
BEV感知,说白了就是——把所有传感器数据都投影到同一个“鸟瞰图”坐标系下。就像你站在高空俯视地面,所有物体都在一个平面上,位置关系一目了然。
1.1 什么是BEV感知?
BEV,全称Bird‘s Eye View,鸟瞰视角。BEV感知,就是把摄像头、激光雷达、毫米波雷达等传感器的数据,统一转换到自车为中心的俯视平面坐标系中。
你想想看,自动驾驶最关心什么?
- 前方50米有没有车?
- 左侧3米有没有行人?
- 右侧车道线是否清晰?
- 我的车能不能安全变道?
这些问题,在BEV空间里回答起来特别自然。因为BEV空间天然就是“以自车为中心”的二维平面,x轴向前,y轴向左,每个物体都有明确的(x, y)坐标。
核心要点:BEV感知的本质是“坐标系统一”。它把多模态、多视角的数据对齐到同一个空间,让下游的规划、控制模块可以直接使用。
我在项目中遇到过一个问题:纯视觉方案做3D检测,输出的是相机坐标系下的3D框。但规划模块要的是“自车坐标系下的障碍物列表”。中间需要做坐标变换、外参标定、时间同步...每一步都可能引入误差。而BEV感知直接输出自车坐标系下的结果,省去了这些麻烦。
1.2 BEV感知在自动驾驶中的核心地位
为什么说BEV感知是“核心”?我给大家画个图就明白了。
从这张图你能看到,BEV感知处于整个自动驾驶系统的“腰部”位置。上游是各种传感器,下游是预测、规划、控制。BEV感知做得好不好,直接决定了整个系统的上限。
我的经验:很多团队在BEV感知上投入不够,结果规划模块拿到的障碍物位置偏差半米,变道决策直接出错。BEV感知不是“锦上添花”,而是“地基”。地基不稳,楼盖得再高也得塌。
1.3 主流方案简介
目前BEV感知的主流方案,大致可以分为两派:LSS派和Transformer派。我分别说说。
1.3.1 LSS方案(Lift-Splat-Shoot)
LSS是NVIDIA在2020年提出的。这个名字很有意思——Lift、Splat、Shoot,三个动词概括了全部流程。
- Lift(提升):把2D图像特征“提升”到3D空间。怎么做?每个像素预测一个深度分布,然后沿着相机射线投影到3D。
- Splat(抛洒):把3D空间离散化成体素网格(BEV网格),把投影后的特征“抛洒”到对应的网格里。
- Shoot(射击):在BEV网格上做检测、分割等任务。名字来源于“朝BEV空间射击”的意象。
LSS的核心思想是“显式深度估计”。每个像素都要预测深度,然后投影。好处是几何关系明确,坏处是深度估计本身就不准——你想想看,单目深度估计本来就是个ill-posed problem。
避坑指南:我曾经在LSS方案上踩过一个坑——深度估计的分布太离散,导致投影后的BEV特征稀疏得像“芝麻撒在饼上”。后来我把深度bin从64个改成128个,效果好了不少。但代价是计算量翻倍。嗯,这里要权衡。
LSS的代码框架大致是这样的:
# LSS核心流程伪代码
def bev_encoder(images, intrinsics, extrinsics):
# 1. 2D特征提取
features = backbone(images) # [B, N, C, H, W]
# 2. 深度预测 + 特征提升
depth_dist = depth_net(features) # [B, N, D, H, W]
lifted_features = features.unsqueeze(2) * depth_dist.unsqueeze(3)
# 3. 投影到BEV网格(Splat)
bev_features = splat(lifted_features, intrinsics, extrinsics)
# 4. BEV空间检测
detections = bev_head(bev_features)
return detections
1.3.2 Transformer-based方案
Transformer派,代表工作是BEVFormer(2022年,旷视)。它的思路完全不同——不显式估计深度,而是用注意力机制“隐式”地学习2D到3D的映射。
具体来说,BEVFormer在BEV空间里放了一组可学习的“查询向量”(query)。每个query对应BEV网格中的一个位置。然后通过注意力机制,让每个query去“看”对应的图像区域,把图像特征聚合过来。
你想想看,这像什么?像是一个“智能的投影仪”——它不需要知道每个像素的精确深度,而是通过注意力权重自动学习“哪个图像区域对应哪个BEV位置”。
| 对比维度 | LSS方案 | Transformer方案 |
|---|---|---|
| 深度处理 | 显式深度估计 | 隐式注意力学习 |
| 几何先验 | 强(依赖相机内参外参) | 弱(靠数据驱动) |
| 计算效率 | 较高(可优化) | 较低(注意力计算量大) |
| 长尾场景 | 深度估计不准时易失败 | 数据覆盖好时更鲁棒 |
| 代表工作 | LSS, BEVDet, BEVDepth | BEVFormer, PETR, DETR3D |
我个人习惯是:如果传感器标定精度高、算力有限,优先选LSS;如果数据量大、算力充足,Transformer方案上限更高。当然,现在也有混合方案,比如BEVDepth在LSS基础上加了深度监督,效果又提升了一截。
一个小建议:初学者建议先从LSS入手。为什么?因为LSS的几何逻辑清晰,每一步都能可视化——你能看到深度分布长什么样,投影后的BEV特征长什么样。出了问题容易排查。Transformer方案像个黑盒,调参全靠玄学,新手容易崩溃。
1.4 本章小结
好了,咱们把BEV感知的“骨架”搭起来了:
- BEV感知是什么:统一坐标系,让所有传感器在鸟瞰图下对话
- 为什么重要:它是感知和规划之间的桥梁,决定系统上限
- 主流方案:LSS(显式深度+投影)和Transformer(隐式注意力)
下一章,我会带大家手搭一个最简单的BEV感知pipeline。咱们从数据准备开始,一步步把代码跑起来。到时候你会发现——嗯,原来BEV感知也没那么神秘。