【TFLite, ONNX, CoreML, TensorRT Export】

本文档介绍了如何将训练好的YOLOv5模型从PyTorch导出为ONNX和TorchScript格式,包括导出步骤、模型格式、性能比较和C++环境下的OpenCV DNN使用示例。导出的模型可以在多种环境中运行,如TensorRT、ONNX Runtime和OpenVINO等,提供不同平台的加速选项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


This guide explains how to export a trained YOLOv5 🚀 model from PyTorch to ONNX and TorchScript formats. UPDATED 18 May 2022.

Before You Start

Clone repo and install requirements.txt in a Python>=3.7.0 environment, including PyTorch>=1.7. Models and datasets download automatically from the latest YOLOv5 release.

git clone https://github.com/ultralytics/yolov5  # clone
cd yolov5
pip install -r requirements.txt  # install

For TensorRT export example (requires GPU) see our Colab notebook appendix section. Open In Colab

Formats

YOLOv5 inference is officially supported in 11 formats:

💡 ProTip: TensorRT may be up to 2-5X faster than PyTorch on GPU
💡 ProTip: ONNX and OpenVINO may be up to 2-3X faster than PyTorch on CPU

在这里插入图片描述

Export a Trained YOLOv5 Model

This command exports a pretrained YOLOv5s model to TorchScript and ONNX formats. yolov5s.pt is the ‘small’ model, the second smallest model available. Other options are yolov5n.pt, yolov5m.pt, yolov5l.pt and yolov5x.pt, along with their P6 counterparts i.e. yolov5s6.pt or you own custom training checkpoint i.e. runs/exp/weights/best.pt. For details on all available models please see our README table.

python path/to/export.py --weights yolov5s.pt --include torchscript onnx

Output:

export: data=data/coco128.yaml, weights=yolov5s.pt, imgsz=[640, 640], batch_size=1, device=cpu, half=False, inplace=False, train=False, optimize=False, int8=False, dynamic=False, simplify=False, opset=12, verbose=False, workspace=4, nms=False, agnostic_nms=False, topk_per_class=100, topk_all=100, iou_thres=0.45, conf_thres=0.25, include=['torchscript', 'onnx']
YOLOv5 🚀 v6.0-241-gb17c125 torch 1.10.0 CPU

Fusing layers... 
Model Summary: 213 layers, 7225885 parameters, 0 gradients

PyTorch: starting from yolov5s.pt (14.7 MB)

TorchScript: starting export with torch 1.10.0...
TorchScript: export success, saved as yolov5s.torchscript (29.4 MB)

ONNX: starting export with onnx 1.10.2...
ONNX: export success, saved as yolov5s.onnx (29.3 MB)

Export complete (7.63s)
Results saved to /Users/glennjocher/PycharmProjects/yolov5
Detect:          python detect.py --weights yolov5s.onnx
PyTorch Hub:     model = torch.hub.load('ultralytics/yolov5', 'custom', 'yolov5s.onnx')
Validate:        python val.py --weights yolov5s.onnx
Visualize:       https://netron.app

The 3 exported models will be saved alongside the original PyTorch model:
在这里插入图片描述

Netron Viewer is recommended for visualizing exported models:
在这里插入图片描述

Example Usage of exported models

export.py will show Usage examples for the last export format indicated. For example for ONNX:

detect.py runs inference on exported models:

python path/to/detect.py --weights yolov5s.pt                 # PyTorch
                                   yolov5s.torchscript        # TorchScript
                                   yolov5s.onnx               # ONNX Runtime or OpenCV DNN with --dnn
                                   yolov5s.xml                # OpenVINO
                                   yolov5s.engine             # TensorRT
                                   yolov5s.mlmodel            # CoreML (macOS only)
                                   yolov5s_saved_model        # TensorFlow SavedModel
                                   yolov5s.pb                 # TensorFlow GraphDef
                                   yolov5s.tflite             # TensorFlow Lite
                                   yolov5s_edgetpu.tflite     # TensorFlow Edge TPU

val.pyruns validation on exported models:

python path/to/val.py --weights yolov5s.pt                 # PyTorch
                                yolov5s.torchscript        # TorchScript
                                yolov5s.onnx               # ONNX Runtime or OpenCV DNN with --dnn
                                yolov5s.xml                # OpenVINO
                                yolov5s.engine             # TensorRT
                                yolov5s.mlmodel            # CoreML (macOS Only)
                                yolov5s_saved_model        # TensorFlow SavedModel
                                yolov5s.pb                 # TensorFlow GraphDef
                                yolov5s.tflite             # TensorFlow Lite
                                yolov5s_edgetpu.tflite     # TensorFlow Edge TPU

OpenCV DNN C++

Examples of YOLOv5 OpenCV DNN C++ inference on exported ONNX models can be found at

https://github.com/Hexmagic/ONNX-yolov5/blob/master/src/test.cpp
https://github.com/doleron/yolov5-opencv-cpp-python

Environments

