第1章:BEV模型概述

大家好,我是你们的老朋友。今天咱们聊聊BEV感知——这个在自动驾驶圈子里火得不行的话题。

说实话,我第一次接触BEV概念是在2019年。那时候团队正在做多传感器融合,大家还在纠结怎么把摄像头、激光雷达的数据对齐。后来发现,BEV这个视角简直就是为自动驾驶量身定做的。

什么是BEV感知

BEV,全称Bird's Eye View,就是鸟瞰图视角。你想想看,开车的时候,你最关心什么?当然是周围的车、行人、路障都在什么位置,往哪个方向移动。

传统的感知方法,比如前视摄像头,只能看到前方一个锥形区域。你变道的时候,侧后方来车根本看不到。BEV感知就不一样了——它把所有传感器数据都投影到一个俯视的二维平面上。

核心思想:把多视角、多模态的传感器数据,统一转换到以自车为中心的俯视坐标系中。说白了,就是给车装了个上帝视角。

我在项目中遇到过一个问题:摄像头图像是透视的,远处物体很小,近处物体很大。直接做BEV转换,远处物体的特征会丢失。后来我们用了可变形注意力机制,才解决了这个问题。

BEV在自动驾驶中的角色

BEV感知不是花架子,它在整个自动驾驶系统中扮演着三个关键角色:

  • 统一表达空间:摄像头、激光雷达、毫米波雷达,数据格式各不相同。BEV提供了一个公共坐标系,让所有传感器数据都能对齐。
  • 时序融合基础:单帧感知不够稳,需要多帧融合。BEV空间天然支持时序对齐,你只需要把上一帧的BEV特征做个平移旋转就行。
  • 决策规划输入:规划模块需要的是道路拓扑、障碍物位置、可行驶区域。这些信息在BEV空间里一目了然。

我的经验:做BEV感知,千万别只盯着感知精度。你要想清楚下游规划模块到底需要什么。我曾经见过一个团队,BEV感知mAP做到90%以上,但规划模块说用不了——因为输出格式不兼容。

主流BEV模型架构简介

目前主流的BEV模型架构,基本可以分成两派:LSS派和Transformer派。嗯,这里要注意,这两派不是互斥的,很多新模型都在融合两者的优点。

1. LSS(Lift-Splat-Shoot)

LSS是NVIDIA在2020年提出的,名字很有意思:Lift(提升)、Splat(拍平)、Shoot(射击)。

它的核心思路是这样的:

  1. Lift:把每个像素点提升到3D空间,预测每个像素的深度分布。说白了,就是猜这个像素到底在3D空间的哪个位置。
  2. Splat:把所有3D点拍平到BEV网格上。每个网格里可能有多个点,做个池化操作。
  3. Shoot:在BEV空间里做检测、分割等任务。
# LSS的核心伪代码
def lift_splat_shoot(images, intrinsics, extrinsics):
    # 1. Lift: 预测深度分布
    depth_dist = predict_depth(images)  # [B, N, D, H, W]
    feat = extract_features(images)     # [B, N, C, H, W]
    
    # 2. Splat: 投影到BEV网格
    bev_feat = project_to_bev(depth_dist, feat, intrinsics, extrinsics)
    
    # 3. Shoot: BEV空间检测
    detections = detect_in_bev(bev_feat)
    return detections

避坑指南:我曾经在部署LSS模型时踩过一个坑——深度预测分支的量化。深度分布是softmax输出,值域在0~1之间,但量化后精度损失严重。后来我改用KL散度感知量化,才把精度拉回来。

LSS的优点很明显:结构简单,容易部署。缺点也很突出:深度预测不准,远处物体容易飘。我建议你在做近距离感知(50米以内)时用LSS,远距离还是得靠Transformer。

2. Transformer-based

Transformer-based方法,代表工作就是Tesla的Occupancy Network和BEVFormer。这类方法的核心是注意力机制。

你想想看,LSS需要显式预测深度,这本身就是一个病态问题。Transformer-based方法绕过了这个步骤——它直接在BEV空间里定义一组查询(query),然后通过注意力机制从图像特征中提取信息。

BEVFormer的流程大致是这样的:

  • 初始化一组BEV查询,每个查询对应BEV网格的一个位置
  • 通过可变形注意力,每个查询从多视角图像中采样特征
  • 通过时序注意力,融合历史帧信息
  • 输出BEV特征,用于检测、分割等任务
对比维度 LSS Transformer-based
深度预测 显式预测 隐式学习
计算量 较低 较高
远距离精度 较差 较好
部署难度 容易 较难
时序融合 需额外设计 天然支持

个人建议:如果你做嵌入式部署,算力有限,我建议从LSS入手。Transformer-based模型虽然精度高,但注意力机制的计算量和内存占用都很可观。我做过一个测试,BEVFormer在Jetson Orin上跑,单帧推理需要200ms,而优化后的LSS只需要50ms。

当然,现在也有不少混合方案。比如BEVDepth,在LSS基础上加了个深度监督,精度提升不少。还有BEVFormer v2,用LSS做初始化,再用Transformer做精调。说白了,没有银弹,只有最适合你场景的方案。

好了,这一章就聊到这里。下一章我会深入讲讲BEV模型的内存瓶颈——为什么一个看起来不复杂的模型,部署时内存会爆掉?