在自动驾驶系统中,BEV(Bird’s Eye View)+ Transformer 主要应用于 感知与环境建图(Perception & Scene Understanding) 环节,尤其是在 多传感器融合、目标检测、语义分割、轨迹预测 等任务中。
🚗 在自动驾驶中的关键应用场景
应用环节 | BEV+Transformer 的作用 |
---|---|
感知(Perception) | 多摄像头图像融合成BEV视角,进行目标检测、语义分割 |
预测(Prediction) | 基于BEV表示预测其他交通参与者的未来轨迹 |
规划(Planning) | 利用BEV地图进行路径规划和决策 |
多传感器融合 | 将图像、雷达、IMU等数据统一到BEV空间中,Transformer进行融合建模 |
🧠 BEV + Transformer 的核心作用
1. BEV(鸟瞰图)表示
- 定义:将来自摄像头、激光雷达等传感器的数据转换为从上帝视角(俯视图)观察的空间表示。
- 优势:
- 消除透视畸变,更适合空间理解。
- 统一不同传感器的数据格式,便于融合。
- 更容易进行路径规划和目标跟踪。
2. Transformer 架构
- 定义:一种基于注意力机制的深度学习模型,擅长处理序列和空间关系。
- 优势:
- 强大的全局建模能力,适合理解复杂场景中的空间关系。
- 可扩展性强,适用于多模态输入(如图像+雷达+地图)。
- 在处理稀疏数据(如点云)时表现优异。
✅ 为什么业界高度认可?
- 性能优越:如 Tesla 的 Occupancy Network、Waymo 的 Perception Stack、NVIDIA 的 BEVFormer 等都采用 BEV+Transformer 架构,在公开数据集上表现领先。
- 可扩展性强:适用于不同数量和类型的传感器,适配不同自动驾驶系统。
- 端到端能力:支持从原始传感器数据到高层语义理解的端到端训练。
- 统一表示:BEV提供了一个统一的空间表示,便于后续模块(如预测和规划)使用。
一些代表性的模型,比如:
- BEVFormer
- PETR / PETRv2
- SurroundOcc
- Tesla Occupancy Network
BEVFormer 是一款在自动驾驶感知领域广受关注的模型,首次发表于 ECCV 2022,核心思想是将多摄像头图像通过 时空 Transformer 融合为统一的 BEV(Bird’s Eye View)表示,以支持 3D 目标检测、语义分割等任务。
🧱 模型架构概览
BEVFormer 的整体架构由三个关键模块组成:
1. BEV Queries 构建
- 将 BEV 空间划分为固定网格(如 200×200),每个网格位置初始化一个 learnable 的查询向量(query)。
- 这些查询向量代表车辆周围空间的感知需求,是整个模型的核心表示。
2. 空间交叉注意力(Spatial Cross-Attention)
- 将 BEV 查询点投影到各个摄像头图像平面,采样相关区域的图像特征。
- 使用 可变形注意力机制(Deformable Attention),只关注与 BEV 查询相关的图像区域,显著降低计算量。
3. 时间自注意力(Temporal Self-Attention)
- 利用历史帧的 BEV 表征,通过自注意力机制与当前帧对齐,增强时序建模能力。
- 引入车辆自身运动补偿(ego-motion alignment)以对齐历史 BEV 特征。
🧪 训练方式与性能
- 数据集:主要使用 nuScenes 数据集,包含 6 个摄像头、雷达、IMU 等多模态数据。
- 训练资源需求:
- BEVFormer-Base 版本需约 28GB 显存,单卡训练需约 14 天,8 卡并行可缩短至 2 天。
- 性能指标:
- 在 nuScenes 上达到 56.9% NDS(camera-only),超过当时所有纯视觉方法。
- 在 Waymo Camera-Only Track 上也取得冠军成绩。
- 开源地址:官方 GitHub 地址:BEVFormer GitHub
🏭 应用与产业落地
BEVFormer 及其变体已被广泛应用于学术研究和工业界:
- 学术界:作为多个 BEV 感知任务的 baseline,被用于目标检测、语义分割、轨迹预测等任务。
- 工业界:
- 特斯拉:其 Occupancy Network 也采用 BEV 表示 + Transformer 架构。
- 小鹏、蔚来、百度 Apollo 等国内厂商也在研究 BEV 表征的感知系统。
- 幻方 AI 等平台优化了 BEVFormer 的多卡训练效率,实现 3 小时内完成全精度训练
📌 总结亮点
特性 | 描述 |
---|---|
纯视觉输入 | 不依赖激光雷达,仅用多摄像头图像实现高精度感知 |
时空融合 | 同时建模空间和时间信息,提升遮挡场景下的鲁棒性 |
稀疏注意力机制 | 显著降低计算复杂度,适合部署 |
开源生态完善 | 提供完整代码、模型、文档,便于复现与扩展 |
🛠️ 如何在本地训练 BEVFormer
主要还是需要带显卡的机器,操作系统Linux的,以下是基于 Ubuntu + Conda 环境的完整训练流程:
📦 1. 克隆代码仓库
git clone https://github.com/fundamentalvision/BEVFormer.git
cd BEVFormer
🐍 2. 创建 Python 环境
conda create -n bev python=3.8 -y
conda activate bev
⚙️ 3. 安装依赖库
pip install torch==1.10.0+cu113 torchvision==0.11.0+cu113 torchaudio==0.10.0 -f https://download.pytorch.org/whl/torch_stable.html
pip install -U openmim
pip install mmcv-full==1.4.0
pip install mmdet==2.14.0
pip install mmsegmentation==0.14.1
📁 4. 安装 MMDetection3D
git clone https://github.com/open-mmlab/mmdetection3d.git
cd mmdetection3d
git checkout v0.17.1
python setup.py install
📥 5. 下载 nuScenes 数据集(建议先用 mini 版)
- 官网:https://www.nuscenes.org/download
🧱 6. 数据预处理
python tools/create_data.py nuscenes --root-path ./data/nuscenes --out-dir ./data/nuscenes --extra-tag nuscenes --version v1.0-mini --canbus ./data
🧪 7. 启动训练(单卡示例)
./tools/dist_train.sh projects/configs/bevformer/bevformer_tiny.py 1
📊 8. 测试模型
./tools/dist_test.sh projects/configs/bevformer/bevformer_tiny.py ckpts/bevformer_tiny_epoch_24.pth 1
模型训练最主要的是吃显卡资源,以下是比较推荐的
- 显存要求:
bevformer_tiny
:约 6.5GBbevformer_base
:约 28GB
- 推荐使用:
bevformer_small.py
:适中性能与资源消耗
- 训练时间:
- 单卡训练约需 2~3 天
训练个人数据
在自己的数据集上训练 BEVFormer(或 BEVFormer++)是完全可行的,但需要满足一定的数据格式和采集要求。
✅ 必需的数据类型:
数据类型 | 描述 |
---|---|
多摄像头图像 | 通常为 6 个摄像头(前、后、左、右、左前、右前),每帧同步采集 |
相机内参(intrinsics) | 每个摄像头的焦距、主点等参数 |
相机外参(extrinsics) | 每个摄像头相对于车辆坐标系的位置和姿态 |
车辆位姿(ego pose) | 每帧车辆在世界坐标系中的位置和朝向(通常来自 GPS+IMU) |
时间戳 | 用于帧间对齐和时序建模 |
🆗 可选数据类型(增强性能):
- 雷达或激光雷达数据(可用于辅助监督)
- CAN bus 数据(车辆速度、加速度等)
- 语义地图(如车道线、交通标志)
📁 二、数据格式要求(参考 nuScenes)
BEVFormer 使用的数据格式与 nuScenes 数据集类似,建议参考其结构:
data/
└── my_dataset/
├── samples/ # 原始图像(按摄像头分类)
├── sweeps/ # 历史帧图像(用于时序建模)
├── maps/ # 可选语义地图
├── annotations/ # 目标检测标注(如 3D box)
├── calib/ # 相机内外参
├── ego_pose.json # 每帧车辆位姿
└── timestamps.json # 每帧时间戳
🔄 三、数据转换流程
为了让 BEVFormer 识别你的数据,需要将其转换为 MMDetection3D 支持的格式:
步骤如下:
- 采集数据:使用多摄像头同步采集系统(如 ROS + 多路摄像头),记录图像和传感器数据。
- 标注数据:使用工具如 LabelFusion、Scalabel 或 [SuperAnnotate] 进行 3D box 标注。
- 生成元数据:编写脚本生成
ego_pose.json
、calib.json
等文件。 - 转换为标准格式:使用 BEVFormer 提供的
create_data.py
脚本或自定义转换脚本。
🧪 四、在本地训练自己的数据集
修改配置文件:
- 复制
bevformer_tiny.py
,修改以下字段:dataset_type
:改为你的数据类名data_root
:指向你的数据路径class_names
:改为你的目标类别camera_names
:改为你的摄像头名称列表
注册数据集:
- 在
mmdetection3d/datasets
中添加你的数据类(继承Custom3DDataset
) - 实现
load_annotations()
和get_data_info()
方法
启动训练:
./tools/dist_train.sh configs/my_bevformer_config.py 1
📷 数据采集方式推荐
方式 | 描述 | 推荐工具 |
---|---|---|
车载采集 | 安装多摄像头系统,同步采集图像和 GPS/IMU | ROS + Realsense/Daheng/Blackfly |
仿真采集 | 使用仿真平台生成数据 | Carla、LGSVL、AirSim |
手动采集 | 单摄像头采集 + 后处理同步 | OpenCV + GPS Logger |
如果其他模型也感兴趣,欢迎大家随时讨论!