Apollo-BEV-Train
介绍
近些年来,基于纯视觉+BEV的目标检测和占据栅格任务称为自动驾驶的研究热点。2022年提出的BEVFormer网络,使用环视图像作为输入,使用Transformer架构生成BEV特征,完成目标检测任务。占据栅格任务是一种通过预测三维栅格来表达真实世界的任务,如下图所示,栅格代表对应位置被占据,不同颜色代表不同的类别。占据栅格任务可以很好地处理自动驾驶中面临的异形障碍物问题,为此受到广泛的研究。


Apollo 11.0发布了纯视觉模型Apollo-vision-Net,具有如下的特性:
1. 【 更先进 】将视觉 bev 目标检测 + occ 占用网络的主流感知范式引入 Apollo 开源框架
2. 【 效果好 】在业界经典模型基础之上进行优化,各自的效果均超越业界经典模型效果。目标检测 mAP 较 bevformer(2022 ECCV)提升 6.74% ,occ miou较OccNet(2023 ICCV)提升 2.39%
3. 【 性能高 】模型共享backbone,多任务联合训练优化,在单个 jetson orin 平台上可达到 5hz 的推理帧率,在效果与性能上均取得1+1>2的效果
Apollo-vision-Net 介绍
网络结构
Apollo-vision-Net的整体网络结构如下所示:
- 输入环视图像,经过image backbone提取图像特征
-
Transformer encoder部分
- 使用temporal self-attention融合当前帧bev queries和历史帧bev queries
- 使用spatial cross-attention融合bev queries和图像特征
- 经过6个encoder layer后输出bev queries
- detection head:将bev queries作为输入,使用groupdetr网络进行目标检测
- occ head:对bev queries进行上采样,随后扩充高度方向特征,最后使用linear层预测每个栅格类别信息

