一、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感知模块 特征提取 → 视角变换 → 时序融合 → 目标检测/分割 障碍物检测(3D框) 车道线/路沿检测 可行驶区域分割 → 预测模块 → 规划模块 → 控制模块

从这张图你能看到,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感知也没那么神秘。


可可精品资料库