Atomgit-Ascend/yolo11
模型介绍文件和版本Pull Requests讨论分析

YOLO11 - NPU推理部署

基于 Ultralytics YOLO11 的目标检测服务,使用官方Python接口,支持华为昇腾NPU加速推理。

特性

  • ✅ 使用官方Python接口 - 参考 官方文档
  • ✅ 极简架构 - 核心代码仅432行
  • ✅ NPU加速推理 - 华为昇腾NPU(Ascend)/ CPU回退
  • ✅ 动态模型加载 - 支持多模型部署,按需加载
  • ✅ 支持多种任务类型(检测、分割、分类、姿态估计、OBB)
  • ✅ 兼容Ultralytics API格式(/yolo11)
  • ✅ 仅支持base64图像 - 无需文件上传,更轻量
  • ✅ RESTful API 接口
  • ✅ Prometheus监控指标

核心实现

本项目使用 Ultralytics 官方Python接口实现,支持动态模型加载:

from ultralytics import YOLO

# 动态加载模型(推理时根据请求参数加载)
model = YOLO("/app/models/yolo11n.pt")

# 推理(官方简化接口)
results = model("image.jpg")

# 带参数的推理
results = model("image.jpg", imgsz=640, conf=0.25, iou=0.45)

动态模型加载 - 服务启动时只验证模型目录,推理时根据请求的model参数动态加载对应模型文件。支持同时部署多个模型(检测、分割、分类等)。

参考: https://docs.ultralytics.com/zh/usage/python/

快速开始

前置条件

下载模型到 /Users/yanlp/models/

支持多模型部署,将需要的模型文件都放入模型目录:

# 创建模型目录
mkdir -p /Users/yanlp/models

# 方法1: 使用Python下载
python3 -c "from ultralytics import YOLO; YOLO('yolo11n.pt')"
python3 -c "from ultralytics import YOLO; YOLO('yolo11s-seg.pt')"
# 模型会下载到 ~/.cache/ultralytics/
# 然后复制到 /Users/yanlp/models/

# 方法2: 从AtomGit下载
# https://ai.atomgit.com/hf_mirrors/Ultralytics/YOLO11/tree/main
# 下载所需的模型文件到 /Users/yanlp/models/

模型示例:

  • yolo11n.pt - 检测模型
  • yolo11s-seg.pt - 分割模型
  • yolo11n-pose.pt - 姿态估计模型
  • yolo11n-cls.pt - 分类模型

推理时通过model参数指定使用哪个模型。

启动服务

# 方式 1: 使用 Makefile(推荐)
make build  # 构建镜像(NPU版本)
make run    # 启动服务

# 方式 2: 使用 Docker Compose
docker-compose up -d

# 方式 3: 使用 docker build + run(NPU版本)
docker build -t yolo11-npu:latest .
docker run -d --name yolo11-api -p 18004:8000 \
  -v /Users/yanlp/models/YOLO11:/app/models \
  -e LOCAL_MODEL_PATH=/app/models/yolo11n.pt \
  yolo11-npu:latest

# 如需启用NPU设备,添加设备挂载:
# --device /dev/davinci0:/dev/davinci0 \
# --device /dev/davinci_manager:/dev/davinci_manager \
# -e ASCEND_VISIBLE_DEVICES=0

等待启动

# 查看日志
docker-compose logs -f

# 等待看到 "Application startup complete"

测试 API

# 使用Shell测试脚本(默认使用bus.jpg)
./test_api.sh

# 自定义地址和图片
./test_api.sh http://localhost:18004 ./bus.jpg

# 使用Python测试脚本
python3 test_inference.py

# 自定义地址和图片
python3 test_inference.py http://localhost:18004 ./bus.jpg

API接口

POST /yolo11

YOLO11推理接口(兼容Ultralytics API格式 - 仅支持base64)

参考: https://docs.ultralytics.com/zh/hub/inference-api/#curl

请求体:

{
  "source": "base64编码的图像数据",
  "model": "yolo11s-seg.pt",
  "imgsz": 640,
  "conf": 0.25,
  "iou": 0.45
}

响应(Ultralytics格式):

{
  "images": [
    {
      "results": [
        {
          "class": 0,
          "name": "person",
          "confidence": 0.92,
          "box": {
            "x1": 118.0,
            "y1": 112.0,
            "x2": 416.0,
            "y2": 660.0
          }
        }
      ],
      "shape": [750, 600],
      "speed": {
        "inference": 200.8,
        "preprocess": 2.8,
        "postprocess": 0.8
      }
    }
  ],
  "metadata": {
    "model": "yolo11n.pt",
    "task": "detect",
    "detections": 1
  }
}

Python示例:

import requests
import base64

# 读取图像并转为base64
with open("test_image.jpg", "rb") as f:
    image_base64 = base64.b64encode(f.read()).decode()