YOLOv5 may be run in any of the following up-to-date verified environments (with all dependencies including CUDA/CUDNN, Python and PyTorch preinstalled):

  • Google Colab and Kaggle notebooks with free GPU: Open In Colab Open In Kaggle

  • Google Cloud Deep Learning VM. See GCP Quickstart Guide

  • Amazon Deep Learning AMI. See AWS Quickstart Guide

  • Docker Image. See Docker Quickstart Guide Docker Pulls

Status

If this badge is green, all YOLOv5 GitHub Actions Continuous Integration (CI) tests are currently passing. CI tests verify correct operation of YOLOv5 training (train.py), validation (val.py), inference (detect.py) and export (export.py) on MacOS, Windows, and Ubuntu every 24 hours and on every commit.

def parse_opt(): """ weights: 要转换的权重文件pt地址 默认='../weights/best.pt' img-size: 输入模型的图片size=(height, width) 默认=[640, 640] batch-size: batch大小 默认=1 device: 模型运行设备 cuda device, i.e. 0 or 0,1,2,3 or cpu 默认=cpu include: 要将pt文件转为什么格式 可以为单个原始也可以为list 默认=['torchscript', 'onnx', 'coreml'] half: 是否使用半精度FP16export转换 默认=False inplace: 是否set YOLOv5 Detect() inplace=True 默认=False train: 是否开启model.train() mode 默认=True coreml转换必须为True optimize: TorchScript转化参数 是否进行移动端优化 默认=False dynamic: ONNX转换参数 dynamic_axes ONNX转换是否要进行批处理变量 默认=False simplify: ONNX转换参数 是否简化onnx模型 默认=False opset-version: ONNX转换参数 设置版本 默认=10 """ parser = argparse.ArgumentParser() parser.add_argument('--weights', type=str, default='../weights/best.pt', help='weights path') parser.add_argument('--img-size', nargs='+', type=int, default=[640, 640], help='image (height, width)') parser.add_argument('--batch-size', type=int, default=1, help='batch size') parser.add_argument('--device', default='cpu', help='cuda device, i.e. 0 or 0,1,2,3 or cpu') parser.add_argument('--include', nargs='+', default=['torchscript', 'onnx', 'coreml'], help='include formats') parser.add_argument('--half', action='store_true', help='FP16 half-precision export') parser.add_argument('--inplace', action='store_true', help='set YOLOv5 Detect() inplace=True') parser.add_argument('--train', default="True", action='store_true', help='model.train() mode') parser.add_argument('--optimize', action='store_true', help='TorchScript: optimize for mobile') parser.add_argument('--dynamic', action='store_true', help='ONNX: dynamic axes') parser.add_argument('--simplify', action='store_true', help='ONNX: simplify model') parser.add_argument('--opset-version', type=int, default=10, help='ONNX: opset version') opt = parser.parse_args() return opt 解析
最新发布
04-01
<think>好的,用户让我解析一个名为parse_opt的Python函数,看起来是关于参数解析的,特别是针对模型转换的选项。首先,我需要仔细阅读用户提供的代码注释,理解每个参数的作用以及整个函数的结构。 首先,用户给出的代码是使用argparse模块来解析命令行参数的函数。这个函数定义了一些参数,比如权重文件路径、图片尺寸、批处理大小等,这些参数用于模型转换的不同方面,比如导出为TorchScript、ONNXCoreML格式。用户可能希望了解这个函数的具体功能、每个参数的意义,以及可能的使用场景或问题。 接下来,我需要检查用户的问题是否还有其他隐含需求。例如,用户可能在使用这个函数时遇到了问题,或者需要进一步优化参数设置,或者对某些参数的具体作用不太清楚。比如,注释中提到coreml转换必须将train设置为True,但代码中default="True",而action='store_true',这里可能存在矛盾,因为action='store_true'通常意味着默认是False,除非在命令行中指定。用户可能在这里有疑问,或者这是一个错误,需要指出。 另外,用户提供的代码中有一些参数设置可能需要进一步解释,例如--include参数接受列表,而默认值是一个包含多种格式的列表。需要说明如何正确使用这个参数,比如在命令行中输入时的格式。同时,像--half参数使用action='store_true',意味着它是一个标志,不需要额外值,用户可能需要知道如何启用FP16半精度转换。 还要注意参数的类型默认值是否符合预期,例如--img-size的参数类型是int,nargs='+'表示可以接受多个值,但默认是[640,640],这对应图片的高度宽度。需要确认用户是否理解nargs的作用,以及如何正确传递这个参数。 此外,用户可能希望了解如何调用这个函数,如何处理解析后的参数对象opt,以及这些参数如何被后续的模型转换代码使用。可能需要提供一个使用示例,比如在命令行中运行脚本时如何指定各个参数,或者如何在Python脚本中传递这些参数。 最后,用户可能希望得到一些常见问题的解答,比如参数冲突、默认值是否合理,或者某些参数在不同格式转换中的必要性。例如,为什么CoreML转换需要train=True,或者动态轴(dynamic)在ONNX转换中的作用是什么。 总结来说,用户需要这个函数的详细解析,包括每个参数的意义、使用方法、可能的注意事项以及代码中的潜在问题。同时,可能需要指出代码中的问题,比如--train参数的默认值设置是否正确,并给出修正建议。此外,提供使用示例常见问题解答会更有帮助,确保用户能够正确应用这个函数进行模型转换。</think>以下是对 `def parse_opt():` 函数的逐行解析与功能说明: --- ### **函数功能概述** 此函数用于**解析命令行参数**,主要用于将YOLOv5模型(或其他PyTorch模型)转换为多种格式(如TorchScript、ONNXCoreML等)。它是模型导出工具的核心参数配置模块。 --- ### **参数详解** #### **1. 基础参数** - **`--weights`** - **类型**:`str` - **默认值**:`'../weights/best.pt'` - **作用**:指定要转换的模型权重文件路径(`.pt`文件)。 - **示例**:`python export.py --weights ./yolov5s.pt` - **`--img-size`** - **类型**:`int`(接受多个值) - **默认值**:`[640, 640]` - **作用**:定义输入模型的图像尺寸,格式为 `[height, width]`。 - **注意**:使用 `nargs='+'` 允许输入多个值,例如:`--img-size 640 640`。 - **`--batch-size`** - **类型**:`int` - **默认值**:`1` - **作用**:设置批量推理时的批次大小。 - **`--device`** - **类型**:`str` - **默认值**:`'cpu'` - **作用**:指定模型运行的设备,支持CPU或CUDA设备(如 `--device 0` 表示使用第一块GPU)。 --- #### **2. 格式转换控制** - **`--include`** - **类型**:`list`(接受多个值) - **默认值**:`['torchscript', 'onnx', 'coreml']` - **作用**:指定要导出的模型格式,支持多选。 - **可选值**:`torchscript`, `onnx`, `coreml`, `tflite`等(需代码支持)。 - **示例**:`--include onnx coreml` 仅导出ONNXCoreML格式。 - **`--half`** - **类型**:`布尔标志`(无需值) - **默认**:`False` - **作用**:启用FP16半精度导出,可减少模型大小并提升推理速度(需硬件支持)。 - **启用示例**:`--half` --- #### **3. 模型结构优化参数** - **`--inplace`** - **类型**:`布尔标志` - **默认**:`False` - **作用**:设置YOLOv5的 `Detect()` 层 `inplace=True`,优化内存占用(可能影响某些导出格式兼容性)。 - **`--train`** - **类型**:`布尔标志` - **默认**:`True`(代码中实际默认值存在问题,见下文“注意事项”) - **作用**:保持模型处于训练模式(`model.train()`),CoreML导出时必须为 `True`。 - **冲突说明**:若导出为推理格式(如ONNX),通常需设置为 `False`。 --- #### **4. 格式专属参数** - **`--optimize`**(TorchScript专用) - **类型**:`布尔标志` - **默认**:`False` - **作用**:对TorchScript模型进行移动端优化(如算子融合)。 - **`--dynamic`**(ONNX专用) - **类型**:`布尔标志` - **默认**:`False` - **作用**:允许ONNX输入尺寸动态变化(如动态批次大小),适用于可变输入场景。 - **示例**:`--dynamic` 允许批处理维度动态调整。 - **`--simplify`**(ONNX专用) - **类型**:`布尔标志` - **默认**:`False` - **作用**:使用ONNX Simplifier工具简化模型结构,移除冗余算子。 - **`--opset-version`**(ONNX专用) - **类型**:`int` - **默认**:`10` - **作用**:指定导出的ONNX版本,不同版本影响算子兼容性(如ONNX Runtime版本需匹配)。 --- ### **代码问题与注意事项** 1. **`--train` 参数默认值错误** - **问题**:代码中 `default="True"` 与 `action='store_true'` 冲突。 - **解释**:`action='store_true'` 表示参数默认为 `False`,仅在命令行显式指定时才为 `True`。 - **修复建议**:删除 `default="True"`,直接写 `action='store_true'`。 2. **CoreML导出强制要求 `--train=True`** - 若导出CoreML格式,需在命令行显式添加 `--train`,否则可能报错。 3. **动态批处理与ONNX** - 若启用 `--dynamic`,需确保推理框架(如TensorRT)支持动态形状。 --- ### **使用示例** ```bash # 导出ONNXTorchScript模型,使用GPU且启用半精度 python export.py \ --weights ../weights/best.pt \ --img-size 640 640 \ --device 0 \ --include onnx torchscript \ --half \ --dynamic \ --simplify ``` --- ### **关键参数组合场景** | **场景** | **参数组合** | |------------------------|---------------------------------------------| | 移动端部署TorchScript | `--include torchscript --optimize` | | 服务端ONNX动态批处理 | `--include onnx --dynamic --batch-size 16` | | iOS CoreML导出 | `--include coreml --train` | 通过合理配置参数,可适配不同硬件部署环境需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

【网络星空】

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值