智能驾驶感知算法任务简介
智能驾驶感知模块可以根据目标的属性和环境信息,分为三类关键任务:动态感知任务、静态结构感知任务和可通行区域(Freespace)感知任务。本文将结合 BEVFormer、MapTR 和 Occupancy Prediction 三个算法,简单介绍一下他们,如果有不正确的地方,欢迎评论。
一、动态感知任务:BEVFormer
1.1 任务简介
动态任务关注的是 检测和跟踪场景中运动物体 ,如行人、车辆、自行车等。核心目标是预测这些目标的 三维空间位置、尺寸、速度和朝向 ,为路径规划与决策系统提供实时支持。
1.2 核心算法
BEVFormer 是近年来领先的 3D 感知框架之一,提出了一种融合 Bird’s Eye View(BEV)视角和 Transformer 架构 的感知方式。它利用多摄像头输入构建 BEV 表征,并结合时序特征做运动物体感知。
BEV 是什么?
BEV(Bird’s Eye View,俯视图) 是一种以“从天而降”的视角查看场景的表示方式。相较于图像原始视角(front-view),BEV 将感知信息映射到地面平面,使得空间关系更直观:
- 每个像素表示地面上一个固定区域(如 0.5m × 0.5m);
- BEV 具有固定分辨率和尺度,便于与规划、控制模块对接;
- 动态物体不会因远近发生比例变化,便于稳定检测和跟踪。
BEVFormer 架构简介
- 图像编码:使用 ResNet+FPN 的 backbone+neck 结构提取多视角图像特征;
- Lift 操作:将图像特征结合深度预测“抬升”(lift)到三维空间中;
- Splat 投影:将三维点投影到 BEV 平面网格,聚合形成 BEV 特征图;
- 时序建模:引入前几帧 BEV 特征,使用 temporal attention 模块进行时序对齐;
- 目标检测解码器:采用 learnable query,预测 3D 物体框及其类别。
Lift(抬升)
在感知任务中,模型经常需要将图像信息“映射”到三维空间中。这一过程称为 Lift(抬升),可以实现实现 2D → 3D 映射,统一多个视角的感知结果。具体来说:
- 每个像素在原始图像中只提供 2D 信息(x, y),没有深度;
- 利用深度估计(或相机投影矩阵)推测该像素在 3D 空间中的位置;
- 所有 3D 点再“划分”为离散的三维网格(Voxel Grid),以统一尺度处理。
3D 物体框表示形式
BEVFormer 输出的 3D BBox 通常以 [x, y, z, dx, dy, dz, θ] 表示:
- (x, y, z):中心坐标;
- (dx, dy, dz):尺寸;
- θ:朝向角。
二、静态建图任务:MapTR
2.1 任务简介
静态感知任务主要关注场景中静态结构物体,包括车道线、道路边界、停止线等。这类信息对地图构建、定位、行为规划等很重要。
2.2 核心算法
MapTR 是一种矢量建图方法,首次在 Transformer 框架中实现了 Polyline 格式的地图元素生成。与传统的栅格输出不同,MapTR 直接输出点序列形式的几何结构,精度更高。
Polyline 是什么?
Polyline 是一条折线,由一系列顺序连接的点组成,常用于表示线型元素:车道线、道路边界、路沿、箭头、停止线等。
通常每条 polyline 表示为点集 [p1, p2, …, pn],每个点为 (x, y) 或 (x, y, attr)(带语义)。
MapTR 架构简介
- 图像特征提取:使用 CNN + Transformer 提取多摄像头图像特征;
- BEV 表征生成:将图像 lift 到 3D 后,splat 投影为 BEV 特征;(前两步和动态感知任务那儿一样)
- 结构化 Query 解码:
- 每个 query 对应一条 polyline;
- 生成起点后,通过自回归方式生成后续点序列;
- 多类别建图:支持同时预测多类地图元素,如 divider(车道之间的分隔线)、boundary(道路边界)、arrow(导向箭头)、stopline(停止线) 等。
三、Freespace 感知任务:Occupancy Prediction
3.1 任务简介
Freespace 任务旨在预测环境中可通行区域与障碍物位置。通过对周围三维空间进行体素划分,输出每个 voxel(体素)的占用状态。
3.2 核心算法
Occupancy 模型通常采用图像或点云输入,结合深度估计和 3D 重建,生成 Occupancy Grid,即空间占用网格。
什么是 Occupancy Grid?
Occupancy Grid 是将三维空间离散为等间距的体素格(voxel),每个 voxel 包含一个数值表示其被占用的概率:
- 值为 0:free 空间;
- 值为 1:确定被障碍物占据;
- 值介于两者之间:存在不确定性。
典型输出维度为 [B, C, X, Y, Z],其中 B 为 batch size,C 为类别数或 occupancy 状态数,X、Y、Z 表示 3D 空间上的 voxel 网格。
对这里的 C 再展开聊一下:
C = 1(单通道概率)
- 表示每个 voxel 的被占概率,即该 voxel 被物体占据的概率;
- 输出经过 sigmoid 激活函数,将值映射到 0,1;
- 值越接近 1 → 越确定被物体占据;接近 0 → 自由空间。
# 示例:输出为 [B, 1, X, Y, Z],经过 sigmoid 得到概率
occupancy_logits = model(input)
occupancy_probs = torch.sigmoid(occupancy_logits)
C > 1(多通道分类概率)
- 每个 voxel 是一个多分类问题,比如:
- 通道 0:free
- 通道 1:occupied
- 通道 2:unknown 或 uncertain
- 输出经过 softmax,每个 voxel 的 3 个类别概率和为 1:
# 示例:输出为 [B, 3, X, Y, Z],对 C=3 维度做 softmax
occupancy_logits = model(input)
occupancy_probs = torch.softmax(occupancy_logits, dim=1)# occupied 概率提取
occupied_prob = occupancy_probs[:, 1, ...]
也可以引入语义标签,将空间分为:
- drivable(可通行区域);
- static obstacle(建筑物、护栏);
- dynamic obstacle(行人、车);
- unknown(不确定区域)。
四、总结
看下图有个感觉即可:
签,将空间分为:
- drivable(可通行区域);
- static obstacle(建筑物、护栏);
- dynamic obstacle(行人、车);
- unknown(不确定区域)。
四、总结
看下图有个感觉即可: