Ultralyticsを使用してYOLO PyTorch エクスポートする方法
PyTorch 本番環境にデプロイする場合、通常はターゲットごとに異なるエクスポーターを使い分ける必要があります: torch.onnx.export ONNXについては、 coremltools Apple製デバイスについては、 onnx2tf TensorFlowについては、 pnnx NCNN。各ツールには、独自のAPI、依存関係の特性、および出力形式の規則があります。
Ultralytics 、複数のバックエンドを単一の統一されたインターフェースで統合したスタンドアロン型のエクスポートユーティリティUltralytics 。あらゆるデータをエクスポートすることが可能です。 torch.nn.Module、以下を含む ティム 画像モデル、 トーチビジョン 分類器や検出器、あるいは独自のアーキテクチャを、 ONNX, TorchScript, OpenVINO, CoreML, NCNN, PaddlePaddle, MNN, ExecuTorch、および TensorFlow SavedModel 個々のバックエンドを個別に学習することなく。
YOLO Ultralytics 理由は?
- 10種類のフォーマットに対応する単一のAPI:12種類もの呼び出し規約を覚える必要はなく、1つだけ覚えれば済みます。
- 共用設備面: エクスポートヘルパーは以下の場所に配置されています
ultralytics.utils.exportそのため、バックエンドのパッケージをインストールすれば、フォーマットを問わず同じ呼び出しパターンを維持できます。 - YOLO と同じコードパス: Ultralytics すべてのYOLO 、同じヘルパー機能によって実現されています。
- 対応フォーマット(OpenVINO、CoreML、MNN、NCNN)には、FP16およびINT8の量子化機能が組み込まれています。
- CPUで動作します:エクスポート処理自体にはGPU 、どのノートパソコンでもローカルで実行できます。
クイックスタート
最も手っ取り早い方法は、2行のエクスポートです。 ONNX YOLO 、それ以外の設定も一切不要で pip install ultralytics onnx timm:
import timm
import torch
from ultralytics.utils.export import torch2onnx
model = timm.create_model("resnet18", pretrained=True).eval()
torch2onnx(model, torch.randn(1, 3, 224, 224), output_file="resnet18.onnx")
サポートされているエクスポート形式
The torch2* 関数は標準の torch.nn.Module および入力tensor例。MNN、TF SavedModel、TF Graphは、ONNX Kerasの中間アーティファクトを経由します。いずれの場合も、YOLO属性は不要です。
| 形式 | 機能 | インストール | 出力 |
|---|---|---|---|
| ONNX | torch2onnx() | pip install onnx | .onnx ファイル |
| TorchScript | torch2torchscript() | PyTorchに同梱されています | .torchscript ファイル |
| OpenVINO | torch2openvino() | pip install openvino | _openvino_model/ ディレクトリ |
| CoreML | torch2coreml() | pip install coremltools | .mlpackage |
| TF SavedModel | onnx2saved_model() | 詳細な要件については以下をご覧ください | _saved_model/ ディレクトリ |
| TF | keras2pb() | 詳細な要件については以下をご覧ください | .pb ファイル |
| NCNN | torch2ncnn() | pip install ncnn pnnx | _ncnn_model/ ディレクトリ |
| MNN | onnx2mnn() | pip install MNN | .mnn ファイル |
| PaddlePaddle | torch2paddle() | pip install paddlepaddle x2paddle | _paddle_model/ ディレクトリ |
| ExecuTorch | torch2executorch() | pip install executorch | _executorch_model/ ディレクトリ |
中間形式ONNX
MNN、 TF SavedModel、およびTF Graphのエクスポートは、中間ステップONNX を経由します。ONNX にエクスポートし、その後変換を行ってください。
メタデータの埋め込み
いくつかのエクスポート関数では、オプションの metadata 辞書(例: torch2torchscript(..., metadata={"author": "me"})) フォーマットが対応している場合、エクスポートされた成果物にカスタムなキー・値ペアを埋め込む機能。
ステップバイステップの例
以下のすべての例では、timm から取得した評価モードの事前学習済み ResNet-18 を使用しています:
import timm
import torch
model = timm.create_model("resnet18", pretrained=True).eval()
im = torch.randn(1, 3, 224, 224)
必ず電話してください model.eval() エクスポートする前に
中退、 バッチ正規化、およびその他の列車専用レイヤーは、推論中に異なる挙動を示します。スキップ .eval() 不正な出力を含むエクスポートを生成します。
ONNXへのエクスポート
from ultralytics.utils.export import torch2onnx
torch2onnx(model, im, output_file="resnet18.onnx")
動的なバッチサイズを設定するには、 dynamic 辞書:
torch2onnx(model, im, output_file="resnet18_dyn.onnx", dynamic={"images": {0: "batch_size"}})
デフォルトのopsetは 14 また、デフォルトの入力名は "images". 以下の設定で上書きします opset, input_names、または output_names 議論。
TorchScriptにエクスポート
追加の依存関係は不要です。使用方法 torch.jit.trace 内部構造。
from ultralytics.utils.export import torch2torchscript
torch2torchscript(model, im, output_file="resnet18.torchscript")
OpenVOpenVINOへエクスポート
from ultralytics.utils.export import torch2openvino
ov_model = torch2openvino(model, im, output_dir="resnet18_openvino_model")
このディレクトリには、固定名の model.xml および model.bin ペア:
resnet18_openvino_model/
├── model.xml
└── model.bin
スキップ dynamic=True 動的な入力形状の場合、 half=True FP16用、または int8=True INT8量子化の場合。INT8ではさらに、 calibration_dataset 引数。
必要条件 openvino>=2024.0.0 (または >=2025.2.0 macOS 15.4以降)および torch>=2.1.
CoreMLにエクスポート
import coremltools as ct
from ultralytics.utils.export import torch2coreml
inputs = [ct.TensorType("input", shape=(1, 3, 224, 224))]
ct_model = torch2coreml(model, inputs, im, output_file="resnet18.mlpackage")
次の場合 分類 モデルに対して、クラス名のリストを渡す classifier_names CoreML に分類ヘッダーを追加する。
必要条件 coremltools>=9.0, torch>=1.11、および numpy<=2.3.5. Windowsではサポートされていません。
BlobWriter not loaded エラー
coremltools>=9.0 macOS および Linux では、Python .Python ~3.13 向けに wheels 形式で提供されます。それより新しいPython では、ネイティブ C 拡張モジュールが読み込まれません。CoreML にはPython .Python ~3.13 を使用してください。
TensorFlow SavedModelにエクスポート
TF SavedModel 、中間ONNX を経由します:
from ultralytics.utils.export import onnx2saved_model, torch2onnx
torch2onnx(model, im, output_file="resnet18.onnx")
keras_model = onnx2saved_model("resnet18.onnx", output_dir="resnet18_saved_model")
この関数はKerasモデルを返すほか、TFLite 生成します(.tflite) 出力ディレクトリ内に:
resnet18_saved_model/
├── saved_model.pb
├── variables/
├── resnet18_float32.tflite
├── resnet18_float16.tflite
└── resnet18_int8.tflite
要件:
tensorflow>=2.0.0,<=2.19.0onnx2tf>=1.26.3,<1.29.0tf_keras<=2.19.0sng4onnx>=1.0.1onnx_graphsurgeon>=0.3.26(以下のコマンドでインストールしてください--extra-index-url https://pypi.ngc.nvidia.com)ai-edge-litert>=1.2.0,<1.4.0macOS では (ai-edge-litert>=1.2.0(他のプラットフォームでは)onnxslim>=0.1.71onnx>=1.12.0,<2.0.0protobuf>=5
TensorFlow にエクスポート
前述のSavedModel に続き、返されたKerasモデルをfrozenに変換します .pb グラフ:
from pathlib import Path
from ultralytics.utils.export import keras2pb
keras2pb(keras_model, output_file=Path("resnet18_saved_model/resnet18.pb"))
NCNNへエクスポート
from ultralytics.utils.export import torch2ncnn
torch2ncnn(model, im, output_dir="resnet18_ncnn_model")
このディレクトリには、固定名のparamファイルとbinファイル、およびPython が含まれています:
resnet18_ncnn_model/
├── model.ncnn.param
├── model.ncnn.bin
└── model_ncnn.py
torch2ncnn() ~を確認する ncnn および pnnx 初回使用時。
MNNにエクスポート
MNNのエクスポートには、ONNX が入力として必要です。ONNX 形式でエクスポートしてから、変換を行ってください:
from ultralytics.utils.export import onnx2mnn, torch2onnx
torch2onnx(model, im, output_file="resnet18.onnx")
onnx2mnn("resnet18.onnx", output_file="resnet18.mnn")
対応 half=True FP16および int8=True INT8量子化用。必要条件: MNN>=2.9.6 および torch>=1.10.
PPaddlePaddlePaddleにエクスポート
from ultralytics.utils.export import torch2paddle
torch2paddle(model, im, output_dir="resnet18_paddle_model")
このディレクトリには、PaddlePaddle とパラメータファイルが含まれています:
resnet18_paddle_model/
├── model.pdmodel
└── model.pdiparams
必要条件 x2paddle およびお使いのプラットフォームに適したPaddlePaddle :
paddlepaddle-gpu>=3.0.0,<3.3.0CUDAについてpaddlepaddle==3.0.0ARM64CPU上でpaddlepaddle>=3.0.0,<3.3.0他のCPUでは
NVIDIA ではサポートされていません。
ExecuTorch にエクスポート
from ultralytics.utils.export import torch2executorch
torch2executorch(model, im, output_dir="resnet18_executorch_model")
エクスポートされた .pte ファイルは出力ディレクトリ内に保存されます:
resnet18_executorch_model/
└── model.pte
必要条件 torch>=2.9.0 および対応するExecuTorchランタイム(pip install executorch). 実行時の使用方法については、 ExecuTorchとの連携.
エクスポートしたモデルを確認してください
エクスポート後、本番環境へデプロイする前に、元のPyTorch との数値の一致を確認してください。簡単な動作確認として ONNXBackend from ultralytics.nn.backends 出力を比較し、トレースエラーや量子化エラーを早期に検出します:
import numpy as np
import timm
import torch
from ultralytics.nn.backends import ONNXBackend
model = timm.create_model("resnet18", pretrained=True).eval()
im = torch.randn(1, 3, 224, 224)
with torch.no_grad():
pytorch_output = model(im).numpy()
onnx_model = ONNXBackend("resnet18.onnx", device=torch.device("cpu"))
onnx_output = onnx_model.forward(im)[0]
diff = np.abs(pytorch_output - onnx_output).max()
print(f"Max difference: {diff:.6f}") # should be < 1e-5
予想される差
FP32形式でのエクスポートの場合、絶対差の最大値は以下以下である必要があります 1e-5. 差が大きい場合は、サポートされていない演算、入力形状の不一致、またはモデルが評価モードになっていないことが原因である可能性があります。FP16およびINT8のエクスポートでは許容誤差が広くなっています。ランダムなテンソルではなく、実際のデータで検証してください。
他のランタイムでは、tensor 異なる場合があります。たとえば、OpenVINO、モデルのフォワード引数の名前(通常は x (汎用モデルの場合)、一方で torch2onnx デフォルトでは "images".
既知の制限事項
- マルチ入力の対応状況にばらつきがある:
torch2onnxおよびtorch2openvino複数の入力を持つモデルについては、例となるテンソルのタプルまたはリストを受け付けます。torch2torchscript,torch2coreml,torch2ncnn,torch2paddle、およびtorch2executorch単一の入力tensor想定する。 - ExecuTorchには以下が必要です
flatc: ExecuTorchランタイムにはFlatBuffersコンパイラが必要です。以下のコマンドでインストールしてください。brew install flatbuffersmacOS またはapt install flatbuffers-compilerUbuntu上で。 - Ultralyticsによる推論は行わない: エクスポートされたYOLO 、
YOLO()推論のために。各フォーマットにはネイティブランタイムを使用してください(ONNX, OpenVINOなど)。 - YOLOフォーマット:Axeleraおよび Sony IMX500のエクスポートには、YOLOモデル属性が必要であり、汎用モデルでは利用できません。
- プラットフォーム固有のフォーマット: TensorRT NVIDIA GPUが必要です。 RKNN には、
rknn-toolkit2SDK(Linuxのみ)。 Edge TPU には、edgetpu_compilerバイナリ(Linuxのみ)。
よくある質問
Ultralyticsではどのようなモデルをエクスポートできますか?
いずれか torch.nn.Moduleこれには、timmやtorchvisionのモデル、あるいは任意のカスタムPyTorch が含まれます。モデルは評価モードである必要があります(model.eval()) エクスポート前に。ONNX OpenVINO ONNX 、マルチ入力モデル向けにサンプルテンソルのタプルOpenVINO 受け付けます。
GPUがなくても動作するエクスポート形式はどれですか?
サポートされているすべての形式(TorchScript、ONNX、OpenVINO、CoreML、TF SavedModel、TF Graph、NCNN、PaddlePaddle、MNN、ExecuTorch)は、CPUエクスポート可能です。エクスポート処理自体にはGPU 。NVIDIA GPUが必要となるのはTensorRT 。
Ultralytics が必要ですか?
Ultralyticsを使用する >=8.4.38、これには以下のものが含まれます ultralytics.utils.export モジュールおよび標準化された output_file/output_dir 議論。
TorchVisionモデルをCoreML にエクスポートしてCoreML iOS CoreML iOS できますか?
はい。torchvisionの分類器、検出器、およびセグメンテーションモデルは、 .mlpackage 経由 torch2coreml. 画像分類モデルの場合は、クラス名のリストを classifier_names 分類ヘッドで実行します。エクスポートはmacOSまたはLinux上で実行してください。WindowsではCoreML サポートCoreML 。詳しくは CoreML iOS へのiOS 詳細については。
エクスポートしたモデルをINT8またはFP16で量子化することはできますか?
はい、いくつかの形式に対応しています。パス half=True FP16用、または int8=True OpenVINO、CoreML、MNN、NCNNへエクスポートする際はINT8を使用してください。OpenVINO でINT8を使用する場合、OpenVINO calibration_dataset 引数 トレーニング後の量子化各フォーマットの統合ページを参照して、量子化に伴うトレードオフを確認してください。