学习进度 · 登录后可记录
模型项目地址:hf_mirrors/Ultralytics/YOLO11 课程难度:入门 · 需要 Python 基础 | 预估学时:20~30 分钟 部署架构:基于 Ultralytics + torch_npu + YOLO CLI 部署
本章结束后,你能够:
device=npu:0 参数将 YOLO 推理迁移到昇腾 NPU本节课的目标是:在昇腾 NPU 上,部署 YOLO11m——Ultralytics 最新一代目标检测模型,实现图片和视频的实时目标检测。
YOLO11 是目标检测领域的"轻量级效率之王":相比 Transformer 类模型动辄数十亿参数,YOLO11m 仅约 20M 参数,却能在 640×640 分辨率下实现高精度检测。小参数 + 高吞吐,这与昇腾 NPU 的硬件特性完美契合。
很多习惯了 CUDA 的开发者会认为:YOLO 不就是个推理脚本嘛,改个 device=cuda:0 为 device=npu:0 就行了——方向对了,但 YOLO 的计算特征与 LLM 有本质差异。
| 计算特征 | 纯文本 LLM | 目标检测(YOLO11) |
|---|---|---|
| 核心架构 | Transformer Decoder | CNN Backbone + Neck + Detection Head |
| 关键算子 | Self-Attention(Cube 密集型) | Conv2D + C2PSA + DFL Head(Vector + Cube 混合型) |
| 输入形态 | 离散 Token 序列 | 连续图像张量(B×3×640×640) |
| 输出形态 | 文本 Token 序列 | 边界框坐标 + 类别概率 + 置信度 |
| 后处理 | Token decode | NMS(非极大值抑制)—— 纯 Vector 算子密集 |
| 推理模式 | 自回归(逐 token) | 单次前向传播(Non-Autoregressive) |
┌──────────────────────────────────────────────────────┐
│ Ultralytics YOLO CLI │
│ ┌────────────────────────────────────────────────┐ │
│ │ yolo predict model=yolo11m.pt device=npu:0 │ │
│ │ ├─ 图片检测:source=bus.jpg │ │
│ │ └─ 视频检测:source=car.mp4 │ │
│ └──────────────────┬───────────────────────────────┘ │
│ │ │
│ ┌──────────────────▼───────────────────────────┐ │
│ │ YOLO11 推理链路 │ │
│ │ ├─ Preprocess → 图像缩放 + 归一化 │ │
│ │ ├─ Backbone → Conv2D + C2PSA 特征提取 │ │
│ │ ├─ Neck → 特征金字塔多尺度融合 │ │
│ │ ├─ Head → 边界框 + 类别预测 │ │
│ │ └─ Postprocess → NMS 非极大值抑制 │ │
│ └──────────────────┬───────────────────────────┘ │
│ │ │
├─────────────────────┼────────────────────────────────┤
│ torch_npu + CANN 8.5 │
│ ┌──────────────┐ ┌─▼──────────────┐ │
│ │ GE 图编译 │ │ CUBE + Vector │ │
│ │ (算子融合) │ │ 混合执行 │ │
│ └──────────────┘ └────────────────┘ │
├──────────────────────────────────────────────────────┤
│ 昇腾 NPU 硬件层 │
│ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │
│ │ Scalar │ │ Vector │ │ CUBE 矩阵乘 │ │
│ │ NMS 后处理│ │ Conv2D │ │ 全连接层 │ │
│ └──────────┘ │ C2PSA │ │ 预测头 │ │
│ └──────────┘ └──────────────┘ │
└──────────────────────────────────────────────────────┘设计思路:YOLO11 基于 Ultralytics 框架,依赖 ultralytics、pillow、imageio-ffmpeg 等包。特别注意 opencv-python-headless 必须用 --force-reinstall --no-deps 安装,避免与昇腾环境的 OpenCV 冲突。
# [依赖安装] 安装 atomgit SDK 和 YOLO 依赖
!pip install -U atomgit ultralytics pillow imageio-ffmpeg -i https://mirrors.huaweicloud.com/repository/pypi/simple# [OpenCV] 强制安装 headless 版本,避免 GUI 依赖冲突
!pip install --force-reinstall --no-deps opencv-python-headless -i https://mirrors.huaweicloud.com/repository/pypi/simple设计思路:YOLO11m 模型权重托管在 AtomGit 平台,使用 atomgit_hub 的 snapshot_download 下载到本地。模型仅约 40MB,下载速度快。
# [模型下载] 从 AtomGit 平台下载 YOLO11 模型
from atomgit_hub import snapshot_download
model_repo = "hf_mirrors/Ultralytics/YOLO11"
local_dir = "/opt/atomgit/YOLO11"
snapshot_download(model_repo, local_dir=local_dir)
print(f"模型已下载到: {local_dir}")设计思路:准备一张测试图片(bus.jpg)和一段测试视频(car.mp4),用于验证图片和视频两种检测场景。
# [测试数据] 下载测试图片和视频
!mkdir -p /opt/atomgit/static
# 下载测试视频
!curl -L https://raw.gitcode.com/yanlp/statics/blobs/f7270a8622864ed63c42d36d6a3db7ea52f77302/car.mp4 -o /opt/atomgit/static/car.mp4
# 下载测试图片
!curl -L https://raw.gitcode.com/yanlp/statics/blobs/40eaaf5c330d0c498fbe1dcacf9bb8bf566797fe/bus.jpg -o /opt/atomgit/static/bus.jpg设计思路:Ultralytics 安装后,yolo CLI 命令在 ~/.local/bin/ 目录下,需要将其加入 PATH。然后使用 device=npu:0 参数将推理迁移到昇腾 NPU。
# [PATH 配置] 将 yolo CLI 注入 PATH
import os
os.environ['PATH'] = '/opt/atomgit/.local/bin:' + os.environ['PATH']# [图片检测] 使用 YOLO11m 对图片进行目标检测
!yolo predict model=/opt/atomgit/YOLO11/yolo11m.pt \
source=/opt/atomgit/static/bus.jpg \
imgsz=640 conf=0.25 iou=0.45 device=npu:0 \
save=True save_txt=True save_conf=True \
project=/opt/atomgit/tests name=predict-image| 参数 | 值 | 说明 |
|---|---|---|
model | /opt/atomgit/YOLO11/yolo11m.pt | 模型权重路径 |
source | 图片或视频路径 | 推理输入源 |
imgsz | 640 | 输入分辨率,YOLO11 默认 640×640 |
conf | 0.25 | 置信度阈值,低于此值的检测框被过滤 |
iou | 0.45 | NMS 的 IoU 阈值,控制重叠框合并 |
device | npu:0 | 昇腾 NPU 设备——这是整个适配的关键参数 |
save | True | 保存可视化结果 |
save_txt | True | 保存检测框坐标到 TXT |
save_conf | True | 保存置信度信息 |
核心要点:device=npu:0 是 YOLO 在昇腾上运行的关键参数。Ultralytics 框架原生支持 torch_npu 设备字符串,无需额外适配代码,只需修改 device 参数即可。
设计思路:视频检测与图片检测使用相同的 YOLO CLI 命令,仅 source 参数不同。YOLO 会逐帧处理视频,输出带检测框的 AVI 视频。
# [视频检测] 使用 YOLO11m 对视频进行逐帧目标检测
!yolo predict model=/opt/atomgit/YOLO11/yolo11m.pt \
source=/opt/atomgit/static/car.mp4 \
imgsz=640 conf=0.25 iou=0.45 device=npu:0 \
save=True save_txt=True save_conf=True \
project=/opt/atomgit/tests name=predict-video设计思路:YOLO 输出的视频为 AVI 格式(无压缩),文件较大且兼容性差。使用 imageio-ffmpeg 提供的 FFmpeg 转码为 H.264 MP4 格式,便于播放和分享。
# [视频转码] 将 AVI 输出转换为 MP4
import imageio_ffmpeg
FFMPEG = imageio_ffmpeg.get_ffmpeg_exe()
!{FFMPEG} -y -loglevel error \
-i /opt/atomgit/tests/predict-video/car.avi \
-c:v libx264 -pix_fmt yuv420p -movflags +faststart \
/opt/atomgit/tests/predict-video/car.mp4很多习惯了 GPU 环境的开发者在这里容易踩坑:直接 pip install opencv-python,结果在昇腾服务器上报 ImportError: libGL.so.1 或 cannot open display。
根本原因:标准版 opencv-python 编译时启用了 GTK/Qt GUI 后端,运行时会尝试连接 X11 显示服务器。昇腾 NPU 服务器通常是无头(headless)环境,没有 X11,导致动态库加载失败。
解决方案:始终安装 opencv-python-headless:
pip install --force-reinstall --no-deps opencv-python-headless -i https://mirrors.huaweicloud.com/repository/pypi/simple--force-reinstall --no-deps 确保覆盖已有的标准版 OpenCV,且不引入额外依赖冲突。
另一个常见问题:YOLO 视频检测输出的是 AVI 格式(使用 MJPEG 编码),文件体积大、兼容性差,很多播放器无法正常播放。
根本原因:Ultralytics 的视频输出默认使用 cv2.VideoWriter 的 MJPEG 编码器,这是 OpenCV 最通用的编码器,但产生的文件体积远大于 H.264 压缩。
解决方案:检测完成后,使用 FFmpeg 转码为 H.264 MP4:
import imageio_ffmpeg
FFMPEG = imageio_ffmpeg.get_ffmpeg_exe()
# -c:v libx264: H.264 编码
# -pix_fmt yuv420p: 兼容性最好的像素格式
# -movflags +faststart: 将元数据移到文件头,支持流式播放| 环境变量 | 默认值 | 说明 |
|---|---|---|
ASCEND_RT_VISIBLE_DEVICES | 0 | 昇腾 NPU 可见设备 ID |
CUDA_VISIBLE_DEVICES | (空) | 必须清空,防止 CUDA 回退 |
PATH | 需追加 /opt/atomgit/.local/bin | yolo CLI 命令所在路径 |
| 问题 | 原因 | 解决方案 |
|---|---|---|
ImportError: libGL.so.1 | 安装了标准版 opencv-python | 改装 opencv-python-headless |
yolo: command not found | PATH 未包含 ~/.local/bin | os.environ['PATH'] = '/opt/atomgit/.local/bin:' + os.environ['PATH'] |
No CUDA GPUs available | device 参数写错或 CUDA_VISIBLE_DEVICES 未清空 | 使用 device=npu:0,清空 CUDA_VISIBLE_DEVICES |
| 检测结果无检测框 | 置信度阈值过高或图片无目标 | 调低 conf=0.25 至 0.1 |
| 视频输出无法播放 | AVI 格式兼容性差 | 使用 FFmpeg 转码为 MP4 |
ModuleNotFoundError | 安装后未重启内核 | 重启 Jupyter 内核后重试 |
yolo predict model=<模型路径> \
source=<图片路径> \
imgsz=640 conf=0.25 iou=0.45 device=npu:0 \
save=True save_txt=True save_conf=True \
project=<输出目录> name=<实验名称>yolo predict model=<模型路径> \
source=<视频路径> \
imgsz=640 conf=0.25 iou=0.45 device=npu:0 \
save=True save_txt=True save_conf=True \
project=<输出目录> name=<实验名称>| 参数 | 说明 | 推荐值 |
|---|---|---|
model | 模型权重路径 | /opt/atomgit/YOLO11/yolo11m.pt |
source | 输入源(图片/视频/摄像头) | 文件路径 |
imgsz | 推理分辨率 | 640 |
conf | 置信度阈值 | 0.25(可调低至 0.1) |
iou | NMS IoU 阈值 | 0.45 |
device | 推理设备 | npu:0(昇腾) |
登录后即可查看完整教程内容、运行代码和参
与学习互动
还没有账号?