【yolov8】模型导出
- 一、为什么要使用yolo的导出模式
-
- 二、确保安装必要的库:
- 三、yolov8模型导出
-
- [3.1 不同格式配置参数](#3.1 不同格式配置参数)
- [3.2 导出格式](#3.2 导出格式)
- 四、导出模型性能优化
-
- [4.1 使用TensorRT 导出模型有什么好处?](#4.1 使用TensorRT 导出模型有什么好处?)
- [4.2导出YOLOv8 模型时,如何启用 INT8 量化?](#4.2导出YOLOv8 模型时,如何启用 INT8 量化?)
- [4.3 为什么输出模型时动态输入尺寸很重要?](#4.3 为什么输出模型时动态输入尺寸很重要?)
- [4.4 优化模型性能需要考虑哪些关键的导出参数?](#4.4 优化模型性能需要考虑哪些关键的导出参数?)
- 五、问题
- 六、疑问
训练模型的最终目标是将其部署到实际应用程序中。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 |
int 或 tuple |
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=True
和half=True
导出.onnx
格式的模型时,可能会发生不兼容的问题
因为动态尺寸 (dynamic
) 功能和半精度 (half
) 可能会与某些 ONNX Runtime 版本或配置产生冲突。解决方案:
- 分开使用 : 先尝试使用
dynamic=False
和half=True
,看看是否能成功导出并验证模型。这样,你可以确定是否确实是动态和半精度之间的具体冲突。 - 使用最新 ONNX Runtime: 确保你的 ONNX Runtime 是最新版本,有时版本更新会解决这类问题。
- 不使用半精度导出 : 试试仅用
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')