# 发送请求(Ultralytics API格式)
response = requests.post(
    "http://localhost:18004/yolo11",
    json={
        "source": image_base64,
        "model": "yolo11n.pt",
        "imgsz": 640,
        "conf": 0.25,
        "iou": 0.45
    }
)

result = response.json()
print(f"检测到 {len(result['images'][0]['results'])} 个目标")
for det in result['images'][0]['results']:
    print(f"  - {det['name']}: {det['confidence']:.2%}")

cURL示例:

curl -X POST "http://localhost:18004/yolo11" \
  -H "Content-Type: application/json" \
  -d '{
    "source": "base64编码的图像数据",
    "model": "yolo11n.pt",
    "imgsz": 640,
    "conf": 0.25,
    "iou": 0.45
  }'

GET /health

健康检查接口

示例:

curl http://localhost:18004/health

响应:

{
  "status": "healthy",
  "model_loaded": true,
  "version": "1.0.0",
  "model_id": "yolo11n.pt",
  "task": "detect"
}

GET /metrics

Prometheus监控指标

示例:

curl http://localhost:18004/metrics

支持的任务类型(动态模型加载)

本项目支持动态模型加载,只需将模型文件放入/Users/yanlp/models/目录,即可在推理时通过model参数指定使用哪个模型。

任务模型说明
目标检测yolo11n.pt检测图像中的目标(边界框)
图像分割yolo11n-seg.pt实例分割(边界框+掩码)
图像分类yolo11n-cls.pt图像分类
姿态估计yolo11n-pose.pt人体关键点检测
OBB检测yolo11n-obb.pt旋转边界框检测

使用示例:

# 使用检测模型
response = requests.post(
    "http://localhost:18004/yolo11",
    json={"source": image_base64, "model": "yolo11n.pt"}
)

# 使用分割模型
response = requests.post(
    "http://localhost:18004/yolo11",
    json={"source": image_base64, "model": "yolo11s-seg.pt"}
)

# 使用姿态估计模型
response = requests.post(
    "http://localhost:18004/yolo11",
    json={"source": image_base64, "model": "yolo11n-pose.pt"}
)

YOLO11模型列表

模型大小mAPvalCPU速度
YOLO11n2.6 MB39.5~50ms
YOLO11s9.4 MB47.0~100ms
YOLO11m20.1 MB51.5~200ms
YOLO11l25.3 MB53.4~300ms
YOLO11x56.9 MB54.7~500ms

推荐使用 yolo11n.pt(nano)进行CPU推理。

环境变量

变量名说明默认值
LOCAL_MODEL_PATH本地模型目录路径(必须)/app/models/yolo11n.pt
PORTAPI服务端口8000
LOG_LEVEL日志级别INFO
ASCEND_VISIBLE_DEVICESNPU设备ID(可选)未设置

配置文件

编辑 config/config.yaml 自定义推理参数:

model:
  model_id: "yolo11n.pt"
  local_model_path: "/app/models/yolo11n.pt"
  task: "detect"
  imgsz: 640      # 输入图像尺寸
  conf: 0.25      # 置信度阈值
  iou: 0.45       # NMS IoU阈值
  max_det: 300    # 最大检测数量

性能说明

NPU/CPU 推理速度(参考)

基于 YOLO11n 模型:

图像尺寸NPU推理时间CPU推理时间
640x64010-30ms50-100ms
1280x128040-80ms200-400ms

注意:

  • ⚡ NPU加速 - 华为昇腾NPU可提供3-5倍性能提升
  • ✅ 自动回退 - 如无NPU设备,自动使用CPU推理
  • ✅ YOLO11比YOLO8更快更准
  • ✅ 使用nano模型获得最快速度

优化建议

  1. 启用NPU设备(推荐)

    # docker-compose.yml
    devices:
      - /dev/davinci0:/dev/davinci0
      - /dev/davinci_manager:/dev/davinci_manager
    privileged: true
    environment:
      - ASCEND_VISIBLE_DEVICES=0
  2. 使用更小的模型

    model: "yolo11n.pt"  # nano模型最快
  3. 减小输入尺寸

    imgsz: 320  # 从640减少到320(速度提升4倍)
  4. 增加置信度阈值

    conf: 0.5  # 从0.25提高到0.5(减少后处理时间)
  5. 增加资源限制

    # docker-compose.yml
    deploy:
      resources:
        limits:
          cpus: '8'
          memory: 8G

测试脚本

# Shell测试(默认使用bus.jpg)
./test_api.sh

# 自定义地址和图像
./test_api.sh http://localhost:18004 ./bus.jpg

# Python测试
python3 test_inference.py http://localhost:18004 ./bus.jpg

测试脚本已简化,只测试 /yolo11 接口,默认使用项目自带的 bus.jpg 图片。

故障排查

常见问题

1. 模型加载失败

检查:

# 检查模型文件
ls -lh /Users/yanlp/models/yolo11n.pt

# 确保文件存在且可读

解决:确保 docker-compose.yml 中的路径正确

volumes:
  - /Users/yanlp/models:/app/models
