商场保安老周坐在监控室里,面前是八块屏幕。每块屏幕只照到大厅的一个角落,画面上的人又小又歪。可你问他“现在东门人多吗”,他能立刻回答你,甚至说出那个穿红衣服的人正往哪儿走。因为他在脑子里拼出了一张商场的“俯视沙盘”:哪个柜台在哪个坐标、谁站在哪里、谁在移动。把散落的视角画面,在脑中转成一张以自己为中心的俯瞰地图——这正是 BEV(Bird's Eye View,鸟瞰图)感知在自动驾驶里做的事。车辆周身装着六到八路摄像头,它们各自看到的只是“侧面视角”的局部画面,而 BEV 感知系统要做三件事:先弄清每台相机的位置朝向(视角转换),再判断画面里每个目标大概离车多远(深度估计),最后把各路画面“抬升”并融合进同一张俯视网格地图(特征融合),在这张沙盘上完成检测、测距与预测。本文就以“保安拼沙盘”为主线,把 BEV 的每个环节拆给你看。

岗位关联

掌握 BEV 感知,你就拿到了量产级自动驾驶感知系统的入场券——从算法原理到工程落地,这是智能驾驶行业最硬核的通用能力之一。

目录
  1. 可视化演示
  2. 基本概念
  3. 视角转换
  4. 深度估计
  5. 特征融合
  6. 目标检测
  7. 主流模型
  8. 工程挑战
  9. 行业应用
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

演示多相机透视转BEV、LSS特征变换与时序融合,以及多任务感知头设计。

本节配有交互动效(进入视口后自动加载,约 3KB)。

多相机转换 环视相机 BEV网格 透视→鸟瞰 统一坐标

基本概念

老周拼沙盘的第一步,是“习惯俯视”:他心里那张商场地图永远是正上方视角,柜台间距、通道宽度都是真实比例。BEV(Bird's Eye View,鸟瞰图)感知的第一步也是建立这种“俯视习惯”——它把安装在车身四周的六到八路摄像头画面,统统映射到一张以自车为中心的俯视网格上,网格的每个小格子对应地面上一小块真实区域,比如 0.5 米 × 0.5 米。这张网格叫 BEV 特征网格,是后续一切理解的“沙盘底座”。

为什么非俯视不可?因为透视画面天然“近大远小”,一辆三米外的货车可能比三十米外的楼房还大,还会被前面的车挡住大半个车身。俯视沙盘则把物体放回真实尺度:多大多远、在哪个方位,一目了然。这在判断“能不能变道、要不要刹车”时至关重要——视觉算法再聪明,也得先有一个不失真的坐标系。

技术上,BEV 网格是一个 C 通道的二维特征张量,自车通常位于网格正中心,网格覆盖前方约 50~100 米、左右各约 25 米。摄像头、毫米波雷达乃至激光雷达的特征都可以落到同一张网格里,形成统一的“融合枢纽”,下游的 3D 目标检测、车道线识别、轨迹预测都在这张网格上运行。要让每个格子和真实世界坐标建立对应关系,需要先做网格离散化,把连续的世界坐标“装”进一个个小格子里。

老周心里没有真的“网格线”,但他默念“奶茶店门口第三块地砖”时,本质上就是在俯视图上定位。BEV 把这种“地砖定位”变成了机器可计算的网格坐标,让整个感知系统站在更高的视角看世界。

i=⌊x−xmin⁡s⌋,j=⌊y−ymin⁡s⌋i = \left\lfloor \dfrac{x - x_{\min}}{s} \right\rfloor, \qquad j = \left\lfloor \dfrac{y - y_{\min}}{s} \right\rfloor
这个公式把真实世界的平面坐标 (x, y) 划分成网格坐标 (i, j)。s 是每格边长,x_min、y_min 是网格左下角对应的真实坐标。
  1. 向下取整定位floor 符号表示向下取整,把连续的世界坐标归入最近的格子编号。
    ⌊x−xmin⁡s⌋\left\lfloor \dfrac{x - x_{\min}}{s} \right\rfloor
  2. 网格原点对齐x_min、y_min 是 BEV 网格覆盖区域的起始世界坐标,通常以自车为中心取对称范围。
    xmin⁡=ymin⁡=−Rx_{\min} = y_{\min} = -R
  3. 分辨率换算s 表示每个格子对应的真实距离(米),它决定了 BEV 的感知精度,s 越小网格越细、计算量越大。
    s=2RNs = \dfrac{2R}{N}

视角转换

老周能拼对沙盘,前提是知道每块屏幕装在哪、对着哪、能照多远——这就是“视角信息”。对汽车来说,视角信息由相机的内参和外参描述:内参决定“画面怎么成像”,外参决定“相机装在车上的什么位置、朝什么方向”。两者缺一不可,就像老周既要知道屏幕的清晰度,也要知道它挂在墙上的角度。

内参矩阵 K 包含焦距和光心,它把相机坐标系里的三维点投影到像素坐标系;外参 [R|t] 包含旋转矩阵 R 和平移向量 t,它把世界坐标系(一般以自车中心为原点)的坐标转换到相机坐标系。两者相乘,就是世界坐标到像素坐标的完整投影链路。这套“内外兼修”的标定参数,是所有空间变换的地基。

在 BEV 系统中,视角转换有两层用途:训练时,网络需要知道“特征从哪个像素来”,从而把像素特征反投影到三维空间;运行时,预计算好的投影关系可以直接把图像特征“搬”到俯视网格上。注意这里不是简单的图像拼接——从透视到俯视没有封闭的解析解,必须靠内外参标定与数据驱动的空间变换共同完成,地面起伏会让纯几何变换彻底失效。

老周每天上班第一件事是检查八块屏幕有没有被顾客碰歪——哪块屏歪了,他脑中的沙盘就会整体错位,判断就会离谱。镜头标定之于 BEV,就是这个“开箱检查”,不做好,后面一切融合都是空中楼阁。

zc[uv1]=K[R | t][XwYwZw1]z_c \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = K \left[ R \ \middle| \ \boldsymbol{t} \right] \begin{bmatrix} X_w \\ Y_w \\ Z_w \\ 1 \end{bmatrix}
这是针孔相机模型的完整投影公式:左边是像素坐标乘以深度,右边先是外参把世界坐标转到相机坐标,再乘内参 K 映射到像素平面。
  1. 内参矩阵K 是 3×3 矩阵,包含焦距 f_x、f_y 与光心 c_x、c_y,描述三维点在相机坐标系中的成像方式。
    K=[fx0cx0fycy001]K = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix}
  2. 外参变换[R|t] 由旋转 R 和平移 t 组成,把世界坐标 (X_w, Y_w, Z_w) 转换到相机坐标系。
    Xc=RXw+tX_c = R X_w + \boldsymbol{t}
  3. 深度归一化等式左边乘 z_c 表示成像时除以深度,得到像素坐标,完成“三维世界到二维图片”的压缩。
    u=fxXcZc+cxu = f_x \dfrac{X_c}{Z_c} + c_x

深度估计

沙盘是二维的,但老周把目标放到沙盘上之前,得先判断“他站在离我几米远的地方”——这就是深度估计。纯摄像头没有激光雷达的测距能力,只能从图像里“猜”距离,这恰恰是 BEV 中最精彩也最难的一环。

聪明的做法不是硬猜一个精确距离,而是输出“深度概率分布”:网络把 4~64 米的范围切成 D 个离散深度档位,对画面里每个像素,预测它落在每个档位上的概率。看不清的目标,概率就会摊得很开——先保留不确定性,等后面融合时再消除,这比强行给一个错误答案稳健得多。

LSS(Lift, Splat, Shoot)是这一流派的开山之作。“Lift 抬升”:把每个像素的图像特征和它的深度概率做外积,让特征沿深度方向“复制”成一串,形成视锥体;“Splat 散开”:再根据内外参把视锥里的每一个体素投影落进 BEV 网格对应格子并累加。这样,一根根“视线”就变成了一片片“地面能量”,著名的 BEV 俯视热力图就是这么来的。

老周偶尔也会“看不清”:远处黑乎乎的一团,他不会赌它是墙还是人,而是在心里画出好几个可能位置,等目标走近或换到另一块屏幕再确认。深度概率分布,就是这种“先留余地、后作判断”的机器版本。

f^i(d)=fi⋅pi(d),pi(d)=ezi,d∑d′=1Dezi,d′\widehat{f}_{i}(d) = f_{i} \cdot p_{i}(d), \qquad p_{i}(d) = \dfrac{e^{z_{i,d}}}{\sum_{d'=1}^{D} e^{z_{i,d'}}}
每个像素的图像特征 f_i 与深度概率 p_i(d) 相乘,同一份特征被“复制”到所有深度档位上,概率高的档位保留更多信息,这就是深度抬升的本质。
  1. 深度概率化softmax 把每个像素在 D 个深度档上的打分 z 变成和为 1 的概率分布。
    pi(d)=ezi,d∑d′=1Dezi,d′p_{i}(d) = \dfrac{e^{z_{i,d}}}{\sum_{d'=1}^{D} e^{z_{i,d'}}}
  2. 特征外积特征向量 f_i 与概率标量相乘,扩展出新维度,得到“每个深度档位各自的特征副本”。
    f^i(d)=fi⋅pi(d)\widehat{f}_{i}(d) = f_{i} \cdot p_{i}(d)
  3. 不确定性保留当目标模糊时,所有档位概率接近均匀分布,特征被均摊到整条视锥,等待后续融合“收拢”。
    ∑d=1Dpi(d)=1\sum_{d=1}^{D} p_{i}(d) = 1

