YOLOv8 在 i5-14600KF 上三种格式实测:ONNX 竟比 PyTorch 快 1.8 倍,OpenVINO 为何翻车?

0 阅读6分钟

前言

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模型大小备注
PyTorch29.4ms346.2 MB基准
ONNX16.6ms6012.3 MB速度最快
OpenVINO30.7ms3212.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适用场景
yolov8n3.2M6.2 MB37.3边缘设备、实时检测
yolov8s11.2M22.5 MB44.9轻量服务器
yolov8m25.9M52.2 MB50.2通用场景
yolov8l43.7M87.7 MB52.9高精度需求
yolov8x68.2M136 MB53.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 的独立推理代码(可直接部署到边缘设备)

总结

  1. YOLOv8 模型导出非常方便,一条命令即可完成格式转换
  2. 小模型在 CPU 上推荐使用 ONNX Runtime,推理速度最快
  3. 大模型在 Intel CPU 上推荐使用 OpenVINO,可获得 2-3 倍加速
  4. 边缘设备部署推荐 ONNX 格式,兼容性最好
  5. 实际部署时应结合硬件平台和模型大小选择合适的推理格式