1. 模型概述
开源的 OccFormer 模型是一种用于 3D 语义占用预测(3D Semantic Occupancy Prediction)的深度学习架构,其核心目标是:从多视角图像(如车载环视摄像头)中重建出稠密、语义化的三维环境表示,即每个体素(voxel)是否被占据以及属于哪一类物体(如车、人、道路等)。
这比传统的 BEV(鸟瞰图)感知更精细——BEV 只提供地面投影,而 occupancy 提供完整的 3D 结构信息,包括高度维度(例如桥下、空中障碍物、路沿高度等)。
优势:传统检测模型(如 3D 目标检测)只能识别训练过的类别(车、人等),对异形障碍物(掉落轮胎、施工锥桶、动物)无能为力。Occupancy 不依赖预定义类别:只要空间被占据,就标记为“occupied”,天然具备泛化到任意障碍物的能力。
2.运行环境
| 软件 | 版本 |
|---|
| python | 3.11 |
| torch | 2.5.1 |
| torch_npu | 2.5.1.post1.dev20250722 |
| CANN | cann_8.2.rc1 |
3.准备镜像
3.1 推荐镜像
| 镜像环境 | 镜像地址 |
|---|
| 公网 | swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_ascend:pytorch_2.5.1-cann_8.2.rc1-py_3.11-hce_2.0.2503-aarch64-snt9b23-20250729103313-3a25129 |
3.2 启动镜像
docker run -itd -u root --privileged \
--device=/dev/davinci0 --device=/dev/davinci1 --device=/dev/davinci2 --device=/dev/davinci3 \
--device=/dev/davinci4 --device=/dev/davinci5 --device=/dev/davinci6 --device=/dev/davinci7 \
--device=/dev/davinci8 --device=/dev/davinci9 --device=/dev/davinci10 --device=/dev/davinci11 \
--device=/dev/davinci12 --device=/dev/davinci13 --device=/dev/davinci14 --device=/dev/davinci15 \
--device=/dev/davinci_manager --device=/dev/devmm_svm --device=/dev/hisi_hdc \
-v /usr/local/sbin/npu-smi:/usr/local/sbin/npu-smi \
-v /usr/local/dcmi:/usr/local/dcmi \
-v /etc/ascend_install.info:/etc/ascend_install.info \
-v /sys/fs/cgroup:/sys/fs/cgroup:ro \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /usr/bin/hccn_tool:/usr/bin/hccn_tool \
-v /etc/hccn.conf:/etc/hccn.conf \
--shm-size 1024g --net=host \
-v <host_dir>:<container_dir> \
--name <container_name> <image_id> /bin/bash
4.搭建测试环境&&训练
4.1 准备KITTI数据集
# 下载预训练权重文件
mkdir ckpts-SemanticKITT
cd ckpts-SemanticKITTI
wget -cb https://github.com/zhangyp15/OccFormer/releases/download/assets/efficientnet-b7_3rdparty_8xb32-aa_in1k_20220119-bf03951c.pth
# 准备KITTI数据集
# 网站:https://www.cvlibs.net/datasets/kitti/eval_odometry.php
wget -cb https://s3.eu-central-1.amazonaws.com/avg-kitti/data_odometry_color.zip
wget -cb https://s3.eu-central-1.amazonaws.com/avg-kitti/data_odometry_velodyne.zip
wget -cb https://s3.eu-central-1.amazonaws.com/avg-kitti/data_odometry_calib.zip
# 网站:https://www.semantic-kitti.org/dataset.html#download
wget -cb https://www.semantic-kitti.org/assets/data_odometry_voxels_all.zip
# 构造KITTI数据集目录结构
# 每个压缩包中的目录结构都相同,所以注意解压顺序不能出错
# 部分文件在不同压缩包中均含有,但只需要其中一个压缩包的文件,故此解压缩顺序不同后续训练会报错
mkdir -p data-SemanticKITTI/SemanticKITTI/data_velodyne/velodyne
unzip data_odometry_color.zip
unzip data_odometry_voxels_all.zip
unzip data_odometry_calib.zip
mv dataset data-SemanticKITTI/SemanticKITTI/
unzip data_odometry_velodyne.zip
mv dataset/sequences data-SemanticKITTI/SemanticKITTI/data_velodyne/velodyne
# 最终目录结构如下
├── ckpts-SemanticKITTI
│ ├── efficientnet-b7_3rdparty_8xb32-aa_in1k_20220119-bf03951c.pth
├── data-SemanticKITTI/
│ ├── SemanticKITTI/
│ │ ├── data_velodyne/
│ │ │ │ ├── velodyne/
│ │ │ │ │ ├── sequences/
│ │ ├── dataset/
│ │ │ ├── sequences
│ │ │ │ ├── 00
│ │ │ │ │ ├── calib.txt
│ │ │ │ │ ├── image_2/
│ │ │ │ │ ├── image_3/
│ │ │ │ │ ├── times.txt/
│ │ │ │ │ ├── voxels/
│ │ │ │ ├── 01
│ │ │ │ ├── 02
│ │ │ │ ├── ...
│ │ │ │ ├── 21
4.2 安装软件
4.2.1 下载本仓库,准备必要的patch文件
# 下载小巧灵gitcode项目occformer仓库,包含迁移适配patch,在该仓库尚未发布前使用本文自带的patch
# 共2个patch文件:mmcv.patch,occformer.patch
git clone https://atomgit.com/Ascend-SACT/occformer-npu.git
ls occformer-npu/patch
4.2.2 主要适配点
| 修改点 | 适配点 |
|---|
| mmcv/parallel/_functions.py | mmcv 1.7.2 适配 pytorch2.5.1,通过设备类型标识符的方式获取设备 |
| mmdetection3d/mmdet3d/core/bbox/structures/base_box3d.py:7 | 将NPU不支持的cuda算子iou3d_cuda替换为mx_driving算子boxes_overlap_bev |
| mmdetection3d/mmdet3d/ops/ | 将该路径下的所有需要调用源码编译的cuda算子的函数替换为mmcv等效的函数或者计算逻辑 |
| projects/mmdet3d_plugin/datasets/pipelines/loading_nusc_occ.py:98 | 将npu不支持的int64数据类型转换为int32,对于计算无影响 |
| projects/mmdet3d_plugin/occformer/backbones/dualpath_block.py:39 | npu的Conv3d算子不支持stride>kernel,将其替换为stride==kernel卷积+AvgPool3d下采样 |
| projects/mmdet3d_plugin/occformer/image2bev/ViewTransformerLSSBEVDepth.py:127 | npu不支持超6维的张量matmul,根据其张量实际参数计算的最后两位较小的特征,将matmul替换为mul+add操作,在不改变输入的情况下支持7维张量 |
4.2.3 安装 mmcv-full==1.7.2
git clone -b 1.x https://github.com/open-mmlab/mmcv.git
cp occformer-npu/patch/mmcv.patch mmcv/
cd mmcv
git apply --reject --whitespace=fix mmcv.patch
pip install -r requirements/runtime.txt
pip install ninja
MMCV_WITH_OPS=1 MAX_JOBS=8 FORCE_NPU=1 python setup.py build_ext
MMCV_WITH_OPS=1 FORCE_NPU=1 python setup.py develop
cd ..
4.2.4 安装DrivingSDK
git clone -b branch_v7.1.RC1 https://gitee.com/ascend/DrivingSDK.git
cd DrivingSDK/
pip3 install -r requirements.txt
umask 0027
bash ci/build.sh --python=3.11
pip install dist/mx_driving-xxx-cp311-cp311-linux_aarch64.whl
cd ..
# 给occformer源码打patch
git clone https://github.com/zhangyp15/OccFormer.git
cp occformer-npu/patch/occformer.patch OccFormer
cd OccFormer
git apply occformer.patch
# 源码安装mmdet3d
cd mmdetection3d
pip install -r requirements/runtime.txt python setup.py install
cd ..
# 创建数据集和预训练模型的软连接
ln -s /path/to/ckpts-SemanticKITTI ckpts
ln -s /path/to/data-SemanticKITTI data
4.2.6 预处理数据
python projects/mmdet3d_plugin/tools/kitti_process/semantic_kitti_preprocess.py --kitti_root data/SemanticKITTI --kitti_preprocess_root data/SemanticKITTI --data_info_path projects/mmdet3d_plugin/tools/kitti_process/semantic-kitti.yaml
4.2.7 运行模型
bash tools/dist_train.sh projects/configs/occformer_kitti/occformer_kitti.py 8
5.性能
| 硬件 | 卡数 | 性能 |
|---|
| 910C | 16 | 5.29秒/步 |
| H20 | 8 | 1.01秒/步 |
6.精度
MRE = 1.32%