YOLOv11 模型迁移指导文档
YOLOv11m是Ultralytics推出的第11代YOLO系列目标检测模型,在COCO数据集上实现了精度与推理速度的最佳均衡,是实时目标检测的主流选择。该模型可同时检测80类目标(人、车、飞机、火车等),输入640×640图像即可输出所有目标的类别、置信度和边界框坐标,广泛用于安防监控、交通检测和工业质检等场景。
| 项目 | 说明 |
|---|---|
| 模型名称 | YOLOv11m |
| 模型规模 | 20M参数, 38.8MB权重文件 |
| 输入规格 | [1, 3, 640, 640] float32 |
| 输出规格 | [1, 84, 8400] float32 (84=4bbox+80类别) |
| 任务类型 | 目标检测 (Object Detection) |
| 检测类别 | COCO 80类 (person, car, train, airplane...) |
| 置信度阈值 | 0.25 (可调) |
| NMS阈值 | 0.45 (可调) |
| YOLOv11m适用于以下典型场景: | |
| • 智能安防:人员检测、异常行为识别 | |
| • 交通监控:车辆、行人、非机动车检测 | |
| • 工业质检:产品缺陷检测、流水线监控 | |
| • 铁路场景:列车检测、轨道异物识别 | |
| 本指导书将YOLOv11m从x86+GPU训练环境迁移至aarch64+Ascend310P3推理部署环境,覆盖ONNX导出、ATC模型转换、三种推理方式验证的完整流程。 |
本章描述YOLOv11模型迁移到Ascend310P3所需的硬件和软件环境。310P服务器为离线环境(无外网),所有依赖需提前准备离线安装包。
目标推理服务器为华为Ascend310P3,4卡配置,aarch64架构。以下为310P3硬件环境信息:
| 项目 | 说明 |
|---|---|
| CPU架构 | aarch64 |
| NPU | Ascend310P3 (4卡) |
| NPU芯片 | 310P3 (Chip ID: 32768/32800/32832/32864) |
| 内存 | 44GB/卡 (共4卡) |
| 网络 | 离线 (无外网) |
310P3上运行推理所需的软件栈包括CANN工具链、Python运行环境及模型推理依赖库。以下为各软件版本及说明:
| 软件 | 版本 | 说明 |
|---|---|---|
| CANN | 8.5.0 | Ascend Computing Architecture, 含ATC/OPP/TBE |
| Python | 3.11.14 | 与离线wheel包cp311严格匹配 |
| torch | 2.3.1 | PyTorch推理框架 |
| torch_npu | 2.3.1.post6 | 华为NPU适配层 (CANN内置) |
| ultralytics | 8.4.77 | YOLO推理框架 |
| onnx | 1.19.1 | ONNX模型格式 |
| onnxruntime | 1.16.3 | ONNX Runtime推理引擎 |
| numpy | 1.26.4 | 数值计算 (1.26.x兼容CANN TBE) |
| opencv-python-headless | 4.10.0.84 | 图像处理 (无GUI依赖) |
| aclruntime | 0.0.2 | Ascend CL推理底层 (需编译) |
| ais_bench | 0.0.2 | 华为推理基准工具 (需编译) |
本章列出模型迁移所需的全部资源文件,包括模型权重、测试数据、推理脚本和离线依赖包。所有资源位于/yolo11Adapt/目录下。
迁移涉及三种格式的模型权重:PyTorch原始权重(.pt)、ONNX导出模型(.onnx)和ATC转换的OM模型(.om)。.pt和.onnx已预置在目录中,.om需在310P3上通过ATC命令生成。
| 文件 | 路径 | 大小 | 说明 |
|---|---|---|---|
| yolo11m.pt | /yolo11Adapt/model/yolo11m.pt | 39MB | PyTorch原始权重 |
| yolo11m.onnx | /yolo11Adapt/output/yolo11m.onnx | 77MB | ONNX导出模型 |
| yolo11m_310P3.om | /yolo11Adapt/model/yolo11m_310P3.om | ~45MB | ATC转换OM模型 (310P上生成) |
使用3张JPEG图片验证推理效果,涵盖person、train、airplane等典型检测目标。
| 文件 | 路径 | 说明 |
|---|---|---|
| pic001.jpg | /yolo11Adapt/dataset/pic001.jpg | 3.0MB, 含person检测 |
| pic002.jpg | /yolo11Adapt/dataset/pic002.jpg | 915KB, 含person+train检测 |
| pic003.jpg | /yolo11Adapt/dataset/pic003.jpg | 814KB, 含airplane+person检测 |
提供三种推理方式的Python脚本,分别对应torch_npu、ONNX Runtime和ais_bench OM推理。脚本已适配310P3环境,输出检测结果图片和目标列表。
| 脚本 | 路径 | 推理方式 | 说明 |
|---|---|---|---|
| 01_torch_npu_infer.py | /yolo11Adapt/script/ | torch_npu (NPU) | ultralytics + torch_npu后端, 含预热和FP16 |
| 02_onnx_infer.py | /yolo11Adapt/script/ | ONNX (CPU) | ultralytics直接加载ONNX, baseline对照 |
| 03_ais_bench_infer.py | /yolo11Adapt/script/ | ais_bench (NPU) | OM模型NPU推理, 生产级部署方式 |
310P服务器无外网,所有Python依赖需通过离线包安装。离线包包含60个wheel包、torch_npu本地安装包和ais_bench源码(需编译)。install.sh脚本实现一键安装,采用"检测import可用性→只修不可导入包"策略,避免破坏CANN镜像预装的symlink结构。
| 内容 | 路径 | 说明 |
|---|---|---|
| yolo11m_offline_pkg.tar.gz | /yolo11Adapt/offer_package/ | 离线依赖包 (336MB) |
| install.sh | tar解压后 | 一键安装脚本 |
| wheels/ (60个) | tar解压后 | pip wheel包 (cp311, aarch64) |
| torch_npu_pkg/ | tar解压后 | torch_npu本地安装包 (CANN未内置时使用) |
| ais_bench_src/ | tar解压后 | aclruntime + ais_bench源码 (需编译) |
310P服务器为离线环境,需将整个/yolo11Adapt/目录传输至310P容器内:
方式一:scp传输 (如有内网) scp -r /yolo11Adapt @<310P_ip>:/
方式二:U盘/移动硬盘拷贝 将/yolo11Adapt目录整体拷贝至U盘,在310P容器内挂载复制
方式三:容器镜像打包 docker save/load 整个容器镜像 (含所有依赖)
进入310P容器后,依次确认以下环境要素:
npu-smi info
source /usr/local/Ascend/cann-8.5.0/set_env.sh
python3 --version
atc --help | head -3
310P为离线环境,所有Python包通过离线wheel包安装。核心策略:CANN镜像已预装大部分包 (torch/numpy/ultralytics等通过symlink可用),install.sh只修复不可导入的包,不做全量重装,避免破坏CANN symlink结构。 cd /yolo11Adapt/offer_package tar xzf yolo11m_offline_pkg.tar.gz bash install.sh
install.sh执行流程:
| 步骤 | 内容 | 说明 |
|---|---|---|
| STEP 1 | 清理broken symlink | 删除CANN site-packages中因pip卸载产生的无效符号链接 |
| STEP 2 | 按需安装缺失包 | 先检测import可用性, 只对不可导入的包卸载broken版后从wheel重装 |
| STEP 3 | 安装torch_npu | CANN已内置则跳过, 否则从torch_npu_pkg复制 |
| STEP 4 | 编译aclruntime+ais_bench | pip install --no-build-isolation, 已可用则跳过 |
| 验证 | 8项模块检查 | torch/numpy/cv2/ultralytics/onnxruntime/onnx/torch_npu/ais_bench |
重要提示:
python3 -c "import torch; print(torch.version)" # 2.3.1 python3 -c "import torch_npu; print(torch_npu.version)" # 2.3.1.post6 python3 -c "from ultralytics import YOLO; print('OK')" # OK python3 -c "import onnxruntime; print(onnxruntime.version)" # 1.16.3 python3 -c "from ais_bench.infer.interface import InferSession; print('OK')" # OK
source /usr/local/Ascend/cann-8.5.0/set_env.sh
atc --model=/yolo11Adapt/output/yolo11m.onnx
--framework=5 \n --output=/yolo11Adapt/output/yolo11m \n --soc_version=Ascend310P3 \n --input_shape="images:1,3,640,640"
| 参数 | 值 | 说明 |
|---|---|---|
| --model | /yolo11Adapt/output/yolo11m.onnx | ONNX模型文件路径 |
| --framework | 5 | ONNX框架编号 |
| --output | /yolo11Adapt/output/yolo11m | 输出OM文件路径 (不含.om后缀) |
| --soc_version | Ascend310P3 | 目标芯片型号 (注意: 是310P3, 不是310P1) |
| --input_shape | images:1,3,640,640 | 固定batch=1, 输入640x640 |
转换成功后生成: /yolo11Adapt/output/yolo11m.om (约40~50MB) 注意: 首次ATC转换可能耗时30分钟以上 (编译算子),属于正常现象。
原理: ultralytics框架加载PT权重,通过torch_npu后端在NPU上推理。脚本包含NPU预热和FP16加速优化。 cd /yolo11Adapt python3 script/01_torch_npu_infer.py 关键检查点:
| 检查项 | 预期值 | 异常处理 |
|---|---|---|
| NPU available | True | 若为False: 检查set_env.sh和torch_npu版本 |
| NPU count | 4 | 310P3有4张卡 |
| 使用设备 | npu:0 | 若为cpu: CANN/torch_npu配置有问题 |
| 推理耗时 | 50~200ms/张 | 含预热后首次推理耗时正常偏高 |
| 结果保存: output/torch_npu_infer_optimized/pic001~003.jpg |
原理: ultralytics直接加载ONNX模型,使用ONNX Runtime在CPU上推理。作为NPU推理的baseline对照,验证模型正确性。 python3 script/02_onnx_infer.py
| 检查项 | 预期值 | 说明 |
|---|---|---|
| 推理耗时 | 1~3s/张 | CPU推理较慢,仅作baseline |
| 检测数量 | 与NPU一致 | 验证NPU推理精度正确性 |
| 结果保存: output/onnx_infer/pic001~003.jpg |
原理: 加载ATC转换的OM模型,通过aclruntime在NPU上推理。这是310P上的生产级推理方式,性能最优。 python3 script/03_ais_bench_infer.py 前提: yolo11m_310P3.om已通过ATC生成,位于/yolo11Adapt/model/
| 检查项 | 预期值 | 异常处理 |
|---|---|---|
| ais_bench InferSession | 可用 | 不可用: 重新编译aclruntime |
| OM模型输入 | [1,3,640,640] | 确认ATC转换参数正确 |
| OM模型输出 | [1,84,8400] | 确认模型结构完整 |
| 推理耗时 | 10~50ms/张 | OM优化后最快 |
| 结果保存: output/om_infer/pic001~003.jpg |
注意: 脚本03的letterbox预处理使用居中padding (四周均匀分布),坐标还原时需减去pad_left和pad_top偏移量,与脚本01/02的右下角padding不同。
| 方式 | 脚本 | 设备 | 模型格式 | 适用场景 |
|---|---|---|---|---|
| torch_npu | 01 | NPU | PT | 开发调试、精度验证 |
| ONNX Runtime | 02 | CPU | ONNX | baseline对照、无NPU环境 |
| ais_bench OM | 03 | NPU | OM | 生产部署 (推荐) |
| 指标 | torch_npu | ONNX Runtime | ais_bench OM |
|---|---|---|---|
| 推理耗时(估) | 50~200ms | 1~3s | 10~50ms |
| 推理精度 | 与PT一致 | 与PT一致 | 与PT一致 |
| 模型加载 | 自动加载PT | ultralytics加载ONNX | aclruntime加载OM |
| 是否需ATC | 否 | 否 | 是 |
| FP16支持 | 是 (half=True) | 否 | 取决于ATC参数 |
三个脚本均包含完整的YOLO后处理流程:
Letterbox padding方式差异 (重要):
| 脚本 | padding方式 | 坐标还原公式 |
|---|---|---|
| 01 (torch_npu) | 右下角填充 | cx=w0/wcx_pad, cy=h0/hcy_pad (无偏移) |
| 02 (ONNX) | 右下角填充 (ultralytics内部) | 同脚本01 |
| 03 (ais_bench OM) | 四周居中填充 | cx=(cx_pad-pad_left)*w0/w, cy=(cy_pad-pad_top)*h0/h |
现象描述:进入310P容器后执行torch.npu.is_available()返回False,无法使用NPU推理。 根因分析:CANN环境未正确加载或torch_npu与CANN版本不匹配。 解决措施:1) 执行npu-smi info确认NPU设备可见 2) source /usr/local/Ascend/cann-8.5.0/set_env.sh加载环境 3) 检查torch_npu版本(2.3.1.post6)与CANN版本(8.5.0)匹配 4) 若仍失败,检查CANN OPP包是否完整安装
现象描述:执行ATC转换时报错:Unsupported_Operator(EZ3003): No supported Ops kernel and engine are found for [/model.1/conv/Conv], optype [Conv2D]。Conv2D、MaxPoolV3等基础算子找不到支持内核。 根因分析:YOLO11的ONNX模型与Ascend310P3不兼容。Conv2D和MaxPoolV3等基础算子找不到支持内核,问题不在于模型优化参数,而是YOLO11的网络结构(C2f模块和注意力机制)在310P3上不被支持,根因是CANN版本或OPP算子包不匹配。 解决措施:措施1(推荐):更换CANN镜像版本。从昇腾社区下载匹配的ARM版本: docker pull --platform=arm64 swr.cn-south-1.myhuaweicloud.com/ascendhub/cann:8.5.0-310p-openeuler24.03-py3.11 查看已有CANN镜像:docker images | grep cann 措施2:下载310P3专用算子包(OPP)。访问 https://support.huawei.com/enterprise/zh/Ascend%20Computing/cann-pid-251168373/software 选择对应版本安装。
现象描述:执行import cv2报ModuleNotFoundError,但pip list显示opencv-python-headless已安装。 根因分析:CANN site-packages中opencv-python-headless为broken symlink(指向system site-packages中已删除的实际文件),pip误判为已安装。 解决措施:1) pip uninstall -y opencv-python opencv-python-headless 2) pip install --no-deps --force-reinstall opencv-python-headless==4.10.0.84 3) 执行import cv2验证可导入
现象描述:执行from ultralytics import YOLO报ModuleNotFoundError,但pip list显示ultralytics已安装。 根因分析:CANN site-packages中ultralytics为broken symlink,实际文件已被pip卸载删除。 解决措施:1) pip uninstall -y ultralytics ultralytics-thop 2) pip install --no-deps --force-reinstall ultralytics==8.4.77 3) pip install --no-deps ultralytics-thop==2.0.20 4) 执行from ultralytics import YOLO验证可导入
现象描述:执行import aclruntime报ModuleNotFoundError或ImportError。 根因分析:aclruntime未编译安装,或编译时CANN_PATH环境变量未设置导致找不到libascendcl.so。 解决措施:1) export CANN_PATH=/usr/local/Ascend/cann-8.5.0 2) export ASCEND_TOOLKIT_HOME=$CANN_PATH 3) cd ais_bench_src/backend && rm -rf build dist *.egg-info 4) pip3 install --no-build-isolation . 5) 验证: python3 -c "import aclruntime"
现象描述:InferSession加载OM文件时报错,提示芯片型号不匹配。 根因分析:OM模型的soc_version与当前310P3芯片不一致(如使用了Ascend310P1生成的OM)。 解决措施:1) 删除旧OM文件 2) 使用正确的soc_version重新ATC转换: atc --model=yolo11m.onnx --framework=5 --output=yolo11m --soc_version=Ascend310P3 --input_shape="images:1,3,640,640" 3) 将新生成的OM文件拷贝至脚本03期望的路径
现象描述:执行ais_bench推理时报错:[ERROR] The file ... is group writable, or is others writable, as import file(or directory), permission should not be over 0o755(rwxr-xr-x)。InferSession初始化失败。 根因分析:昇腾ais_bench推理框架的安全机制严格禁止加载组用户(group)或其他用户(others)具有写权限的模型文件。当前.om文件权限过于开放。 解决措施:移除模型文件的组写和其他写权限: chmod go-w /yolo11Adapt/model/yolo11m_310P3.om 建议同时修正整个model目录权限: chmod 755 /yolo11Adapt/model chmod 644 /yolo11Adapt/model/.om chmod 644 /yolo11Adapt/model/.onnx chmod 644 /yolo11Adapt/model/.pt 验证:ls -la /yolo11Adapt/model/.om
现象描述:推理脚本执行完成但检测数量为0,无任何目标框输出。 根因分析:输入图片路径错误、图片无法读取、或置信度阈值设置过高。 解决措施:1) 检查图片文件路径是否正确 2) 检查图片文件是否可读(cv2.imread返回非None) 3) 降低CONF_THRESH(如从0.25降到0.1) 4) 确认模型权重文件完整
现象描述:执行atc命令报OPP not found或算子不支持错误。 根因分析:310P3 OPP包未安装,或CANN版本过低导致部分算子(如Conv2D)不支持。 解决措施:1) 安装对应Ascend310P3的OPP包 2) 确认CANN版本>=8.5.0 3) source set_env.sh后重试ATC命令 4) 检查ONNX模型输入shape与ATC --input_shape参数匹配
现象描述:install.sh执行完成后,python3 -c "import torch"等所有模块均报ModuleNotFoundError。 根因分析:误创建了system site-packages → CANN site-packages的反向symlink,造成循环引用。CANN原始设计中torch/numpy等是从CANN指向system的symlink,反向symlink形成死循环。 解决措施:1) 删除反向symlink: rm /usr/local/python3.11.14/lib/python3.11/site-packages 2) 重建正常目录: mkdir /usr/local/python3.11.14/lib/python3.11/site-packages 3) 重新执行install.sh 4) install.sh已内置broken symlink清理和按需安装逻辑,不会创建反向symlink
现象描述:在离线310P环境执行pip install --no-build-isolation .编译aclruntime时失败。 根因分析:离线环境缺少编译依赖(setuptools/pybind11未安装),或CANN_PATH未设置。 解决措施:1) 确保setuptools和pybind11已安装: pip install --no-deps setuptools pybind11 2) 设置CANN环境变量: export CANN_PATH=/usr/local/Ascend/cann-8.5.0 source $CANN_PATH/set_env.sh 3) 重新编译: pip3 install --no-build-isolation --no-index --find-links=wheels/ .
source /usr/local/Ascend/cann-8.5.0/set_env.sh npu-smi info python3 --version
cd /yolo11Adapt/offer_package bash install.sh
atc --model=/yolo11Adapt/output/yolo11m.onnx --framework=5 \n --output=/yolo11Adapt/output/yolo11m \n --soc_version=Ascend310P3 \n --input_shape="images:1,3,640,640"
cp /yolo11Adapt/output/yolo11m.om /yolo11Adapt/model/yolo11m_310P3.om chmod 644 /yolo11Adapt/model/yolo11m_310P3.om
cd /yolo11Adapt python3 script/01_torch_npu_infer.py python3 script/02_onnx_infer.py python3 script/03_ais_bench_infer.py