コンテンツにスキップ

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属性は不要です。

形式機能インストール出力
ONNXtorch2onnx()pip install onnx.onnx ファイル
TorchScripttorch2torchscript()PyTorchに同梱されています.torchscript ファイル
OpenVINOtorch2openvino()pip install openvino_openvino_model/ ディレクトリ
CoreMLtorch2coreml()pip install coremltools.mlpackage
TF SavedModelonnx2saved_model()詳細な要件については以下をご覧ください_saved_model/ ディレクトリ
TFkeras2pb()詳細な要件については以下をご覧ください.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 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.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)
  • ai-edge-litert>=1.2.0,<1.4.0 macOS では (ai-edge-litert>=1.2.0 (他のプラットフォームでは)
  • onnxslim>=0.1.71
  • onnx>=1.12.0,<2.0.0
  • protobuf>=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.0 CUDAについて
  • paddlepaddle==3.0.0 ARM64CPU上で
  • 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 flatbuffers macOS または apt install flatbuffers-compiler Ubuntu上で。
  • Ultralyticsによる推論は行わない: エクスポートされたYOLO 、 YOLO() 推論のために。各フォーマットにはネイティブランタイムを使用してください(ONNX, OpenVINOなど)。
  • YOLOフォーマットAxeleraおよび Sony IMX500のエクスポートには、YOLOモデル属性が必要であり、汎用モデルでは利用できません。
  • プラットフォーム固有のフォーマット: TensorRT NVIDIA GPUが必要です。 RKNN には、 rknn-toolkit2 SDK(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 引数 トレーニング後の量子化各フォーマットの統合ページを参照して、量子化に伴うトレードオフを確認してください。



📅 0日前に作成✏️ 0日前に更新
raimbekovm

コメント