基于 Ultralytics YOLO11 的目标检测服务,使用官方Python接口,支持华为昇腾NPU加速推理。
/yolo11)本项目使用 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"# 使用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.jpgYOLO11推理接口(兼容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
}'健康检查接口
示例:
curl http://localhost:18004/health响应:
{
"status": "healthy",
"model_loaded": true,
"version": "1.0.0",
"model_id": "yolo11n.pt",
"task": "detect"
}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"}
)| 模型 | 大小 | mAPval | CPU速度 |
|---|---|---|---|
| YOLO11n | 2.6 MB | 39.5 | ~50ms |
| YOLO11s | 9.4 MB | 47.0 | ~100ms |
| YOLO11m | 20.1 MB | 51.5 | ~200ms |
| YOLO11l | 25.3 MB | 53.4 | ~300ms |
| YOLO11x | 56.9 MB | 54.7 | ~500ms |
推荐使用 yolo11n.pt(nano)进行CPU推理。
| 变量名 | 说明 | 默认值 |
|---|---|---|
LOCAL_MODEL_PATH | 本地模型目录路径(必须) | /app/models/yolo11n.pt |
PORT | API服务端口 | 8000 |
LOG_LEVEL | 日志级别 | INFO |
ASCEND_VISIBLE_DEVICES | NPU设备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 # 最大检测数量基于 YOLO11n 模型:
| 图像尺寸 | NPU推理时间 | CPU推理时间 |
|---|---|---|
| 640x640 | 10-30ms | 50-100ms |
| 1280x1280 | 40-80ms | 200-400ms |
注意:
启用NPU设备(推荐)
# docker-compose.yml
devices:
- /dev/davinci0:/dev/davinci0
- /dev/davinci_manager:/dev/davinci_manager
privileged: true
environment:
- ASCEND_VISIBLE_DEVICES=0使用更小的模型
model: "yolo11n.pt" # nano模型最快减小输入尺寸
imgsz: 320 # 从640减少到320(速度提升4倍)增加置信度阈值
conf: 0.5 # 从0.25提高到0.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 图片。
检查:
# 检查模型文件
ls -lh /Users/yanlp/models/yolo11n.pt
# 确保文件存在且可读解决:确保 docker-compose.yml 中的路径正确
volumes:
- /Users/yanlp/models:/app/models
environment:
- LOCAL_MODEL_PATH=/app/models/yolo11n.pt# 实时日志
docker-compose logs -f
# 查看错误
docker-compose logs | grep -i error
# 检查容器状态
docker ps | grep yoloyolo11/
├── 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接口 构建(极简版):
model = YOLO("/app/models/{model}")results = model("image.jpg")代码极其简洁 - 仅432行核心代码即可实现完整的YOLO推理服务!
# 下载模型
make download-model
# 构建镜像
make build
# 启动服务
make run
# 查看日志
make logs
# 停止服务
make stop
# 健康检查
make health
# 测试 API
make testfrom 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/
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%}")本项目完全基于 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/
MIT