特征融合

八块屏幕有大量重叠:同一根柱子,左边屏幕看到一半,右边屏幕看到一半。老周的诀窍不是简单地叠图,而是“先对齐、再综合”——确认两边是同一个柱子后,把两边信息合并成一个更完整的判断,甚至能猜出柱子后面藏着什么人。

BEV 融合的第一步同样是“对齐”:所有相机抬升出的特征必须落到同一个网格坐标系,否则叠加毫无意义。对齐之后是“综合”:重叠区域如何互补、稀疏区域如何补全、谁的信息更可信——这需要网络自己学,常见的做法是特征相加、拼接,或更高级的注意力机制。

注意力机制让网格上的每个查询点,主动在全部相机特征图里寻找最相关的图像区域,而不是平均地“雨露均沾”。这特别适合处理遮挡:当某路相机看不到目标时,注意力权重会自动偏向仍然可见的相机。此外还有时序融合:把前几帧 BEV 特征按自车运动补偿后与当前帧叠加,让瞬时遮挡也不丢目标——就像老周记得“三分钟前有个红衣人往东走了”。

老周的眼睛其实也有“注意力”:八块屏他不会均匀地扫,而是根据对讲机里的动静,第一时间把目光投到最可疑的那块屏上。注意力机制就是这个“最可疑优先”,让有限的计算资源花在刀刃上。

