云计算百科
云计算领域专业知识百科平台

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

前言

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 格式,兼容性最好
  • 实际部署时应结合硬件平台和模型大小选择合适的推理格式
  • 赞(0)
    未经允许不得转载:网硕互联帮助中心 » YOLOv8 在 i5-14600KF 上三种格式实测:ONNX 竟比 PyTorch 快 1.8 倍,OpenVINO 为何翻车?
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!