Link to this sectionUltralyticsを使用した非YOLO PyTorchモデルのエクスポート方法#
PyTorchモデルを本番環境にデプロイする場合、通常はターゲットごとに異なるエクスポートツールを使い分ける必要があります。ONNXにはtorch.onnx.export、Appleデバイスにはcoremltools、TensorFlowにはonnx2tf、NCNNにはpnnxなどです。各ツールには独自のAPI、依存関係の癖、出力形式のルールがあります。
Ultralytics ships standalone export utilities that wrap multiple backends behind one consistent interface. You can export any torch.nn.Module, including timm image models, torchvision classifiers and detectors, or your own custom architectures, to ONNX, TorchScript, OpenVINO, CoreML, NCNN, PaddlePaddle, MNN, ExecuTorch, and TensorFlow SavedModel without learning each backend separately.
Link to this sectionなぜ非YOLOのエクスポートにUltralyticsを使用するのか?#
- 10種類のフォーマットで共通のAPI: 多数の呼び出し規約を覚える必要はなく、一つ覚えれば済みます。
- 共通のユーティリティインターフェース: エクスポートヘルパーは
ultralytics.utils.exportの下にあるため、バックエンドパッケージがインストールされていれば、どのフォーマットでも同じ呼び出しパターンを維持できます。 - YOLOエクスポートと同じコードパス: すべてのUltralytics YOLOエクスポートを駆動しているのと同じヘルパーを使用しています。
- FP16およびINT8量子化: 対応しているフォーマット(OpenVINO、CoreML、MNN、NCNN)では組み込まれています。
- CPUで動作: エクスポート手順自体にGPUは不要なため、どのノートPCでもローカルで実行できます。
Link to this sectionクイックスタート#
The fastest path is a two-line export to ONNX with no YOLO code and no setup beyond 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")Link to this sectionサポートされているエクスポート形式#
torch2*関数は、標準のtorch.nn.Moduleと入力テンソルの例を受け取ります。MNN、TF SavedModel、TF Frozen 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 Frozen Graph | 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/ディレクトリ |
MNN、TF SavedModel、およびTF Frozen Graphのエクスポートは、中間ステップとしてONNXを経由します。まずONNXにエクスポートしてから変換してください。
いくつかのエクスポート関数はオプションのmetadata辞書(例:torch2torchscript(..., metadata={"author": "me"}))を受け取り、フォーマットが対応している場合にエクスポートされた成果物にカスタムのキー・値ペアを埋め込みます。
Link to this sectionステップバイステップの例#
以下のすべての例では、timmの事前学習済みResNet-18を評価モードで使用する同じセットアップを行います:
import timm
import torch
model = timm.create_model("resnet18", pretrained=True).eval()
im = torch.randn(1, 3, 224, 224)ドロップアウト、バッチ正規化、およびその他の学習用レイヤーは、推論時に異なる動作をします。.eval()をスキップすると、不正確な出力を持つエクスポート結果になります。
Link to this sectionONNXへのエクスポート#
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引数でオーバーライドできます。
Link to this sectionTorchScriptへのエクスポート#
追加の依存関係は不要です。内部でtorch.jit.traceを使用します。
from ultralytics.utils.export import torch2torchscript
torch2torchscript(model, im, output_file="resnet18.torchscript")Link to this sectionOpenVINOへのエクスポート#
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、FP16にはhalf=True、INT8量子化にはint8=Trueを渡します。INT8にはさらにcalibration_dataset引数が必要です。
openvino>=2024.0.0(macOS 15.4+では>=2025.2.0)およびtorch>=2.1が必要です。
Link to this sectionCoreMLへのエクスポート#
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ではサポートされていません。
coremltools>=9.0は、macOSおよびLinux用のPython 3.10–3.13向けホイールを提供しています。新しいPythonバージョンでは、ネイティブC拡張機能のロードに失敗します。CoreMLエクスポートにはPython 3.10–3.13を使用してください。
Link to this sectionTensorFlow 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でインストール)- macOSでは
ai-edge-litert>=1.2.0,<1.4.0(他のプラットフォームではai-edge-litert>=1.2.0) onnxslim>=0.1.71onnx>=1.12.0,<2.0.0protobuf>=5
Link to this sectionTensorFlow Frozen Graphへのエクスポート#
上記のSavedModelエクスポートに続き、返されたKerasモデルをフリーズされた.pbグラフに変換します:
from pathlib import Path
from ultralytics.utils.export import keras2pb
keras2pb(keras_model, output_file=Path("resnet18_saved_model/resnet18.pb"))Link to this sectionNCNNへのエクスポート#
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.pytorch2ncnn()は初回使用時にncnnとpnnxを確認します。
Link to this sectionMNNへのエクスポート#
MNNエクスポートには入力としてONNXファイルが必要です。まずONNXにエクスポートしてから変換してください:
from ultralytics.utils.export import onnx2mnn, torch2onnx
torch2onnx(model, im, output_file="resnet18.onnx")
onnx2mnn("resnet18.onnx", output_file="resnet18.mnn")FP16のhalf=TrueとINT8量子化のint8=Trueをサポートしています。MNN>=2.9.6とtorch>=1.10が必要です。
Link to this sectionPaddlePaddleへのエクスポート#
from ultralytics.utils.export import torch2paddle
torch2paddle(model, im, output_dir="resnet18_paddle_model")ディレクトリには、PaddlePaddleモデルとパラメータファイルが含まれています:
resnet18_paddle_model/
├── model.pdmodel
└── model.pdiparamsx2paddleおよび使用するプラットフォームに適したPaddlePaddleディストリビューションが必要です:
- CUDA上の
paddlepaddle-gpu>=3.0.0,<3.3.0 - ARM64 CPU上の
paddlepaddle==3.0.0 - その他のCPU上の
paddlepaddle>=3.0.0,<3.3.0
NVIDIA Jetsonではサポートされていません。
Link to this sectionExecuTorchへのエクスポート#
from ultralytics.utils.export import torch2executorch
torch2executorch(model, im, output_dir="resnet18_executorch_model")エクスポートされた .pte ファイルは、出力ディレクトリ内に保存されます。
resnet18_executorch_model/
└── model.ptetorch>=2.9.0 と、それに対応する ExecuTorch ランタイム (pip install executorch) が必要です。ランタイムの使用方法については、ExecuTorch の統合を参照してください。
Link to this sectionエクスポートしたモデルの検証#
After exporting, verify numerical parity with the original PyTorch model before shipping. A quick smoke test with ONNXBackend from ultralytics.nn.backends compares outputs and flags tracing or quantization errors early:
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(im)[0]
diff = np.abs(pytorch_output - onnx_output).max()
print(f"Max difference: {diff:.6f}") # should be < 1e-5FP32 エクスポートの場合、最大絶対誤差は 1e-5 未満である必要があります。これより大きい差がある場合は、サポートされていない演算、正しくない入力形状、またはモデルが評価モードになっていない可能性があります。FP16 および INT8 エクスポートでは、許容範囲がより広くなります。ランダムなテンソルではなく、実際のデータで検証してください。
他のランタイムでは、入力テンソル名が異なる場合があります。例えば OpenVINO はモデルの順伝播引数名(通常、汎用モデルでは x)を使用しますが、torch2onnx はデフォルトで "images" となります。
Link to this section既知の制限事項#
- マルチ入力サポートの不一致:
torch2onnxおよびtorch2openvinoは、複数の入力を持つモデルに対してサンプルテンソルのタプルまたはリストを受け付けます。一方、torch2torchscript、torch2coreml、torch2ncnn、torch2paddle、およびtorch2executorchは、単一の入力テンソルを想定しています。 - ExecuTorch には
flatcが必要: ExecuTorch ランタイムには FlatBuffers コンパイラが必要です。macOS の場合はbrew install flatbuffers、Ubuntu の場合はapt install flatbuffers-compilerでインストールしてください。 - Ultralytics を介した推論は不可: エクスポートされた非 YOLO モデルは、推論のために
YOLO()を通じて読み込むことはできません。各フォーマットのネイティブランタイム(ONNX Runtime、OpenVINO Runtime など)を使用してください。 - YOLO 専用フォーマット: Axelera および Sony IMX500 へのエクスポートには YOLO 特有のモデル属性が必要であり、汎用モデルでは利用できません。
- プラットフォーム固有フォーマット: TensorRT には NVIDIA GPU が必要です。RKNN には
rknn-toolkit2SDK (Linux 限定) が必要です。Edge TPU にはedgetpu_compilerバイナリ (Linux 限定) が必要です。
Link to this sectionFAQ#
Link to this sectionUltralytics でエクスポートできるモデルは何ですか?#
あらゆる torch.nn.Module が対象です。これには timm、torchvision、または任意のカスタム PyTorch モデルが含まれます。モデルはエクスポート前に評価モード (model.eval()) になっている必要があります。さらに、ONNX および OpenVINO はマルチ入力モデルに対してサンプルテンソルのタプルを受け付けます。
Link to this sectionGPU なしで動作するエクスポートフォーマットはどれですか?#
サポートされているすべてのフォーマット(TorchScript、ONNX、OpenVINO、CoreML、TF SavedModel、TF Frozen Graph、NCNN、PaddlePaddle、MNN、ExecuTorch)は CPU でエクスポート可能です。エクスポートプロセス自体に GPU は必要ありません。TensorRT のみが唯一、NVIDIA GPU を必要とするフォーマットです。
Link to this sectionどの Ultralytics バージョンが必要ですか?#
Use Ultralytics >=8.4.38, which includes the ultralytics.utils.export module and the standardized output_file/output_dir arguments.
Link to this sectiontorchvision モデルを iOS デプロイ用に CoreML へエクスポートできますか?#
Yes. torchvision classifiers, detectors, and segmentation models export to .mlpackage via torch2coreml. For image classification models, pass a list of class names to classifier_names to bake in a classification head. Run the export on macOS or Linux. CoreML is not supported on Windows. See the CoreML integration for iOS deployment details.
Link to this sectionエクスポートしたモデルを INT8 または FP16 に量子化できますか?#
Yes, for several formats. Pass half=True for FP16 or int8=True for INT8 when exporting to OpenVINO, CoreML, MNN, or NCNN. INT8 in OpenVINO additionally requires a calibration_dataset argument for post-training quantization. See each format's integration page for quantization trade-offs.