1. BEV感知概述:从2D视觉到BEV的演进、BEV感知的核心优势、主流方案对比(LSS vs Transformer)

1.1 为什么我们要聊BEV?

说实话,几年前我刚入行做自动驾驶感知时,大家还在跟2D检测死磕。那时候的pipeline很简单——前视摄像头检测到目标,然后投影到鸟瞰图,再跟其他传感器做融合。听起来挺顺的,对吧?

但实际跑起来问题一堆。我记得有一次在园区测试,一辆白色SUV从侧方切入,2D检测框明明框住了,可投影到BEV空间后位置偏了快两米。为什么?因为单目测距本身就有深度模糊性,再加上路面不平、车辆颠簸,投影误差直接爆炸。

所以业界开始思考:能不能直接在BEV空间做感知?这就是我们今天要聊的起点。

1.2 从2D视觉到BEV:一场必然的演进

传统2D感知的流程,说白了就是「先检测,再投影」。每个摄像头独立做检测,然后靠外参把结果映射到统一坐标系。听起来简单,但坑特别多:

  • 时间对齐问题:每个摄像头处理速度不一样,融合时目标可能已经移动了
  • 遮挡处理困难:2D检测框无法表达深度信息,被遮挡的目标直接丢失
  • 跨摄像头关联:同一个目标出现在两个摄像头视野中,怎么确定是同一个?
  • 时序不稳定性:单帧检测抖动大,融合后的轨迹经常跳变

我在一个量产项目中就吃过这个亏。当时用传统方法做多摄像头融合,结果在十字路口场景下,左转车辆被两个摄像头同时检测到,但融合模块把它们当成了两个目标,导致轨迹分裂。嗯,这种bug排查起来特别痛苦。

BEV感知的思路完全不同——它把所有摄像头的特征直接投影到统一的BEV空间,然后在BEV空间里一次性做检测、分割、跟踪。说白了,就是把「先检测后融合」变成了「先融合后检测」。

核心转变:从「图像空间独立感知」到「BEV空间统一感知」,这是自动驾驶感知架构的一次范式革命。

1.3 BEV感知的核心优势

你想想看,为什么特斯拉、蔚来、小鹏都在往BEV方向转?因为优势太明显了:

  1. 统一坐标系:所有传感器都在同一个BEV空间里,天然对齐,不需要做复杂的跨传感器关联
  2. 时序融合自然:BEV特征可以直接跟历史帧对齐,做时序融合非常方便
  3. 端到端可训练:从图像输入到BEV输出,整个pipeline可以一起训练,避免误差累积
  4. 多任务共享:检测、车道线、可行驶区域、障碍物预测,都可以在同一个BEV特征图上完成
  5. 对遮挡更鲁棒:多视角信息在BEV空间互补,被遮挡的目标也能通过其他视角推断

我个人习惯把BEV感知比作「上帝视角」。你想想,如果有一个俯瞰的视角看整个场景,所有车辆的位置、朝向、速度一目了然,那规划和控制模块的工作会轻松多少?

小提示:BEV感知并不是万能的。它对计算资源要求高,对传感器标定精度敏感,而且在远距离区域分辨率会下降。选型时要根据实际场景权衡。

1.4 主流方案对比:LSS vs Transformer

目前BEV感知的主流方案就两条路:LSS路线和Transformer路线。我两个都做过,说说我的感受。

1.4.1 LSS方案(Lift-Splat-Shoot)

LSS的核心思想是「先提升,再拍平」。每个像素点沿着射线方向生成一个深度分布,然后把所有特征点投影到BEV网格中。

# LSS核心流程伪代码
def LSS_pipeline(images, intrinsics, extrinsics):
    # 1. Lift: 为每个像素预测深度分布
    depth_dist = predict_depth(images)  # [B, N, D, H, W]
    # 2. 生成视锥特征
    frustum_features = images * depth_dist  # [B, N, D, C, H, W]
    # 3. Splat: 投影到BEV网格并累积
    bev_features = splat_to_bev(frustum_features, intrinsics, extrinsics)
    # 4. Shoot: 在BEV空间做感知任务
    detections = detect_on_bev(bev_features)
    return detections