Attention⁡(Q,K,V)=softmax⁡(QK⊤dk)V\operatorname{Attention}(Q, K, V) = \operatorname{softmax}\left( \dfrac{Q K^{\top}}{\sqrt{d_k}} \right) V
注意力机制用一个查询 Q 去和所有被查询点 K 算相似度,再用相似度作为权重去加权特征 V,实现“有重点地融合”。
  1. 相似度打分Q 与 K 做内积,得到查询与每个位置的相关程度。
    QK⊤Q K^{\top}
  2. 缩放稳定除以特征维度的平方根,防止内积数值过大导致 softmax 饱和。
    QK⊤dk\dfrac{Q K^{\top}}{\sqrt{d_k}}
  3. 加权求和softmax 把分数归一化成权重后乘 V,融合出当前查询点最关心的信息。
    softmax⁡(QK⊤dk)V\operatorname{softmax}\left( \dfrac{Q K^{\top}}{\sqrt{d_k}} \right) V

目标检测

沙盘拼完,老周开始“圈人”:谁在跑、谁在停、往哪个方向、大概多高多大。BEV 检测头做的事完全一样:在俯视网格上直接输出目标的 3D 框,让下游知道“哪里有什么、正在干什么”。

与 2D 图像检测不同,BEV 检测预测的是三维属性:中心点 (x, y, z)、长宽高、朝向角、运动速度,以及类别。中心点通常用热力图预测——网格上每个位置的“有目标概率”形成一张 heatmap,峰值所在就是目标中心;3D 框参数由回归分支输出;速度可以通过相邻帧中心点位移求导,也可以直接回归相对自车的三维速度。

因为 BEV 网格具有真实尺度,检测器可以直接复用成熟的 2D 检测结构:在 H×W 网格上做稠密预测,再加一个方向分类头,解决航向角 180° 对称歧义。训练时总损失是分类、回归、方向三个任务的加权和,让网络同时学会“找到目标、框准目标、辨清朝向”。

