实战指南:从 PyTorch 到 ONNX、TensorRT、CoreML 等多格式部署)
基于 YOLOv10/Ultralytics 的模型导出Export实战指南从 PyTorch 到 ONNX、TensorRT、CoreML 等多格式部署【免费下载链接】yolov10YOLOv10: Real-Time End-to-End Object Detection [NeurIPS 2024]项目地址: https://gitcode.com/GitHub_Trending/yo/yolov10YOLOv10 是端到端End-to-End实时目标检测模型训练完成后必须将其导出为适合目标平台的推理格式才能真正落地部署。本文以仓库中的官方导出指南docs/en/modes/export.md为骨架结合导出器源码ultralytics/engine/exporter.py与配置ultralytics/cfg/default.yaml系统讲解 YOLOv10 模型导出的原理、参数与全部支持格式帮助你把训练好的.pt模型一键转换为 ONNX、TensorRT、CoreML、OpenVINO、TensorFlow Lite 等生产可用格式并掌握每种格式的参数取舍与部署建议。为什么需要 Export 模式模型训练的最终目标是将其部署到真实业务中。Export 模式正是连接训练与部署的桥梁它把 PyTorch 训练得到的.pt权重转换为各种推理框架与硬件平台能够直接加载的格式。选择 Export 模式的核心收益通用性Versatility一次训练可导出 ONNX、TensorRT、CoreML、OpenVINO、TensorFlow SavedModel、NCNN、PaddlePaddle 等多种格式覆盖云端 GPU、服务器 CPU、移动端与边缘设备性能Performance官方指南指出导出到 ONNX 或 OpenVINO 可获得最高 3 倍 CPU 推理加速导出到 TensorRT 可获得最高 5 倍 GPU 推理加速兼容性Compatibility让同一个模型可以在不同硬件和软件环境中通用部署易用性Ease of Use仅需一行 Python 或 CLI 命令即可完成导出。导出模式的突出特性一键导出One-Click Export简单命令即可导出到任意目标格式批量导出Batch Export可导出支持批量推理batch inference的模型推理优化Optimized Inference导出产物针对快速推理做了优化如算子融合、图简化、量化教程视频与文档官方提供配套的导出与部署教程。提示源自官方文档追求 CPU 加速优先导出 ONNX 或 OpenVINO最高约 3 倍追求 GPU 加速优先导出 TensorRT最高约 5 倍。快速上手一行命令完成导出无论是使用官方预训练权重还是自训练权重导出流程完全一致。导出一个 YOLOv10n 模型到 ONNX 格式 Pythonpython from ultralytics import YOLO # 加载模型 model YOLO(yolov10n.pt) # 加载官方预训练模型 model YOLO(path/to/best.pt) # 加载自定义训练模型 # 导出模型 model.export(formatonnx) CLIbash yolo export modelyolov10n.pt formatonnx # 导出官方模型 yolo export modelpath/to/best.pt formatonnx # 导出自定义训练模型 YOLO类位于 ultralytics/models/yolov10/model.py其task_map中定义了检测任务的导出默认组件model.export()内部最终都会路由到 ultralytics/engine/exporter.py 中的Exporter.__call__统一处理。从源码看Exporter.__call__exporter.py#L168-L334会依次完成格式别名归一化、设备选择、模型冻结model.float()、model.fuse()与requires_gradFalse、干跑dry run以及对应格式的导出函数调用因此无论走 Python API 还是 CLI导出的行为完全一致。导出完成后控制台会打印导出耗时、产物保存路径以及可直接复用的yolo predict/yolo val命令源码见 exporter.py#L325-L330。导出参数详解以下参数来自官方文档并已与 ultralytics/cfg/default.yamldefault.yaml#L80-L88及导出器源码核对是控制导出产物性能、体积与兼容性的关键参数类型默认值说明formatstrtorchscript导出目标格式如onnx、torchscript、tensorflow、engine、coreml等决定最终产物的部署环境兼容性imgszint或tuple640模型输入图像尺寸。整数表示正方形如640元组(height, width)指定宽高kerasboolFalse导出 TensorFlow SavedModel 时使用 Keras 格式便于 TensorFlow Serving 与相关 API 集成optimizeboolFalse导出 TorchScript 时针对移动设备优化optimize_for_mobile可减小体积并改善性能halfboolFalse启用 FP16 半精度减小模型体积并在支持的硬件上加速推理int8boolFalse启用 INT8 量化进一步压缩模型并加速推理主要面向边缘设备精度损失较小dynamicboolFalse允许 ONNX、TensorRT 等导出动态输入尺寸增强对多变图像尺寸的灵活性simplifyboolFalse使用onnxslim简化 ONNX 计算图可能提升性能与兼容性opsetintNone指定 ONNX opset 版本以兼容不同解析器/运行时未设置时使用当前支持的最新版本workspacefloat4.0TensorRT 优化时使用的最大工作空间GB用于权衡显存占用与性能nmsboolFalse为 CoreML 导出添加非极大值抑制NMS是检测后处理的关键合理调整这些参数可以针对部署环境、硬件约束与性能目标定制导出产物在模型体积、速度与精度之间找到最优平衡。参数背后的源码行为结合 exporter.py 可以进一步理解上述参数的实际影响imgsz在Exporter.__call__中通过check_imgsz(self.args.imgsz, stridemodel.stride, min_dim2)exporter.py#L198校验并对齐到模型的 strideYOLOv10n 的网络步长为 32保证输入尺寸合法half源码提示halfTrue仅与 GPU 导出兼容CPU 上会自动回退为 False且与dynamicTrue互斥exporter.py#L194-L197optimize与ncnn格式或 CUDA 设备不兼容需在 CPU 上导出exporter.py#L199-L201dynamic动态 ONNX 导出仅在 CPU 上执行dynamicTrue only compatible with cpu并将 batch、height、width 三个维度设为动态轴exporter.py#L368-L374workspaceTensorRT 构建时通过config.max_workspace_size self.args.workspace * 1 30exporter.py#L682换算为字节数simplifyONNX 导出后使用onnxslim.slim简化计算图TensorRT 导出时源码会强制self.args.simplify Trueexporter.py#L671因为干净的计算图有利于 TensorRT 构建引擎。YOLOv10 导出时的特殊处理端到端后处理YOLOv10 是端到端模型其检测头为v10Detectultralytics/nn/modules/head.py#L497-L535。导出模式下v10Detect.forward会跳过 one2many 分支对 one2one 输出调用ops.v10postprocessultralytics/utils/ops.py#L851-L864完成 TopK 选优与类别映射直接输出[boxes, scores, labels]拼接张量——这正是 YOLOv10 无需额外 NMS 后处理的端到端特性head.py#L521-L523。导出器在冻结模型时会为v10Detect注入max_det每图最大检测数默认 300见 default.yaml#L52参数exporter.py#L232-L233该参数直接参与导出后处理的 TopK 截断。支持的导出格式一览下表整理自官方文档并已与 exporter.py#L93-L112 中export_formats()定义核对列出的参数为各格式可用的导出参数组合格式format参数导出产物以 yolov10n 为例元数据支持参数PyTorch-yolov10n.pt✅-TorchScripttorchscriptyolov10n.torchscript✅imgsz,optimizeONNXonnxyolov10n.onnx✅imgsz,half,dynamic,simplify,opsetOpenVINOopenvinoyolov10n_openvino_model/✅imgsz,half,int8TensorRTengineyolov10n.engine✅imgsz,half,dynamic,simplify,workspaceCoreMLcoremlyolov10n.mlpackage✅imgsz,half,int8,nmsTF SavedModelsaved_modelyolov10n_saved_model/✅imgsz,keras,int8TF GraphDefpbyolov10n.pb❌imgszTF Litetfliteyolov10n.tflite✅imgsz,half,int8TF Edge TPUedgetpuyolov10n_edgetpu.tflite✅imgszTF.jstfjsyolov10n_web_model/✅imgsz,half,int8PaddlePaddlepaddleyolov10n_paddle_model/✅imgszNCNNncnnyolov10n_ncnn_model/✅imgsz,half各格式的详细部署指南可参阅仓库内对应文档OpenVINO 集成指南、TensorRT 集成指南、ONNX 集成指南、CoreML 集成指南、TF Lite/Edge TPU 指南。各格式导出实现要点源码视角TorchScriptexporter.py#L336-L351通过torch.jit.trace追踪导出并把模型元数据写入config.txt附加文件optimizeTrue时调用optimize_for_mobile生成 Lite Interpreter 格式ONNXexporter.py#L353-L413依赖onnx1.12.0动态导出时 batch/高/宽三个维度被标记为动态轴导出后写入模型元数据描述、作者、版本、stride、task、batch、imgsz、names 等OpenVINOexporter.py#L415-L498需要torch1.13与openvino2024.0.0导出时写入reverse_input_channels、pad_value114、scale_values[255]等运行时信息int8True时使用 NNCF 在指定数据集data参数默认coco128.yaml上收集校准图并执行混合精度量化校准图建议超过 300 张TensorRTexporter.py#L656-L725必须先走 ONNX 中间格式再构建 engine要求 GPU 环境源码会自动将device指定为0dynamicTrue时需要同时指定更大的batch如batch16以定义动态 batch 上限FP16 构建依赖硬件支持builder.platform_has_fast_fp16CoreMLexporter.py#L583-L654不支持 WindowsnmsTrue时通过IOSDetectModel与 pipeline 为检测模型组装内置 NMS 后处理并支持 8-bit k-meansint8与 16-bithalf权重量化TF 系列exporter.py#L727-L936基于 ONNX →onnx2tf转换链路SavedModel 是基础pbGraphDef是tfjs的前置产物tflite支持 FP32/FP16/INT8 三档精度edgetpu需要 Linux 与 Edge TPU 编译器并强制 INT8PaddlePaddleexporter.py#L500-L512通过 X2Paddle 转换NCNNexporter.py#L514-L581先导出 TorchScript再调用 PNNX 生成model.ncnn.param与model.ncnn.bin适合移动端部署。导出与推理的联动导出成功后产物可直接用于推理与验证。Exporter.__call__完成时会输出对应的命令模板exporter.py#L325-L330例如# 使用导出的 ONNX 模型做预测onnxruntime 或 OpenCV DNN 均可 yolo predict modelyolov10n.onnx imgsz640 # 使用导出的 TensorRT engine 做预测需 GPU yolo predict modelyolov10n.engine imgsz640 # 验证导出模型精度注意非方形 imgsz 导出产物不适用于 val yolo val modelyolov10n.onnx datacoco.yaml imgsz640源码中的 Inference 示例还展示了每种格式对应的推理加载方式.pt走 PyTorch.torchscript走 JIT.onnx走 ONNX Runtime / OpenCV DNN_openvino_model走 OpenVINO.engine走 TensorRT.mlpackage走 CoreML仅 macOS_saved_model/.pb/.tflite/_edgetpu.tflite走 TensorFlow 系列_paddle_model走 PaddlePaddle_ncnn_model走 NCNNexporter.py#L32-L44。另外需要注意源码提示非方形imgsz如(640, 480)导出的模型无法直接用于yolo val验证需要改用imgszmax(w,h)重新导出exporter.py#L315-L321。推荐组合与部署选型建议根据官方文档的 Tips 与源码约束常见的参数组合如下CPU 服务器部署formatonnx或formatopenvino可开启simplifyTrue简化图、opset匹配运行时版本追求更高吞吐可配合dynamicTrue注意需在 CPU 上导出且不能与half同时使用NVIDIA GPU 部署formatengine显存充足时适当调大workspace硬件支持时开启halfTrue需要动态 batch 时同时设置dynamicTrue batch16之类较大 batch移动端 / 边缘设备formattflite或formatncnn可开启int8True量化压缩体积Edge TPU 设备需在 Linux 下导出formatedgetpuApple 生态iOS/macOSformatcoreml检测任务建议开启nmsTrue以便在端侧完成后处理并可配合halfTrue或int8True量化。总结Export 模式把 YOLOv10 从训练框架无缝衔接到生产部署通过统一的model.export(format...)接口一套权重即可覆盖从 NVIDIA TensorRTGPU 高性能、ONNX/OpenVINOCPU 加速到 CoreML/TFLite/NCNN移动与边缘的全谱系部署场景。关键参数imgsz、half、int8、dynamic、simplify、workspace、nms的组合选择决定了最终产物在体积、速度、精度与兼容性之间的平衡而 YOLOv10 端到端检测头v10Detectv10postprocess在导出时已将后处理内嵌为模型输出进一步简化了部署侧的推理代码。掌握本指南后你可以根据目标硬件环境用最少的配置导出最合适的部署格式并通过yolo predict/yolo val立即验证导出产物的效果。如需在导出后进一步对比各格式的精度与延迟表现可继续阅读仓库中的 Benchmark 模式指南用数据为你的部署选型决策提供支撑。【免费下载链接】yolov10YOLOv10: Real-Time End-to-End Object Detection [NeurIPS 2024]项目地址: https://gitcode.com/GitHub_Trending/yo/yolov10创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考