Meet YOLO26: next-gen vision AI.

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固有の属性は必要ありません。

形式関数インストール出力
ONNXtorch2onnx()pip install onnx.onnxファイル
TorchScripttorch2torchscript()PyTorchに付属.torchscriptファイル
OpenVINOtorch2openvino()pip install openvino_openvino_model/ディレクトリ
CoreMLtorch2coreml()pip install coremltools.mlpackage
TF SavedModelonnx2saved_model()以下の詳細な要件を参照_saved_model/ディレクトリ
TF Frozen Graphkeras2pb()以下の詳細な要件を参照.pbファイル
NCNNtorch2ncnn()pip install ncnn pnnx_ncnn_model/ディレクトリ
MNNonnx2mnn()pip install MNN.mnnファイル
PaddlePaddletorch2paddle()pip install paddlepaddle x2paddle_paddle_model/ディレクトリ
ExecuTorchtorch2executorch()pip install executorch_executorch_model/ディレクトリ
中間フォーマットとしてのONNX

MNNTF 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)
エクスポート前に必ず`model.eval()`を呼び出してください

ドロップアウト、バッチ正規化、およびその他の学習用レイヤーは、推論時に異なる動作をします。.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"です。opsetinput_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.xmlmodel.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.0torch>=1.11numpy<=2.3.5が必要です。Windowsではサポートされていません。

`BlobWriter not loaded`エラー

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.0
  • onnx2tf>=1.26.3,<1.29.0
  • tf_keras<=2.19.0
  • sng4onnx>=1.0.1
  • onnx_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.71
  • onnx>=1.12.0,<2.0.0
  • protobuf>=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.py

torch2ncnn()は初回使用時にncnnpnnxを確認します。

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.6torch>=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.pdiparams

x2paddleおよび使用するプラットフォームに適した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.pte

torch>=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-5
許容される差異

FP32 エクスポートの場合、最大絶対誤差は 1e-5 未満である必要があります。これより大きい差がある場合は、サポートされていない演算、正しくない入力形状、またはモデルが評価モードになっていない可能性があります。FP16 および INT8 エクスポートでは、許容範囲がより広くなります。ランダムなテンソルではなく、実際のデータで検証してください。

他のランタイムでは、入力テンソル名が異なる場合があります。例えば OpenVINO はモデルの順伝播引数名(通常、汎用モデルでは x)を使用しますが、torch2onnx はデフォルトで "images" となります。

Link to this section既知の制限事項#

  • マルチ入力サポートの不一致: torch2onnx および torch2openvino は、複数の入力を持つモデルに対してサンプルテンソルのタプルまたはリストを受け付けます。一方、torch2torchscripttorch2coremltorch2ncnntorch2paddle、および torch2executorch は、単一の入力テンソルを想定しています。
  • ExecuTorch には flatc が必要: ExecuTorch ランタイムには FlatBuffers コンパイラが必要です。macOS の場合は brew install flatbuffers、Ubuntu の場合は apt install flatbuffers-compiler でインストールしてください。
  • Ultralytics を介した推論は不可: エクスポートされた非 YOLO モデルは、推論のために YOLO() を通じて読み込むことはできません。各フォーマットのネイティブランタイム(ONNX RuntimeOpenVINO Runtime など)を使用してください。
  • YOLO 専用フォーマット: Axelera および Sony IMX500 へのエクスポートには YOLO 特有のモデル属性が必要であり、汎用モデルでは利用できません。
  • プラットフォーム固有フォーマット: TensorRT には NVIDIA GPU が必要です。RKNN には rknn-toolkit2 SDK (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.

コメント