老周圈完人还会顺口补一句“外卖员,快,往东”——这个“标签 + 运动状态”,就是 BEV 检测在输出给下游预测规划模块的周边态势图,车辆是否减速、是否变道,都由它决定。

L=Lcls+λ1Lreg+λ2Ldir\mathcal{L} = \mathcal{L}_{\mathrm{cls}} + \lambda_1 \mathcal{L}_{\mathrm{reg}} + \lambda_2 \mathcal{L}_{\mathrm{dir}}
总损失由三部分组成:分类损失负责找目标,回归损失负责框准目标,方向损失负责辨清朝向,λ 调节三者权重。
  1. 分类损失判断网格位置上是否存在目标中心,常用热力图监督。
    Lcls\mathcal{L}_{\mathrm{cls}}
  2. 回归损失衡量 3D 框参数(中心坐标、长宽高、朝向角)与真值的差距。
    Lreg=∥b−b^∥\mathcal{L}_{\mathrm{reg}} = \left\| b - \widehat{b} \right\|
  3. 方向损失对朝向角做分类或回归,消除对称目标的方向二义性。
    Ldir\mathcal{L}_{\mathrm{dir}}
  4. 权重平衡λ 是超参数,让三个任务的梯度量级匹配,训练更稳定。
    λ1,λ2>0\lambda_1, \lambda_2 > 0

主流模型

同样是拼沙盘,不同的“保安”各有各的习惯:有的人先估距离再放位置,有的人直接盯着可疑区域看。BEV 模型也因此分成几大流派,各有拥趸。

LSS 属于“深度估计派”:先用深度分布把特征抬升成视锥,再散落到网格上,干净直接,是纯视觉 BEV 的基石。BEVFormer 属于“查询派”:在网格上放置大量可学习的空间查询,每个查询通过可变形注意力,围绕参考点在图像特征上自适应采样,把 2D 信息“拉”进 3D 网格,效果更好但计算量更大。DETR3D 属于“稀疏派”:不做稠密网格,而是直接用一组 3D 目标查询反投影回各相机图像采样特征,端到端输出检测框,省掉了大部分网格计算。

此外还有“点云派”:激光雷达天然带有精确三维坐标,把点云柱子化(如 PointPillars)后同样能生成 BEV 特征,视觉 BEV 常与它做多模态融合。量产选型时,精度、延迟、部署成本三者必须权衡——有时甚至把两派模型蒸馏成一份“混合习惯”,兼顾速度与效果。

老周的商场里,经验丰富的保安和新来的实习生拼出的沙盘精度不一样。模型选型也像招人:要看商场的面积、客流量和工资预算——没有最好的模型,只有最合适的方案。

DeformAttn⁡(q,p,x)=∑m=1MWm∑k=1KAmk x(p+Δpmk)\operatorname{DeformAttn}(q, p, x) = \sum_{m=1}^{M} W_m \sum_{k=1}^{K} A_{mk} \, x\left( p + \Delta p_{mk} \right)
可变形注意力是 BEVFormer 的核心:查询点先在图像上找到参考点 p,再学习一组位置偏移 Δp,在偏移后的位置采样特征,加权汇总。
  1. 参考点投影BEV 网格上的查询点 q,通过相机内外参投影到图像平面得到参考点 p。
    p=Project(q)p = \text{Project}(q)
  2. 学习偏移每个注意力头 m 和采样点 k 学习一个位置偏移 Δp,允许特征采样偏离参考点。
    x(p+Δpmk)x\left( p + \Delta p_{mk} \right)
  3. 加权聚合A 是归一化的采样权重,K 个采样点加权求和,M 个注意力头再合并,得到查询点融合的图像特征。
    ∑m=1MWm∑k=1KAmk⋅xmk\sum_{m=1}^{M} W_m \sum_{k=1}^{K} A_{mk} \cdot x_{mk}

工程挑战

沙盘要真正上车,还得迈过三道坎:算力、标定、长尾数据。这就像老周拼沙盘时面临的三个现实问题——屏幕太多看不过来、屏幕位置会歪、总会遇到没见过的情况。

算力是第一个瓶颈。多路相机 × 多个深度档位 × 高分辨率特征,三者相乘的算力开销让车规级芯片吃紧。工程上常见手段有:减少深度档位、稀疏化无用区域计算、int8 量化、算子融合。掌握“算力-精度”的换算关系,是感知工程师的基本功——每省下一毫秒延迟,都可能换来更高的安全冗余。

