《博主简介》
小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。
✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~
👍感谢小伙伴们点赞、关注!
《------往期经典推荐------》
二、机器学习实战专栏【链接】,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】
五、YOLOv8改进专栏【链接】,持续更新中~~
六、YOLO性能对比专栏【链接】,持续更新中~
《------正文------》
前言
本文介绍了如何将YOLOv8模型转为其他不同的部署文件格式
,并且比较了YOLOv8n.pt
的5种不同部署方式:包括原生yolov8n.pt的Pytorch格式、ONNX、OpenVINO-FP32、OpenVINO-int8、TensorRT
在CPU和GPU下的推理速度对比,供小伙伴们参考。小伙伴们自己训练的v8模型可以用同样的方式进行转换测试。
【注:不同硬件设备可能测试会略有差异,但趋势应该没有问题,本文结果仅供参考】
模型导出方法
模型导出代码
yolov8提供了很简洁的模型转换方式,代码如下所示:
from ultralytics import YOLO
# Load a model
model = YOLO("yolov8n.pt") # load an official model
# Export the model
model.export(format="onnx")
在上面代码中可以使用 format
参数导出为任何格式,即 format='onnx'
或 format='engine'
.我们也可以直接在导出的模型上进行预测或验证 yolo predict model=yolov8n.onnx
,即 导出完成后,将显示模型的使用示例。
可导出的模型格式
可用的 YOLOv8 导出格式如下表所示:
Format | format Argument | Model | Metadata | Arguments |
---|---|---|---|---|
PyTorch | - | yolov8n.pt | ✅ | - |
TorchScript | torchscript | yolov8n.torchscript | ✅ | imgsz , optimize , batch |
ONNX | onnx | yolov8n.onnx | ✅ | imgsz , half , dynamic , simplify , opset , batch |
OpenVINO | openvino | yolov8n_openvino_model/ | ✅ | imgsz , half , int8 , batch |
TensorRT | engine | yolov8n.engine | ✅ | imgsz , half , dynamic , simplify , workspace , int8 , batch |
CoreML | coreml | yolov8n.mlpackage | ✅ | imgsz , half , int8 , nms , batch |
TF SavedModel | saved_model | yolov8n_saved_model/ | ✅ | imgsz , keras , int8 , batch |
TF GraphDef | pb | yolov8n.pb | ❌ | imgsz , batch |
TF Lite | tflite | yolov8n.tflite | ✅ | imgsz , half , int8 , batch |
TF Edge TPU | edgetpu | yolov8n_edgetpu.tflite | ✅ | imgsz |
TF.js | tfjs | yolov8n_web_model/ | ✅ | imgsz , half , int8 , batch |
PaddlePaddle | paddle | yolov8n_paddle_model/ | ✅ | imgsz , batch |
NCNN | ncnn | yolov8n_ncnn_model/ | ✅ | imgsz , half , batch |
其中format
列表示,导出时format设置的参数名称。Arguments
表示导出对应格式时可以额外设置的参数。比如,导出int8
格式的openvino
模型,代码如下:
from ultralytics import YOLO
# Load a model
model = YOLO("yolov8n.pt") # load an official model
# Export the model
model.export(format="openvino",int8=True)
导出模型参数说明
下表详细介绍了可用于将 YOLO 模型导出为不同格式的配置和选项。这些设置对于优化导出模型的性能、大小以及跨各种平台和环境的兼容性至关重要。正确的配置可确保模型已准备好以最佳效率部署在预期应用程序中。
参数 | 类型 | 默认值 | 描述 |
---|---|---|---|
format | str | 'torchscript' | 导出模型的目标格式,如 'onnx' 、 'torchscript' 、 'tensorflow' 或其他格式,用于定义与各种部署环境的兼容性。 |
imgsz | int 或 tuple | 640 | 模型输入所需的图像大小。可以是方形图像的整数,也可以是特定尺寸的元组 (height, width) 。 |
keras | bool | False | 支持将 TensorFlow SavedModel 导出为 Keras 格式,从而提供与 TensorFlow 服务和 API 的兼容性。 |
optimize | bool | False | 在导出到 TorchScript 时对移动设备应用优化,从而可能减小模型大小并提高性能。 |
half | bool | False | 启用 FP16(半精度)量化,减小模型大小,并可能加快在支持的硬件上的推理速度。 |
int8 | bool | False | 激活 INT8 量化,进一步压缩模型并加快推理速度,同时将精度损失降至最低,主要针对边缘设备。 |
dynamic | bool | False | 允许 ONNX 和 TensorRT 导出的动态输入大小,从而增强处理不同图像尺寸的灵活性。 |
simplify | bool | False | 使用 onnxslim 简化 ONNX 导出的模型图,从而可能提高性能和兼容性。 |
opset | int | None | 指定 ONNX 操作集版本,以便与不同的 ONNX 分析程序和运行时兼容。如果未设置,则使用支持的最新版本。 |
workspace | float | 4.0 | 设置最大工作空间大小(以 GiB 为单位),用于 TensorRT 优化,平衡内存使用量和性能。 |
nms | bool | False | 将非最大抑制 (NMS) 添加到 CoreML 导出中,这对于准确高效的检测后处理至关重要。 |
batch | int | 1 | 指定导出模型批量推理大小或导出的模型将在模式下 predict 并发处理的最大图像数。 |
调整这些参数可以自定义导出过程以满足特定要求,例如部署环境、硬件约束和性能目标。选择适当的格式和设置对于在模型大小、速度和精度之间实现最佳平衡至关重要。
模型推理速度对比
本文将yolov8n.pt
模型分别导出ONNX、OpenVINO-FP32、OpenVINO-int8、TensorRT
这4种格式,加上原生pytorch格式的yolov8n.pt
模型,共5种格式模型。分别在CPU与GPU上进行了推理测试,测试结果如下表:
model_name | device | FPS |
---|---|---|
yolov8n.pt | GPU | 77 |
yolov8n.onnx | GPU | 81 |
yolov8n_openvino_model | GPU | 38 |
yolov8n_int8_openvino_model | GPU | 60 |
yolov8n.engine | GPU | 104 |
yolov8n.pt | cpu | 9 |
yolov8n.onnx | cpu | 22 |
yolov8n_openvino_model | cpu | 34 |
yolov8n_int8_openvino_model | cpu | 51 |
yolov8n.engine | cpu | 0 |
为了更直观的进行推理结果展示,我们直接将表格结果显示为图标形式,绘图代码如下:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
matplotlib.use('TkAgg')
# 示例数据
categories = ['Pytorch', 'ONNX', 'OpenVINO-FP32','OpenVINO-int8', 'TensorRT']
data_1 = [9, 22, 34, 51, 0]
data_2 = [77, 81, 38, 60,104]
# data_3 = [14, 30, 22, 36]
# 设置柱子宽度和间距
bar_width = 0.25
index = np.arange(len(categories))
# 绘制第一个数据集的条形图
bars1 = plt.bar(index, data_1, bar_width, label='CPU', color='b')
# 绘制第二个数据集的条形图,注意x坐标要偏移以避免重叠
bars2 = plt.bar(index + bar_width, data_2, bar_width, label='GPU', color='r')
# 绘制第三个数据集的条形图,继续偏移
# bars3 = plt.bar(index + 2*bar_width, data_3, bar_width, label='Dataset 3', color='g')
# 在每个柱子上方显示数值
def add_value_labels(ax, bars):
for bar in bars:
height = bar.get_height()
ax.annotate('{}'.format(height),
xy=(bar.get_x() + bar.get_width() / 2, height),
xytext=(0, 3), # 3 points vertical offset
textcoords="offset points",
ha='center', va='bottom')
add_value_labels(plt.gca(), bars1)
add_value_labels(plt.gca(), bars2)
# 设置图表标题和轴标签
plt.title('Comparison of model inference speed')
plt.xlabel('Model Name', fontsize=14)
plt.ylabel('FPS', fontsize=14)
plt.xticks(index + bar_width, categories)
# 创建图例
plt.legend()
# 显示网格
plt.grid(axis='y', linestyle='--', linewidth=0.7, alpha=0.7)
# 显示图表
plt.tight_layout() # 自动调整子图参数,使之填充整个图像区域
# plt.show()
plt.savefig('chart.jpg')
最终绘制结果如下所示,可以更好的对比不同模型的检测速度。
从上述结果可以看出:
在CPU设备上:
- yolov8n.pt模型的性能最低,每秒处理9帧。
- yolov8n.onnx模型稍微优于yolov8n.pt,每秒处理22帧。
- yolov8n_openvino_model模型的性能最佳,每秒处理34帧。
- yolov8n_int8_openvino_model模型略高于yolov8n_openvino_model,每秒处理51帧
- yolov8n.engine模型只能在GPU运行,无法测试。
在GPU设备上:
- yolov8n.pt模型的性能比CPU处理快很多,每秒处理77帧。
- yolov8n.onnx模型稍微优于yolov8n.pt,每秒处理81帧。
- yolov8n_openvino_model模型的性能最低,每秒处理38帧。
- yolov8n_int8_openvino_model模型略高于yolov8n_openvino_model,每秒处理60帧。
- yolov8n.engine模型的性能最佳,每秒处理104帧。
总体上,对于相同的模型和设备,使用GPU比使用CPU获得更高的处理帧数。此外,yolov8n.engine
模型在GPU设备上表现最出色,达到了100帧/s
;yolov8n.pt
与yolov8n.onnx
其次,约为80帧/s
。在CPU上OpenVINO_int8表现出的性能最佳, 可以达到60帧/s
,基本可以满足实际的检测帧率需求。
需要注意的是,FPS仅是模型性能的一个指标,实际应用中还需要综合考虑其他因素,如模型的准确性、内存占用等。
好了,这篇文章就介绍到这里,喜欢的小伙伴感谢给点个赞和关注,更多精彩内容持续更新~~
关于本篇文章大家有任何建议或意见,欢迎在评论区留言交流!