1. 课程导入
在自动驾驶感知系统中,如何把分布在车身四周的多个摄像头图像,统一映射到一个自上而下的鸟瞰图(Bird's Eye View,BEV)空间,是近年来最具工程价值的问题之一。LSS(Lift, Splat, Shoot)正是这一方向的代表性方法:它通过“抬升—泼溅—投射”三步,把多视图 2D 图像特征转换为统一的 BEV 特征,从而支撑检测、分割、预测与规划等下游任务。本课程围绕 LSS 多视图 BEV 感知的工程实现展开,本章先建立整体认知框架。
一、什么是 LSS 多视图 BEV 感知
LSS 的核心思想可以概括为:每个相机在图像平面上的像素,并不直接对应地面上的某个点,而是对应一条从相机光心出发的三维射线。LSS 不急于在图像空间做融合,而是先为每个像素预测一组离散深度分布,把 2D 特征“抬升”为沿射线的 3D 特征点云;再通过相机内外参,把这些 3D 点“泼溅”到统一的 BEV 网格中;最后在 BEV 网格上做卷积或 Transformer 编码,完成“投射”到下游任务头。
与单目 BEV 或纯激光雷达方案相比,LSS 的关键优势在于:多相机共享同一 BEV 坐标系,遮挡与尺度问题被统一到同一空间处理,且不依赖高精地图即可端到端训练。它的代价是深度估计误差会直接传播到 BEV 特征,因此工程上必须关注深度监督、外参标定与 BEV 网格分辨率等参数。
二、发展背景:从单目到多视图统一 BEV
早期自动驾驶感知以激光雷达为主,摄像头多用于 2D 检测与车道线识别。随着纯视觉方案兴起,行业逐渐意识到:多相机图像必须在统一空间融合,否则前视、侧视、后视的检测结果无法直接用于规划控制。2020 年前后,LSS 论文提出“抬升—泼溅”范式,随后 BEVDet、BEVDepth、BEVFormer、PETR 等方法不断演进,形成今天多视图 BEV 感知的技术谱系。
推动这一演进的因素主要有三点:其一,车载算力提升使端到端 BEV 网络可实时运行;其二,大规模多相机数据集与自动标注降低了训练门槛;其三,下游规划控制对统一 BEV 表示的需求越来越强。LSS 作为其中结构清晰、可解释性好的基线,是理解整个技术栈的最佳入口。
三、典型应用场景与工程约束
LSS 多视图 BEV 感知主要服务于以下场景:
- 城市 NOA 与高速领航:需要 BEV 下的车辆、行人、锥桶检测与可行驶区域分割。
- 自动泊车与记忆泊车:依赖近距离 BEV 占用栅格与车位检测。
- 多传感器融合:BEV 特征可作为与激光雷达、毫米波雷达融合的统一接口。
- 端到端规划:BEV 特征直接输入轨迹预测与规划网络,减少手工规则。
工程误区提醒:很多初学者认为 LSS 只是“把图像投影到地面”,忽略了深度分布预测才是精度关键。若深度监督缺失或外参标定漂移,BEV 特征会出现明显“重影”与“拉伸”,下游检测 mAP 会大幅下降。因此,深度分支的损失权重、外参在线校准与 BEV 网格分辨率必须联合调优。
四、整体课程框架与学习路径
本课程共 30 章,按“原理—数据—模型—训练—部署—排障”六段式组织。下表给出整体框架与关键产出:
| 阶段 | 章节范围 | 核心内容 | 关键产出 |
|---|---|---|---|
| 原理基础 | 第 1–5 章 | LSS 定义、坐标系、深度分布、体素池化、BEV 网格 | 可运行的 Lift-Splat 最小实现 |
| 数据与标定 | 第 6–10 章 | nuScenes 数据解析、相机内外参、畸变校正、时间同步 | 多视图数据加载与标定校验脚本 |
| 模型结构 | 第 11–16 章 | Backbone、深度头、BEV 编码器、检测/分割头 | 完整 BEV 感知网络 |
| 训练与调优 | 第 17–22 章 | 损失函数、深度监督、数据增强、混合精度、分布式训练 | 可复现的训练配置与日志 |
| 部署与优化 | 第 23–27 章 | TensorRT、ONNX 导出、量化、算子融合、时延分析 | 车载推理引擎与性能报告 |
| 排障与复盘 | 第 28–30 章 | 重影、漏检、外参漂移、深度塌缩等典型问题 | 故障树与调参手册 |
五、最小可运行示例:LSS 前向伪代码
为建立直观印象,下面给出 LSS 前向过程的核心伪代码。注意其中 depth_bins、bev_grid 与 voxel_pool 是后续章节会反复出现的参数与算子。
# LSS 前向核心步骤(伪代码)
def lss_forward(images, intrinsics, extrinsics):
# 1. Lift:2D 特征 + 深度分布
feats = backbone(images) # [N, C, H, W]
depth = depth_head(feats) # [N, D, H, W]
depth = softmax(depth, dim=1) # 沿深度维归一化
frustum = feats.unsqueeze(1) * depth.unsqueeze(2) # [N, C, D, H, W]
# 2. Splat:视锥体 -> BEV 网格
points = project_to_ego(frustum, intrinsics, extrinsics)
bev = voxel_pool(points, bev_grid=(200, 200), x_range=(-50, 50), y_range=(-50, 50))
# 3. Shoot:BEV 编码 + 任务头
bev_feat = bev_encoder(bev) # [B, C, 200, 200]
det = detection_head(bev_feat)
seg = segmentation_head(bev_feat)
return det, seg
学习建议:第 1 章不必急于跑通全部代码,先建立“多相机 → 深度分布 → 3D 视锥 → BEV 网格 → 任务头”的信号链认知。后续每章都会围绕这条链上的一个环节深入,最终拼装成可部署的工程系统。
本章作为课程导入,明确了 LSS 多视图 BEV 感知的定义、发展背景、应用场景与整体框架。理解这条从图像到 BEV 的完整信号链,是后续数据、模型、训练与部署各环节的基础。