第二个坎是标定漂移:摄像头在颠簸、碰撞、日晒温变后,外参逐渐漂移,BEV 拼接就会错位,检测框在地面“滑行”。量产车因此需要在线自标定,不停用路面特征微调外参。第三个坎是长尾:异形车、暴雨反光、极端遮挡等数据稀少的场景,要靠仿真合成与真实数据混合喂养,才能让模型不犯“没见过等于没看见”的低级错误。

老周的精力也是“算力”——屏幕太多看不过来时,他会自动聚焦最危险的区域;他上班久了也会记错柜台位置,需要偶尔巡逻校准。工程化 BEV 不过是把保安的自然经验,变成一台能自检、自纠的机器。

C=O(Ncam×D×Himg×Wimg×Cfeat)C = O\left( N_{\mathrm{cam}} \times D \times H_{\mathrm{img}} \times W_{\mathrm{img}} \times C_{\mathrm{feat}} \right)
抬升与融合的计算开销是相机数、深度档位、图像分辨率、特征通道数五个因子的乘积,任何一项减半都能直接降低总计算量。
  1. 相机路数N_cam 是参与 BEV 融合的摄像头数量,通常为 6~8 路。
    NcamN_{\mathrm{cam}}
  2. 深度档位D 是深度离散化的档位数,档位越多深度越精细、计算越大。
    DD
  3. 特征分辨率H_img × W_img 是图像特征图尺寸,决定每个像素的抬升次数。
    Himg×WimgH_{\mathrm{img}} \times W_{\mathrm{img}}
  4. 通道开销C_feat 是特征通道数,所有抬升特征都要在网格上累加,通道数乘入总开销。
    CfeatC_{\mathrm{feat}}

行业应用

沙盘终于从机房走向了量产车。如今的高速 NOA、城市领航、自动泊车,都是踩在 BEV 这张沙盘上跑的。老周的那套“俯瞰全局”的本事,正变成每一台智能车的标配。

高速 NOA 场景中,BEV 提供统一尺度下的周边目标流,变道、超车、进出匝道时测距测速更可靠;城市领航面对复杂路口和无保护左转,多相机加时序融合的 BEV 能有效缓解“鬼探头”和遮挡;自动泊车则利用环视鱼眼相机生成近距离俯视拼接图,直接输出车位框与障碍物,实现记忆泊车、代客泊车。

BEV 的疆界还在外扩:路侧车路协同、园区无人配送、低速物流车,凡是“多个摄像头要统一成一个俯视世界”的场景,都是它的舞台。特斯拉 FSD、华为 ADS、蔚来 NOP+ 等系统都已公开采用 BEV 类架构——它已经成为智能驾驶感知的主流范式。时序融合更是让这张沙盘“活”了起来,不再只是一帧快照。

老周的“记忆补盲”被写进了机器:即使目标短暂被柱子挡住,时序融合让系统仍记得它在哪里。BEV 的意义也许正是——让机器学会了保安老周的那项过人本领:站得高,看得全,还记得牢。

Bt=Warp⁡(Bt−1)⊕Splat⁡(f^t)B_t = \operatorname{Warp}\left( B_{t-1} \right) \oplus \operatorname{Splat}\left( \widehat{f}_{t} \right)
当前时刻的 BEV 表达 = 将上一帧网格按自车运动摆正后 + 当前帧抬升特征落格,新老信息叠加,沙盘就有了“记忆”。
  1. 历史姿态矫正Warp 按两帧之间自车的位移与转角,把上一帧网格搬到当前坐标系。
    Warp⁡(Bt−1)\operatorname{Warp}\left( B_{t-1} \right)
  2. 当前帧落格Splat 把本帧图像抬升后的特征累加到对应网格格子上。
    Splat⁡(f^t)\operatorname{Splat}\left( \widehat{f}_{t} \right)
  3. 新旧融合⊕ 表示相加或拼接,让网格同时包含历史记忆与当下观测。
    Bt=Bt−1warped⊕BtcurrentB_t = B_{t-1}^{\text{warped}} \oplus B_t^{\text{current}}

AI 应用场景

高速NOA辅助驾驶

阶段:多传感器融合感知(感知系统 → 预测规划前端)