我们对Apollo-vision-Net进行了如下优化,显著提升了目标检测、占据栅格的分数以及模型性能:
- image backbone:使用深度估计数据(Toyota DDAD15M)预训练的DLA-34替换ResNet-50,降低了模型复杂度同时提升了效果
- image neck:使用SecondFPN网络替换单尺度FPN网络,提升了模型整体效果
- detection head:使用GroupDETR替换DETR,在不增加耗时的前提下,显著提升目标检测效果
- occ head:在Transformer encoder部分使用低分辨率bev queries(5050),在occ head部分再上采样至高分辨率(200200),可大幅提升模型性能
- occ loss:将occ focal loss weight从1.0提升至10.0,引入affinity loss和lovasz-softmax loss,大幅提升occ检测效果
定量结果
在Nuscenes数据集上,Apollo-vision-Net目标检测mAP分数超越bevformer-tiny(2022 ECCV)6.74%,超越OccNet-R50(2023 ICCV)2.39%
| 目标检测mAP (val dataset) | 占据栅格miou (OpenOcc val dataset) | |
|---|---|---|
| bevformer-tiny (2022 ECCV) | 25.2% | - |
| OccNet-R50 (2023 ICCV) | - | 19.48% |
| Apollo-vision-Net (ours) | 31.94% (↑ 6.74) | 21.87% (↑ 2.39) |
定性结果
Nuscenes数据集结果
| 图像 | 目标检测结果 | occ结果 | ||
|---|---|---|---|---|
| ![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
||
百度自动驾驶数据集结果
为了进一步验证效果,我们使用百度自动驾驶数据对Apollo-vision-Net进行训练,同时对occ的分辨率进行提升(0.5m0.5m0.5m->0.2m0.2m0.2m)可以看到Apollo-vision-Net可以提供复杂城市道路场景下的准确目标检测和occ检测。
部署环境要求&最佳实践建议
| 部署要求 | 最佳实践 | |
|---|---|---|
| CPU | 按需 | 建议按表单默认值及以上 |
| 内存 | 按需 | 建议按表单默认值及以上 |
| GPU | 24G以上显存 | 建议24G以上显存 |
| CDS | 按需 | 按需 |
模型训练使用说明
创建与登录开发机
根据部署环境要求成功创建开发机后,点击登录开发机,进入开发机webIDE,并打开VScode中的terminal
- 代码保存路径:/root/Apollo-Vision-Net
- 数据默认挂载路径:/mnt/dataset/nuscenes_data
数据集处理
存储挂载配置
默认在bos挂载nuscenes数据集

- 挂载PFS或CFS
在创建或更新开发机时,在存储挂载配置中选择集群对应的 PFS 或 CFS 存储,并设置自定义挂载路径(示例路径:/mnt/pfs/nuscenes_data)可以在创建或者更新开发机配置时,选择存储挂载,选择集群对应的PFS或者CFS,可自定义挂载路径

数据集迁移
创建数据集目录结构
1cd /mnt/pfs/nuscenes_data
2mkdir -p bev_data/nuscenes
从bos上迁移数据集至PFS文件
1cp -rv bos挂载路径/apollo_nuscenes_bev_data/nuscenes/* /mnt/pfs/nuscenes_data/bev_data/nuscenes/
2cp -rv bos挂载路径/apollo_nuscenes_bev_data/can_bus/* /mnt/pfs/nuscenes_data/bev_data/
3cp -rv bos挂载路径/apollo_nuscenes_bev_data/occ_gt_release_v1_0/* /mnt/pfs/nuscenes_data/bev_data/
数据集解压与整理
NuScenes 数据集处理
1cd /mnt/pfs/nuscenes_data/bev_data/nuscenes
2#运行指令解压数据集,也可以开多个终端依次解压数据集
3bash tar_files.sh
nuscenes数据集解压后目录结构:
1/mnt/pfs/nuscenes_data/bev_data# tree nuscenes/ -L 1
2nuscenes/
3├── maps //地图
4├── samples //数据集
5├── sweeps //数据集
6├── v1.0-trainval//数据集
7├── tar_files.sh //解压指令
8├── nuscenes_infos_temporal_train_occ_gt.pkl //目标检测和occupancy的pkl文件
9├── nuscenes_infos_temporal_val_occ_gt.pkl //目标检测和occupancy的pkl文件
10├── maps.tar.gz //地图压缩包
11├── v1.0-trainval01_blobs.tgz //数据集压缩包
12├── v1.0-trainval02_blobs.tgz //数据集压缩包
13├── v1.0-trainval03_blobs.tgz //数据集压缩包
14├── v1.0-trainval04_blobs.tgz //数据集压缩包
15├── v1.0-trainval05_blobs.tgz //数据集压缩包
16├── v1.0-trainval06_blobs.tgz //数据集压缩包
17├── v1.0-trainval07_blobs.tgz //数据集压缩包
18├── v1.0-trainval08_blobs.tgz //数据集压缩包
19├── v1.0-trainval09_blobs.tgz //数据集压缩包
20└── v1.0-trainval10_blobs.tgz //数据集压缩包
occ_gt_release_v1_0数据集处理:
解压occ_gt_release_v1_0压缩包
1cd /mnt/pfs/nuscenes_data/bev_data
2tar -zxvf occ_gt_release_v1_0.tar.gz
解压后
1occ_gt_release_v1_0
2├── occ_gt_train.json
3├── occ_gt_val.json
4├── train
5└── val
复制目标检测和occupancy的pkl文件到occ_gt_release_v1_0
1cp /mnt/pfs/nuscenes_data/bev_data/nuscenes/*.pkl /mnt/pfs/nuscenes_data/bev_data/occ_gt_release_v1_0/
最终目录结构
1/mnt/pfs/nuscenes_data/bev_data# tree occ_gt_release_v1_0 -L 1
2occ_gt_release_v1_0
3├── nuscenes_infos_temporal_train_occ_gt.pkl
4├── nuscenes_infos_temporal_val_occ_gt.pkl
5├── occ_gt_train.json
6├── occ_gt_val.json
7├── train
8└── val
CAN-Bus 数据处理
1cd /mnt/pfs/nuscenes_data/bev_data
2tar -zxvf can_bus.tar.gz
数据集结构规范
1├── data/
2│ ├── can_bus/
3│ ├── nuscenes/
4│ │ ├── maps/
5│ │ ├── samples/
6│ │ ├── sweeps/
7│ │ ├── v1.0-test
8│ │ ├── v1.0-trainval
9│ │ ├── nuscenes_infos_temporal_train.pkl
10│ │ ├── nuscenes_infos_temporal_val.pkl
11│ ├── occ_gt_release_v1_0/
12│ │ ├── train/
13│ │ ├── val/
14│ │ ├── occ_gt_train.json
15│ │ ├── occ_gt_val.json
16│ │ ├── nuscenes_infos_temporal_train_occ_gt.pkl
17│ │ ├── nuscenes_infos_temporal_val_occ_gt.pkl
数据集挂载
开发机内数据集挂载:
1cd ~/Apollo-Vision-Net/data
2
3# 创建符号链接(注意使用正确的 -s 参数)
4ln -s /mnt/pfs/nuscenes_data/bev_data/nuscenes nuscenes
5ln -s /mnt/pfs/nuscenes_data/bev_data/occ_gt_release_v1_0 occ_gt_release_v1_0
6ln -s /mnt/pfs/nuscenes_data/bev_data/can_bus can_bus
最终项目结构:
1~/Apollo-Vision-Net/data/
2├── can_bus -> /mnt/pfs/nuscenes_data/bev_data/can_bus
3├── nuscenes -> /mnt/pfs/nuscenes_data/bev_data/nuscenes
4└── occ_gt_release_v1_0 -> /mnt/pfs/nuscenes_data/bev_data/occ_gt_release_v1_0
训练模型
1# 进入工作目录
2cd ~/Apollo-Vision-Net/
3# 训练模型
4./tools/dist_train.sh \ # 训练脚本
5 ./projects/configs/bevformer/bev_tiny_det_occ_apollo.py \ # 模型配置文件路径
6 8 # 使用8个GPU进行分布式训练
训练暂停后继续训练指令
1# 进入工作目录
2cd ~/Apollo-Vision-Net/
3
4# 训练模型
5./tools/dist_train.sh \ # 训练脚本
6 ./projects/configs/bevformer/bev_tiny_det_occ_apollo.py \ # 模型配置文件路径
7 8 \ # 使用8个GPU进行分布式训练
8 --resume-from work_dirs/bev_tiny_det_occ_apollo/epoch_4.pth # 从第4epoch的检查点恢复训练
模型评测
1# 进入工作目录
2cd ~/Apollo-Vision-Net/
3
4# 启动评测脚本
5./tools/dist_test.sh \
6 ./projects/configs/bevformer/bev_tiny_det_occ_apollo.py \ # 模型配置文件路径
7 work_dirs/bev_tiny_det_occ_apollo/epoch_4.pth \ # 训练好的模型权重文件
8 4 # 使用*个GPU进行分布式测试
将训练得到的 .pth 模型文件在模型导出所使用的开发机上执行模型导出功能,将该.pth文件转换为符合 Apollo 要求的 ONNX 模型文件,以用于后续apollo系统部署验证模型效果。
附:Apollo 11.0 BEV+OCC 模型训练使用
| 流程 | 快速开始链接 | 使用方式 | 备注 |
|---|---|---|---|
| Apollo-BEV-Train | 百舸平台 | 训练 Apollo BEV+OCC模型 | |
| Apollo-BEV-Model-Export | 百舸平台 | 将训练好的BEV+OCC模型导出成onnx文件 | |
| Apollo-Model-Deployment | 百舸平台或本地验证 | apollo环境镜像,验证bev模型效果以及仿真等apollo工具 |







