【yolov8】模型导出----pytorch导出为onnx模型

【yolov8】模型导出

训练模型的最终目标是将其部署到实际应用程序中。Ultralytics YOLOv8 中的导出模式提供了多种选项,用于将训练后的模型导出为不同的格式,使其可部署在各种平台和设备上。本综合指南旨在引导您了解模型导出的细微差别,展示如何实现最大的兼容性和性能。

一、为什么要使用yolo的导出模式

  • 多面性:导出为多种格式,包括 ONNX、TensorRT、CoreML 等
  • 性能:使用 TensorRT 获得高达 5 倍的 GPU 加速,使用 ONNX 或 OpenVINO 获得 3 倍的 CPU 加速。
  • 兼容性:使您的模型可在众多硬件和软件环境中普遍部署。
  • 易用性:简单的 CLI 和 Python API,用于快速直接的模型导出。

二、确保安装必要的库:

确保你已经安装了PyTorch和ONNX库。可以使用以下命令安装:

python 复制代码
pip install torch torchvision onnx

三、yolov8模型导出

python 复制代码
from ultralytics import YOLO

# Load a model
model = YOLO("yolov8n.pt")  # load an official model
model = YOLO("path/to/best.pt")  # load a custom trained model

# Export the model
model.export(format="onnx")
python 复制代码
# 使用cli命令
yolo export model=yolov8n.pt format=onnx  # export official model
yolo export model=path/to/best.pt format=onnx  # export custom trained model

3.1 不同格式配置参数

下表详细介绍了将YOLO 模型导出为不同格式时可用的配置和选项。这些设置对于优化导出模型的性能、大小以及在不同平台和环境中的兼容性至关重要。正确的配置可确保模型以最佳效率部署到预定应用中。

论据 类型 默认值 说明
format str 'torchscript' 导出模型的目标格式,例如 'onnx', 'torchscript', 'tensorflow'或其他,定义与各种部署环境的兼容性。
imgsz inttuple 640 模型输入所需的图像尺寸。对于正方形图像,可以是一个整数,或者是一个元组 (height, width) 了解具体尺寸。
keras bool False Enables export to Keras format for TensorFlow SavedModel, providing compatibility with TensorFlow serving and APIs.
optimize bool False 在导出到TorchScript 时,应用针对移动设备的优化,可能会减小模型大小并提高性能。
half bool False 启用 FP16(半精度)量化,在支持的硬件上减小模型大小并可能加快推理速度。
int8 bool False Activates INT8 quantization, further compressing the model and speeding up inference with minimal accuracy loss, primarily for edge devices.
dynamic bool False 允许为ONNX 、TensorRT 和OpenVINO 导出动态输入尺寸,提高了处理不同图像尺寸的灵活性。
simplify bool True 简化模型图 ONNX 导出方式 onnxslim,可能会提高性能和兼容性。
opset int None 指定ONNX opset 版本,以便与不同的ONNX 解析器和运行时兼容。如果未设置,则使用最新的支持版本。
workspace float 4.0 为TensorRT 优化设置最大工作区大小(GiB),以平衡内存使用和性能。
nms bool False 在CoreML 导出中添加非最大值抑制 (NMS),这对精确高效的检测后处理至关重要。
batch int 1 指定导出模型的批量推理大小,或导出模型将同时处理的图像的最大数量。 predict 模式。

3.2 导出格式

YOLOv8 可用的导出格式如下表所示。您可以使用 format 参数,即 format='onnx'format='engine'.您可以直接对导出的模型进行预测或验证,即 yolo predict model=yolov8n.onnx.导出完成后会显示模型的使用示例。

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

四、导出模型性能优化

4.1 使用TensorRT 导出模型有什么好处?

使用TensorRT 导出模型可显著提高性能。YOLOv8 导出到TensorRT 的模型速度最高可达GPU 的 5 倍,是实时推理应用的理想选择。

  • **多功能性:**针对特定硬件设置优化模型。
  • **速度:**通过高级优化实现更快的推理。
  • **兼容性:**可与NVIDIA 硬件顺利集成。

4.2导出YOLOv8 模型时,如何启用 INT8 量化?

INT8 量化是压缩模型和加快推理速度的绝佳方法,尤其是在边缘设备上。下面介绍如何启用 INT8 量化:

示例

python 复制代码
from ultralytics import YOLO