解决的问题:传统前视方案下,变道时对旁车道车辆的测距误差大,匝道并入时目标容易跟丢。BEV 把六路摄像头统一成俯视网格,让测距、测速和目标级连续性在统一尺度下完成,加塞车辆可以被提前识别。

具体案例:某量产车型在高速开启 NOA,系统用 6 路摄像头生成 BEV 目标流。在右侧车辆突然切入的场景下,BEV 检测提前约 0.5 秒锁定目标并触发减速;而旧平台在相同场景下常常晚一拍,只能急刹,乘坐体验差距明显。

记忆泊车

阶段:低速近距离环境感知(泊车系统输入)

解决的问题:鱼眼镜头近距畸变大,单视角判断车位易误判,弱光地库更是灾难。BEV 环视拼接给出真实尺度的俯视车位与障碍物分布,让泊车路径规划有了可靠输入。

具体案例:车主把车开到停车场入口,开启记忆泊车功能。车辆用环视鱼眼生成近距 BEV 图,在昏暗地库中稳定输出空车位框与柱子位置,结合自车运动完成全程自动泊入,全程无需人工接管。

车路协同路口感知

阶段:路侧融合感知(V2X 基础设施)

解决的问题:单车视角存在盲区,路口场景尤其危险。路侧多相机 BEV 融合把路口全貌统一成俯视态势,再通过 V2X 下发给车辆,帮助车辆“看见”墙后的目标。

具体案例:某智慧路口部署 4 路路侧相机,BEV 融合输出路口所有交通参与者的位置与速度,红灯倒计时和盲区行人信息提前 2 秒推送给接近车辆,显著降低路口碰撞风险。

Python 演示