优点:

  • 几何先验强,深度估计有物理意义
  • 计算效率高,适合部署
  • 对传感器标定误差有一定容忍度

缺点:

  • 深度分布预测精度有限,远距离误差大
  • BEV网格分辨率固定,无法自适应
  • 多尺度特征融合不够灵活

我曾经在一个项目中用LSS做BEV感知,发现近距离(0-30米)效果非常好,但到了50米开外,目标位置就开始飘了。后来分析发现,是深度分布预测在远距离时过于平滑,导致投影位置不准确。

1.4.2 Transformer方案(BEVFormer等)

Transformer方案用注意力机制来建立图像特征和BEV空间的映射关系。核心是「可变形注意力」——每个BEV query只关注图像中相关的几个位置。

# BEVFormer核心流程伪代码
def BEVFormer_pipeline(images, bev_queries):
    # 1. 初始化BEV queries
    bev_queries = init_bev_queries()  # [H_bev, W_bev, C]
    # 2. 多尺度可变形注意力
    for layer in transformer_layers:
        # 从图像特征中采样
        image_features = extract_features(images)  # 多尺度
        # 可变形注意力:每个BEV query关注图像中的关键点
        bev_queries = deformable_attention(
            bev_queries, 
            image_features,
            reference_points
        )
    # 3. 在BEV空间做感知任务
    detections = detect_on_bev(bev_queries)
    return detections

优点:

  • 自适应关注,远距离也能保持精度
  • 天然支持多尺度特征融合
  • 时序融合方便,可以引入历史BEV特征

缺点:

  • 计算量大,对显存要求高
  • 训练收敛慢,需要大量数据
  • 对传感器配置变化敏感,换摄像头需要重新训练

1.4.3 方案对比总结

对比维度 LSS方案 Transformer方案
几何先验 强(显式深度分布) 弱(隐式学习)
计算效率 高(适合部署) 低(需要大算力)
远距离精度 一般(深度分布退化) 好(自适应关注)
多尺度融合 需额外设计 天然支持
时序融合 需额外模块 自然支持
训练难度 容易收敛 需要技巧
传感器适配 灵活(可换摄像头) 敏感(需重新训练)

避坑指南:我曾经在一个项目中盲目选择了Transformer方案,结果发现车载芯片根本跑不动。后来被迫换成LSS方案,虽然精度略低,但至少能实时运行。选方案时一定要先评估硬件算力,别光看论文里的SOTA指标。

1.5 本章知识体系总览

下面这张图展示了BEV感知的核心知识结构,我建议你先整体看一遍,再逐节深入:

BEV感知知识体系总览 BEV感知 演进历程 2D检测+投影 BEV统一感知 核心优势 统一坐标系 时序融合 端到端训练 多任务共享 主流方案对比 LSS方案 Transformer方案 深度分布预测 Splat投影 可变形注意力 时序融合 选型建议 算力充足选Transformer,部署受限选LSS

1.6 我的建议

如果你刚开始接触BEV感知,我建议你先从LSS方案入手。为什么?因为它的物理意义清晰,代码实现相对简单,调试起来也方便。等你把LSS吃透了,再去看Transformer方案,你会发现很多设计思路是相通的。

另外,别光看论文。我建议你找个开源实现(比如BEVDet或BEVFormer),把代码跑起来,然后改改参数看看效果变化。纸上得来终觉浅,绝知此事要躬行——这话放在BEV感知上特别合适。

一句话总结:BEV感知的核心,就是把「各看各的」变成「一起看」,把「先检测后融合」变成「先融合后检测」。LSS和Transformer是两条不同的实现路径,各有优劣,选型要结合你的实际场景和硬件条件。

可可精品资料库