前言
YOLOv8 是 Ultralytics 推出的最新一代目标检测模型,广泛应用于工业检测、智能监控、自动驾驶等领域。在实际部署时,我们通常需要将 PyTorch 模型转换为 ONNX、OpenVINO 等推理格式,以获得更快的推理速度和更小的资源占用。
本文将详细介绍 YOLOv8 模型的导出流程,并在 Intel i5-14600KF CPU 上对 PyTorch、ONNX、OpenVINO 三种格式进行性能实测对比,帮助大家选择最适合自己硬件的部署方案。
一、环境搭建
1.1 系统环境
- 操作系统:Windows 10/11
- CPU:Intel Core i5-14600KF
- Python:3.12
- 内存:16GB
1.2 安装依赖
pip install ultralytics onnxruntime opencv-python numpy
如果需要 OpenVINO 格式,还需要安装:
pip install openvino
1.3 验证安装
from ultralytics import YOLO
import onnxruntime as ort
print("ultralytics OK")
print("onnxruntime OK")
二、模型导出
2.1 加载预训练模型
YOLOv8 提供了 n/s/m/l/x 五个不同大小的模型。本文使用最轻量的 yolov8n(nano 版本,3.2M 参数,6.2MB),适合边缘设备部署。
from ultralytics import YOLO
# 加载预训练模型(首次运行会自动下载)
model = YOLO('yolov8n.pt')
# 查看模型信息
params = sum(p.numel() for p in model.model.parameters())
print(f"模型参数量:{params / 1e6:.1f}M")
2.2 导出为 ONNX 格式
# ONNX 导出
model.export(format='onnx', imgsz=640, simplify=True)
# 输出:yolov8n.onnx (12.3 MB)
参数说明:
imgsz=640:输入图片尺寸simplify=True:简化模型结构,减少冗余算子
2.3 导出为 OpenVINO 格式
# OpenVINO 导出
model.export(format='openvino', imgsz=640)
# 输出:yolov8n_openvino_model/ 目录(12.3 MB)
OpenVINO 是 Intel 推出的推理优化框架,针对 Intel CPU/GPU/NPU 有专门的加速优化。
三、推理代码
3.1 PyTorch 推理(最简单)
from ultralytics import YOLO
model = YOLO('yolov8n.pt')
results = model.predict(source='test.jpg', save=True)
# 打印检测结果
for box in results[0].boxes:
cls_id = int(box.cls[0])
conf = float(box.conf[0])
print(f"类别:{model.names[cls_id]},置信度:{conf:.2f}")
3.2 ONNX Runtime 推理(推荐)
使用 ONNX Runtime 推理不需要依赖 ultralytics 框架,部署更轻量:
import onnxruntime as ort
import numpy as np
import cv2
# 加载模型
session = ort.InferenceSession('yolov8n.onnx', providers=['CPUExecutionProvider'])
input_name = session.get_inputs()[0].name
# 读取并预处理图片
img = cv2.imread('test.jpg')
orig_h, orig_w = img.shape[:2]
resized = cv2.resize(img, (640, 640))
blob = resized[:, :, ::-1].transpose(2, 0, 1).astype(np.float32) / 255.0
blob = np.expand_dims(blob, axis=0)
# 推理
output = session.run(None, {input_name: blob})
# 后处理
preds = output[0][0].T # (8400, 84)
boxes = preds[:, :4]
scores = preds[:, 4:]
class_ids = np.argmax(scores, axis=1)
confidences = np.max(scores, axis=1)
# 过滤低置信度结果
mask = confidences > 0.5
boxes = boxes[mask]
confidences = confidences[mask]
class_ids = class_ids[mask]
print(f"检测到 {len(boxes)} 个目标")
3.3 OpenVINO 推理
from ultralytics import YOLO
# 加载 OpenVINO 模型
model = YOLO('yolov8n_openvino_model/')
results = model.predict(source='test.jpg', save=True)
四、性能对比
为了尽量公平,三种格式均在同一台 Intel i5-14600KF 主机上进行测试,统一输入尺寸 640×640、批量大小 batch=1;每种格式先预热 2 次,再连续推理 10 次取平均耗时。测试时 CPU 未开启超频,并尽量关闭后台高占用程序,以减少偶然波动:
| 格式 | 推理耗时 | FPS | 模型大小 | 备注 |
|---|---|---|---|---|
| PyTorch | 29.4ms | 34 | 6.2 MB | 基准 |
| ONNX | 16.6ms | 60 | 12.3 MB | 速度最快 |
| OpenVINO | 30.7ms | 32 | 12.3 MB | 大模型优势明显 |
4.1 结论
- 小模型(yolov8n):ONNX Runtime 最快,比 PyTorch 快 1.8 倍,比 OpenVINO 快 1.9 倍
- 大模型(yolov8s/m/l/x):OpenVINO 优势更明显,官方数据显示可获得 2-3 倍加速
- 边缘设备(树莓派等):推荐使用 ONNX Runtime,兼容性最好
4.2 为什么 yolov8n 上 OpenVINO 没有优势?
OpenVINO 的优化主要针对大规模计算图:它通过层融合、精度压缩(如 FP32→FP16/INT8)、内存布局重排和内核调度来减少计算开销。但 yolov8n 只有 3.2M 参数,模型本身很小,单次推理的浮点运算量较低,可被融合、压缩的算子有限,优化收益会被明显稀释。与此同时,OpenVINO Runtime 在首次推理前需要完成模型加载、编译和内核选择等初始化工作,这部分固定开销在小模型上显得更加突出,最终导致整体耗时反而略高于 PyTorch 和 ONNX Runtime。换句话说,OpenVINO 更像是“为重型模型准备的加速器”;在 yolov8s/m/l/x 等更大模型上,计算密集度提升后,它的优势才会真正体现出来。
五、YOLOv8 不同模型大小对比
| 模型 | 参数量 | 模型大小 | mAP@50 | 适用场景 |
|---|---|---|---|---|
| yolov8n | 3.2M | 6.2 MB | 37.3 | 边缘设备、实时检测 |
| yolov8s | 11.2M | 22.5 MB | 44.9 | 轻量服务器 |
| yolov8m | 25.9M | 52.2 MB | 50.2 | 通用场景 |
| yolov8l | 43.7M | 87.7 MB | 52.9 | 高精度需求 |
| yolov8x | 68.2M | 136 MB | 53.9 | 极致精度 |
六、部署到边缘设备
6.1 树莓派部署
# 树莓派上安装 ONNX Runtime
pip install onnxruntime
# 将 yolov8n.onnx 复制到树莓派
scp yolov8n.onnx pi@raspberrypi:~/
# 运行推理(使用本文的 ONNX 推理代码)
python detect_onnx.py
6.2 Jetson Nano 部署(NVIDIA GPU)
# 导出为 TensorRT 格式(在 Jetson 上执行)
model = YOLO('yolov8n.pt')
model.export(format='engine', imgsz=640)
6.3 RK3568/RK3588 部署(瑞芯微 NPU)
# RK3568/RK3588 部署(瑞芯微 NPU)
# 先导出 ONNX,再使用 rknn-toolkit2 转换为 RKNN
model = YOLO('yolov8n.pt')
model.export(format='onnx', imgsz=640)
# rknn-toolkit2 转换示例见:
# https://github.com/airockchip/rknn-toolkit2
七、常见问题
Q1:导出 ONNX 时报错缺少 onnx 依赖怎么办?
pip install onnx onnxslim
Q2:CPU 上推理太慢怎么优化?
- 使用 ONNX Runtime 替代 PyTorch
- 降低输入分辨率(imgsz=320)
- 使用 INT8 量化(需要校准数据集)
Q3:如何使用自定义数据集训练?
from ultralytics import YOLO
model = YOLO('yolov8n.pt')
model.train(data='your_dataset.yaml', epochs=100, imgsz=640)
数据集 YAML 配置文件格式参考 COCO 数据集。
八、资源下载
本文的完整代码、模型文件和部署文档已上传至 CSDN 文库:
YOLOv8多格式部署资源包(PyTorch+ONNX+OpenVINO推理代码+性能对比+边缘设备部署指南)
资源包含:
- 三种格式的预训练模型(PyTorch / ONNX / OpenVINO)
- 四套完整的中文注释推理代码
- 性能对比测试脚本
- 不依赖 ultralytics 的独立推理代码(可直接部署到边缘设备)
总结
- YOLOv8 模型导出非常方便,一条命令即可完成格式转换
- 小模型在 CPU 上推荐使用 ONNX Runtime,推理速度最快
- 大模型在 Intel CPU 上推荐使用 OpenVINO,可获得 2-3 倍加速
- 边缘设备部署推荐 ONNX 格式,兼容性最好
- 实际部署时应结合硬件平台和模型大小选择合适的推理格式