Ascend-SACT/occformer-npu
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

Occformer模型迁移适配指导

1. 模型概述

  开源的 OccFormer 模型是一种用于 3D 语义占用预测(3D Semantic Occupancy Prediction)的深度学习架构,其核心目标是:从多视角图像(如车载环视摄像头)中重建出稠密、语义化的三维环境表示,即每个体素(voxel)是否被占据以及属于哪一类物体(如车、人、道路等)。

  这比传统的 BEV(鸟瞰图)感知更精细——BEV 只提供地面投影,而 occupancy 提供完整的 3D 结构信息,包括高度维度(例如桥下、空中障碍物、路沿高度等)。

  优势:传统检测模型(如 3D 目标检测)只能识别训练过的类别(车、人等),对异形障碍物(掉落轮胎、施工锥桶、动物)无能为力。Occupancy 不依赖预定义类别:只要空间被占据,就标记为“occupied”,天然具备泛化到任意障碍物的能力。

2.运行环境

  • 软件
软件版本
python3.11
torch2.5.1
torch_npu2.5.1.post1.dev20250722
CANNcann_8.2.rc1
  • 硬件
设备型号
Atlas 800T A3

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.pymmcv 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:39npu的Conv3d算子不支持stride>kernel,将其替换为stride==kernel卷积+AvgPool3d下采样
projects/mmdet3d_plugin/occformer/image2bev/ViewTransformerLSSBEVDepth.py:127npu不支持超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 ..

4.2.5 安装occformer

# 给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.性能

硬件卡数性能
910C165.29秒/步
H2081.01秒/步

6.精度

MRE = 1.32%