environment:
  - LOCAL_MODEL_PATH=/app/models/yolo11n.pt

2. 推理速度慢

  • 使用更小的模型(yolo11n.pt)
  • 减小图像尺寸(imgsz=320)
  • 增加CPU核心数

3. 查看日志

# 实时日志
docker-compose logs -f

# 查看错误
docker-compose logs | grep -i error

# 检查容器状态
docker ps | grep yolo

项目结构

yolo11/
├── api/                  # 核心代码(极简版)
│   ├── __init__.py       (7行)
│   ├── main.py           (261行 - 含动态加载)
│   └── inference.py      (164行 - 工具函数)
├── config/
│   └── config.yaml       # 配置文件
├── bus.jpg               # 测试图片
├── Dockerfile            # Docker 镜像(华为昇腾NPU)
├── docker-compose.yml    # Docker Compose(NPU配置)
├── entrypoint.sh         # 启动脚本(NPU检测)
├── Makefile              # 便捷命令
├── requirements.txt      # Python 依赖
├── test_api.sh           (103行 - 仅测试推理)
├── test_inference.py     (144行 - 仅测试推理)
└── README.md             # 项目文档(本文件)

核心代码仅432行 - 采用官方推荐的最简洁方式 + 动态模型加载!

技术架构

本项目基于 Ultralytics 官方Python接口 构建(极简版):

  1. 动态模型加载 - 推理时按需加载:model = YOLO("/app/models/{model}")
  2. 推理调用 - 直接调用模型:results = model("image.jpg")
  3. NPU加速 - 华为昇腾NPU(如可用)/ CPU回退
  4. API服务 - FastAPI提供RESTful接口
  5. 部署方案 - Docker容器化部署(华为昇腾NPU镜像)

代码极其简洁 - 仅432行核心代码即可实现完整的YOLO推理服务!

常用命令

# 下载模型
make download-model

# 构建镜像
make build

# 启动服务
make run

# 查看日志
make logs

# 停止服务
make stop

# 健康检查
make health

# 测试 API
make test

Python SDK 使用示例

方法1: 直接使用 Ultralytics 官方接口(本地 - 极简版)

from ultralytics import YOLO

# 加载模型
model = YOLO("/Users/yanlp/models/yolo11n.pt")

# 推理(最简洁的方式)
results = model("image.jpg")

# 带参数的推理
results = model("image.jpg", imgsz=640, conf=0.25, iou=0.45)

# 视频追踪
results = model.track(source="video.mp4", show=True)

# 批量推理
results = model(["img1.jpg", "img2.jpg"])

参考: https://docs.ultralytics.com/zh/usage/python/

方法2: 调用API服务(base64格式)

import requests
import base64

# 使用 /yolo11 接口(Ultralytics格式 - base64)
with open("test_image.jpg", "rb") as f:
    image_base64 = base64.b64encode(f.read()).decode()

# 发送请求
response = requests.post(
    "http://localhost:18004/yolo11",
    json={
        "source": image_base64,
        "model": "yolo11n.pt",
        "imgsz": 640,
        "conf": 0.25,
        "iou": 0.45
    }
)

# 处理结果
result = response.json()
print(f"检测到 {len(result['images'][0]['results'])} 个目标")
for det in result['images'][0]['results']:
    print(f"  - {det['name']}: {det['confidence']:.2%}")

官方Python接口示例

本项目完全基于 Ultralytics 官方Python接口,以下是核心用法:

基础推理

from ultralytics import YOLO

# 加载模型
model = YOLO("yolo11n.pt")

# 图像推理
results = model.predict(source="image.jpg", imgsz=640, conf=0.25)

# 访问结果
for result in results:
    boxes = result.boxes  # 边界框
    masks = result.masks  # 分割掩码(如果是分割模型)
    keypoints = result.keypoints  # 关键点(如果是姿态模型)
    probs = result.probs  # 分类概率(如果是分类模型)

视频追踪

from ultralytics import YOLO

# 加载模型
model = YOLO("yolo11n.pt")

# 视频追踪
results = model.track(source="video.mp4", show=True)

# 使用ByteTrack追踪器
results = model.track(source="video.mp4", tracker="bytetrack.yaml")

训练模型

from ultralytics import YOLO

# 从预训练模型开始训练
model = YOLO("yolo11n.pt")
results = model.train(data="coco8.yaml", epochs=3)

# 验证模型
results = model.val()

导出模型

from ultralytics import YOLO

# 加载模型
model = YOLO("yolo11n.pt")

# 导出为ONNX格式
success = model.export(format="onnx")

# 导出为TensorRT格式
success = model.export(format="engine", device=0)

参考完整文档: https://docs.ultralytics.com/zh/usage/python/

参考链接

  • Ultralytics YOLO11 文档 - 官方文档
  • YOLO Python 使用指南 - Python接口文档(本项目基础)
  • YOLO11 模型下载 - AtomGit镜像
  • Ultralytics HUB 推理 API - API接口参考

License

MIT