python48 行
# -*- coding: utf-8 -*-"""ToyBEV: 简化版LSS式BEV感知演示用6路图像特征 + 深度概率 生成俯视网格特征"""import numpy as np  def softmax(x, axis=-1):    e = np.exp(x - x.max(axis=axis, keepdims=True))    return e / e.sum(axis=axis, keepdims=True)  class ToyBEV:    def __init__(self, num_cam=6, feat_c=8, num_depth=4, grid=8):        np.random.seed(0)        self.cam = num_cam        self.fc = feat_c        self.num_depth = num_depth        self.grid = grid        # 预计算映射表: (相机, 图内行, 图内列, 深度档) -> BEV格子编号        self.lift_map = np.random.randint(            0, grid * grid, (num_cam, 3, 3, num_depth))        # 深度网络权重: 决定每个像素落在各深度档上的概率        self.depth_w = np.random.randn(num_cam, 3, 3, num_depth)     def lift_and_splat(self, feats):        # feats: (cam, feat_c, 3, 3) 图像特征        f = np.transpose(feats, (0, 2, 3, 1))       # (cam, 3, 3, fc)        depth_prob = softmax(self.depth_w, axis=-1)  # (cam, 3, 3, d)        # 外积: 特征沿深度复制并乘上概率 -> (cam,3,3,d,fc)        lifted = f[:, :, :, None, :] * depth_prob[:, :, :, :, None]        bev = np.zeros((self.grid, self.grid, self.fc))        for c in range(self.cam):            for i in range(3):                for j in range(3):                    for k in range(self.num_depth):                        g = self.lift_map[c, i, j, k]                        bev[g // self.grid, g % self.grid] += lifted[c, i, j, k]        return bev  if __name__ == "__main__":    model = ToyBEV()    feats = np.random.randn(6, 8, 3, 3)    bev = model.lift_and_splat(feats)    print("BEV特征网格形状:", bev.shape)    print("各格子特征能量(通道求和):")    print(bev.sum(axis=-1).round(2))
目的:演示 LSS 方法中“抬升-散开”的核心运算——用深度概率分布把图像特征沿深度复制,再根据预计算的标定映射累加到鸟瞰网格。
  1. e = np.exp(x - x.max(axis=axis, keepdims=True))减去最大值防止指数爆炸,是数值稳定的 softmax 写法。
  2. depth_prob = softmax(self.depth_w, axis=-1)每个像素在 4 个深度档位上的概率之和必定为 1。
  3. f = np.transpose(feats, (0, 2, 3, 1))调整维度顺序,把特征通道放到最后,方便后续外积运算。
  4. lifted = f[:, :, :, None, :] * depth_prob[:, :, :, :, None]一行代码完成“抬升”:特征沿深度轴广播复制并乘上对应概率。
  5. bev[g // self.grid, g % self.grid] += lifted[c, i, j, k]根据标定映射把抬升特征累加到对应格子,这就是“散开”。
  6. bev.sum(axis=-1).round(2)把特征通道压缩成能量值,直观看出哪个网格位置“有东西”。

常见误区

误区我以为 BEV 就是车机里那个导航地图,感知系统只需要把车标在地图上,再叠加一些动态图标就行了。

正解BEV 是实时生成的感知特征网格,不是静态地图。它由摄像头、雷达等传感器当前时刻的特征动态构建,车辆、行人都在上面实时刷新;导航地图只能作为先验辅助,提供道路拓扑,却无法给出动态目标的位置与速度。两者一个是“照片墙”,一个是“活沙盘”,完全不是一回事。

为何常见:因为两者都叫“俯视图”,字面上的相似让初学者误以为 BEV 就是电子地图的增强版。

误区我一直以为 BEV 的深度估计像激光雷达一样,能给每个点一个精确到厘米的距离,测不准就是算法不行。

正解单目图像本身缺乏绝对尺度信息,深度估计输出的其实是离散深度档位上的概率分布,而不是精确距离。它的价值恰恰在“承认不确定”:先广撒网保留所有可能,再靠多相机融合与时序观测把概率收敛。把概率分布当成精确测距,是初学者最常见的理解偏差。

为何常见:“深度估计”这个名词容易让人联想到激光雷达测距,而演示图又常把概率热力图画得很“精确”,加剧了误解。

误区我觉得只要把车上摄像头从 6 个加到 12 个,看得更全,BEV 融合出来的精度自然翻倍。

正解精度提升受制于标定精度、算力预算和融合算法。相机数量增加意味着标定误差累积点更多、重叠区域的融合更难、计算量线性上升;如果标定或融合跟不上,更多相机反而会放大错位。加相机是必要条件而非充分条件——就像给保安增加屏幕,但屏幕都是歪的,再多也没用。

为何常见:“看得多了肯定看得清”符合日常直觉,忽略了感知系统是一个整体误差链条,任何一个环节拖后腿都会拉低上限。

误区BEV 应该就是把六个摄像头拍到的照片像拼图一样拼起来,再把视角拉成俯视的样子。

正解BEV 拼的不是“照片像素”,而是“特征”。每个像素先被深度概率抬升成视锥体特征,再投影到网格累加,整个过程由网络学习,不是简单的几何拼接。而且透视到俯视不存在完美的解析变换,必须依赖数据驱动。把 BEV 理解为“特征融合视图”更准确,而非“全景拼接图”。

为何常见:BEV 可视化 demo 常展示“画面投影到地面”的效果,让人误以为是多摄像头图像的直接拼接。

面试题

Q1. BEV感知最核心的特点是?

单选题 · easy

  • A.多路视角统一映射到俯视网格空间← 正确答案
  • B.各传感器测量结果简单相加取平均
  • C.仅依赖单一前视摄像头完成全部检测
  • D.用三维激光点云完全替代视觉传感器

答案:A。BEV 的核心是把车身多路摄像头乃至雷达的特征统一映射到一张以自车为中心的俯视网格上,形成统一表达。B 是错误抽象,融合不是简单相加;C 和 D 都放弃了多视角融合的初衷。就像老周要把八块屏幕合成一张沙盘,而不是只看一块屏或只用一张截图。

Q2. 相机内参矩阵主要描述?

单选题 · easy

  • A.相机相对车体的安装位置姿态
  • B.像素坐标与光心焦距间的映射关系← 正确答案
  • C.图像亮度与曝光时间之间的对应关系
  • D.目标在真实世界坐标系中的运动速度

答案:B。内参 K 描述三维点在相机坐标系中如何成像到像素平面,包含焦距与光心;外参才描述相机相对车体的位置姿态。A 属于外参,C 属于 ISP 参数,D 属于下游检测任务,都与内参无关。

Q3. LSS方法中的“抬升”操作指的是?

单选题 · mid

  • A.把俯视特征反向投影回各相机图像
  • B.用深度分布把图像特征沿深度方向扩展← 正确答案
  • C.提升图像分辨率以增强远处目标细节
  • D.将三维点云映射到高维的特征空间

答案:B。LSS 的 Lift 阶段用深度概率分布与图像特征做外积,把每个像素的特征沿离散深度档位复制成视锥体,这就是“抬升”。A 是反向投影,C 是超分,D 是点云处理,均与抬升定义不符。

Q4. 关于BEV特征融合的正确说法是?

多选题 · mid

  • A.多相机特征须先对齐到统一坐标系← 正确答案
  • B.注意力机制能自适应选择重点区域← 正确答案
  • C.时序融合利用历史帧抑制检测抖动← 正确答案
  • D.特征通道越多感知精度必然越高

答案:ABC。对齐是融合前提,注意力让查询点自适应聚焦相关图像区域,时序融合借助历史帧稳定输出,三者都对。D 错误,通道数增加会带来算力负担,且不一定提升精度,就像给老周更多屏幕但信息重复反而干扰判断。

Q5. BEV检测3D框回归一般不直接输出?

单选题 · hard

  • A.物体中心点的三维坐标位置信息
  • B.目标的长宽高尺寸与朝向角度
  • C.目标语义类别标签及其置信度
  • D.相机标定矩阵中的具体参数值← 正确答案

答案:D。3D 框回归输出中心点、尺寸、朝向等目标几何属性;类别属于分类分支。相机标定矩阵是感知系统的输入配置,由标定流程给定,不是检测网络的输出。就像老周判断“谁在哪、多大多快”,但不会去推导“摄像头装在墙上的角度”。

Q6. BEVFormer在BEV网格上的核心机制是?

单选题 · mid

  • A.全局稠密自注意力覆盖所有查询网格
  • B.可变形注意力围绕参考点采样图像特征← 正确答案
  • C.循环神经网络逐行扫描俯视特征网格
  • D.固定卷积核在特征图上滑动提取信息

答案:B。BEVFormer 的核心是空间可变形注意力:每个 BEV 查询投影出参考点,学习偏移后在图像特征上采样再聚合。A 是全局注意力、开销过大;C 是 RNN 思路;D 是纯卷积思路,都不是 BEVFormer 的标志机制。

Q7. BEV工程落地中的典型挑战有?

多选题 · hard

  • A.多相机联合标定误差随使用逐渐漂移← 正确答案
  • B.全场景稠密计算对车规级芯片压力大← 正确答案
  • C.长尾场景数据采集标注成本非常高昂← 正确答案
  • D.持续增加相机数量精度必然线性上升

答案:ABC。标定漂移、算力瓶颈、长尾数据是 BEV 量产三大关卡。D 错误,相机数量增加并不必然带来线性精度提升,反而可能因标定误差和融合难度拖累效果,这与“屏幕多不等于看得准”同理。

Q8. 关于深度分布特点的正确表述是?

单选题 · mid

  • A.每个像素的深度都是精确测量得到的
  • B.深度概率分布体现距离估计的不确定性← 正确答案
  • C.深度准确性只与图像亮度强相关
  • D.深度估计结果无法参与检测任务

答案:B。单目深度估计输出的是离散档位上的概率分布,本质是表达“目标可能在哪个距离段的不确定度”,而不是精确测量。A 把概率当测距,C 忽略几何与语义线索,D 错误,深度分布正是 BEV 检测的基础输入。

Q9. 左右相机重叠区域的感知价值在于?

单选题 · mid

  • A.数据严重冗余必须提前直接裁剪丢弃
  • B.提供互补视角增强遮挡目标的检出能力← 正确答案
  • C.仅仅用于验证标定模块是否正常工作
  • D.让图像的像素分辨率成倍地大幅提高

答案:B。重叠区域让同一目标被多个视角观测,融合后可以互相补全遮挡、消除深度歧义,是老周“两面看同一个柱子”的机器版。A 把价值当负担,C 只是附带用途,D 与分辨率无关。

Q10. BEV相对前视感知的突出优势是?

多选题 · easy

  • A.提供统一尺度下的俯视真值表达← 正确答案
  • B.便于多帧目标运动关联与轨迹预测← 正确答案
  • C.缓解透视遮挡带来的深度歧义问题← 正确答案
  • D.完全消除雨雪雾等恶劣天气的影响

答案:ABC。BEV 给所有目标一个真实尺度的统一坐标系,让跨帧关联和轨迹预测变得自然,同时俯视表达缓解了透视遮挡。D 错误,传感器在雨雪雾中的成像衰减依然存在,BEV 无法“完全消除”天气影响,就像老周的监控在停电时也无能为力。