model = YOLO("yolov8n.pt")  # Load a model
model.export(format="onnx", int8=True)
python 复制代码
yolo export model=yolov8n.pt format=onnx int8=True   # export model with INT8 quantization

4.3 为什么输出模型时动态输入尺寸很重要?

动态输入尺寸允许导出的模型处理不同的图像尺寸,为不同的使用案例提供灵活性并优化处理效率。在导出为ONNX 或TensorRT 等格式时,启用动态输入尺寸可确保模型能无缝适应不同的输入形状。

要启用此功能,使用 dynamic=True 标志:

python 复制代码
from ultralytics import YOLO

model = YOLO("yolov8n.pt")
model.export(format="onnx", dynamic=True)
python 复制代码
yolo export model=yolov8n.pt format=onnx dynamic=True

4.4 优化模型性能需要考虑哪些关键的导出参数?

了解和配置导出参数对于优化模型性能至关重要:

  • format: 导出模型的目标格式(例如:"...")、 onnx, torchscript, tensorflow).
  • imgsz: 模型输入所需的图像大小(例如:"...")、 640(height, width)).
  • half: 启用 FP16 量化,减少模型大小,并可能加快推理速度。
  • optimize: 针对移动或受限环境进行特定优化。
  • int8: 启用 INT8 量化,非常有利于边缘部署。

五、问题

当使用 dynamic=Truehalf=True 导出 .onnx 格式的模型时,可能会发生不兼容的问题

因为动态尺寸 (dynamic) 功能和半精度 (half) 可能会与某些 ONNX Runtime 版本或配置产生冲突。解决方案:

  1. 分开使用 : 先尝试使用 dynamic=Falsehalf=True,看看是否能成功导出并验证模型。这样,你可以确定是否确实是动态和半精度之间的具体冲突。
  2. 使用最新 ONNX Runtime: 确保你的 ONNX Runtime 是最新版本,有时版本更新会解决这类问题。
  3. 不使用半精度导出 : 试试仅用 dynamic=True 而不开启 half,以检查是否是半精度计算导致的问题。
python 复制代码
yolo export model=your_model.pt format=onnx dynamic=True half=False

六、疑问

其他人对model进行修改,修改它的意义是什么??

python 复制代码
# 直接使用Pytorch的保存功能,保存为PyTorch
import torch
from ultralytics import YOLO

# 加载模型
model = YOLO('path/to/your/model.pt')  # 加载您的.pt模型

# 进行您的模型修改
# model.xxx = ...

# 保存模型
torch.save(model.state_dict(), 'path/to/save/your_modified_model.pt')

从YOLOv8模型进行修改并导出为TorchScript(默认格式)

python 复制代码
from ultralytics import YOLO

# 加载模型
model = YOLO('path/to/your/model.pt')

# 导出为TorchScript,默认不需要设置format参数
model.export('path/to/save/your_model.torchscript')

大佬写的onnx模型查看网络结构,以及修改onnx简化模型!!

相关推荐
qq_15321452642 小时前
【2023工业3D异常检测文献】M3DM: 基于混合融合的多模态工业异常检测方法
图像处理·深度学习·神经网络·机器学习·计算机视觉·3d·视觉检测
A_lvvx3 小时前
09_OpenCV彩色图片直方图
人工智能·opencv·计算机视觉
Xy-unu3 小时前
[VL|Ref]UniRef++: Segment Every Reference Object in Spatial and Temporal Spaces
论文阅读·人工智能·python·深度学习·transformer
DogDaoDao3 小时前
Windows 环境搭建 CUDA 和 cuDNN 详细教程
人工智能·windows·python·深度学习·nvidia·cuda·cudnn
张小生1804 小时前
《OpenCV》—— 指纹验证
人工智能·opencv·计算机视觉
sp_fyf_20244 小时前
[大语言模型-论文精读] 大语言模型是单样本URL分类器和解释器
人工智能·深度学习·神经网络·语言模型·自然语言处理·数据挖掘
Ven%4 小时前
深度学习速通系列:强大的中文自然语言处理工具之Pyltp的使用
人工智能·python·深度学习·自然语言处理·nlp
大模型算法和部署4 小时前
大语言模型知识点分享
人工智能·语言模型·chatgpt
sp_fyf_20244 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-29
人工智能·深度学习·神经网络·测试工具·算法·语言模型·软件工程