Ultralytics YOLOによるモデルのエクスポート#
はじめに#
モデル学習の最終的な目標は、実環境のアプリケーションにデプロイすることです。Ultralytics YOLO26のエクスポートモードでは、学習済みモデルをさまざまな形式にエクスポートするための幅広いオプションを利用でき、多様なプラットフォームやデバイスにデプロイできます。この包括的なガイドでは、モデルエクスポートの詳細を解説し、互換性とパフォーマンスを最大限に高める方法を紹介します。
エクスポート対応の予定については、未リリースのYOLO27プレビューをご覧ください。
視聴: デプロイ向けに Ultralytics YOLO26 をさまざまな形式でエクスポートする方法 | ONNX、TensorRT、CoreML 🚀
YOLO26のエクスポートモードを選ぶ理由#
- 汎用性: ONNX、TensorRT、CoreMLなど、複数の形式にエクスポートできます。
- パフォーマンス: TensorRTではGPUの速度を最大5倍、ONNXまたはOpenVINOではCPUの速度を最大3倍向上できます。
- 互換性: さまざまなハードウェアおよびソフトウェア環境に幅広くモデルをデプロイできます。
- 使いやすさ: モデルを迅速かつ簡単にエクスポートできるシンプルなCLIとPython APIを提供します。
使用例#
YOLO26nモデルをONNXやTensorRTなどの別の形式にエクスポートします。エクスポート引数の一覧については、以下の「引数」セクションをご覧ください。
from ultralytics import YOLO
# モデルを読み込む
model = YOLO("yolo26n.pt") # 公式モデルを読み込みます
model = YOLO("path/to/best.pt") # カスタム学習済みモデルを読み込む
# モデルをエクスポートする
model.export(format="onnx")引数#
この表では、YOLOモデルをさまざまな形式にエクスポートする際に利用できる設定とオプションについて説明します。これらの設定は、さまざまなプラットフォームや環境において、エクスポート後のモデルのパフォーマンス、サイズ、互換性を最適化するうえで重要です。適切に設定することで、モデルを想定するアプリケーションに最適な効率でデプロイできます。
| 引数 | 種類 | デフォルト | 説明 |
|---|---|---|---|
format | str | 'torchscript' | エクスポートモデルのターゲット形式を指定します。'onnx'、'torchscript'、'engine'(TensorRT)などを指定できます。形式ごとに異なるデプロイ環境との互換性が得られます。 |
name | str | None | 形式にハードウェアターゲット名が必要な場合に指定します。Hailoアーキテクチャ('hailo8'、'hailo8l'、'hailo10h'、'hailo15h'、'hailo15l'。デフォルトは'hailo8l')、Rockchip RKNNチップ(デフォルトは'rk3588')、Huawei Ascend SoC(CANNの--soc_version。デフォルトは'Ascend310B4')、Qualcomm QNN HTPターゲット(デフォルトは'73')、またはAMD Xilinx Versal AI Edge Series Gen 2デバイス(デフォルトは've2-xc2ve3858'、VEK385評価キット)を指定します。他のモードで使用するproject/nameの実行名ペアとは異なります。 |
imgsz | intまたはtuple | 640 | モデル入力の画像サイズを指定します。正方形の画像では整数(640×640の場合は640など)、特定の幅と高さを指定する場合はタプル(height, width)を使用できます。指定しない場合、エクスポートでは、読み込んだチェックポイントに記録されたトレーニング時のサイズが再利用されます。公式YOLO26チェックポイントでは、depthに768、classifyに224、OBBに1024、その他のタスクに640が記録されています。ファインチューニング済みモデルには、トレーニングに使用したimgszが記録されています。YAMLから構築したモデルにはトレーニング時のサイズが記録されておらず、640が使用されます。 |
optimize | bool | False | DEEPXでより高度なコンパイラー最適化を有効にし、コンパイル時間を増やす代わりに推論レイテンシを短縮します。 |
quantize | intまたはstr | None | 量子化精度: 16(FP16。モデルサイズを削減し、対応ハードウェアでは推論を高速化できる場合があります)または8(INT8/PTQ。モデルをさらに圧縮し、エッジデバイス向けに精度の低下を最小限に抑えます。キャリブレーションdata/fractionが必要です)。32または未設定の場合はFP32です。quantize=8でトレーニングしたチェックポイントは、常にINT8でエクスポートされます。onnxとengineはキャリブレーションなしでチェックポイントに含まれる範囲からエクスポートされ、他の形式や精度は拒否されます。'w8a8'と'w16a16'は、それぞれ8と16のエイリアスです。混合精度の'w8a16'(16ビットアクティベーションを使用するINT8重み: CoreML、LiteRT、QNN)と'w8a32'(動的INT8: LiteRT)は、それぞれの形式でのみ使用できます。非推奨のhalf/int8フラグに代わる設定です(half=True → 16、int8=True → 8。非推奨の警告とともに引き続き使用できます)。ターゲット形式でサポートされている精度のみ指定できます(以下を参照)。 |
dynamic | bool | False | TorchScript、ONNX、OpenVINO、TensorRT、CoreML、MNNのエクスポートで動的な入力サイズを使用できるようにし、さまざまな画像サイズへの対応を柔軟にします。 |
simplify | bool | True | 中間ONNXグラフをonnxslimで簡素化します。対象はグラフを構築するエクスポートです(エクスポート形式を参照)。推論エンジンとの性能や互換性が向上する場合があります。 |
opset | int | None | ONNXグラフを構築するエクスポートのONNX opsetバージョンを指定します(エクスポート形式を参照)。さまざまなONNXパーサーやランタイムとの互換性のために使用します。設定しない場合、サポートされている最新バージョンを使用します。 |
workspace | floatまたはNone | None | TensorRTの最適化に使用するワークスペースの最大サイズをGiB単位で設定し、メモリ使用量と性能のバランスを取ります。Noneを指定すると、TensorRTがデバイスの最大値まで自動で割り当てます。 |
nms | bool、省略可 | None | Noneは外部NMS用にraw one-to-many予測をエクスポートし、Trueは対応形式でNMSを組み込み、Falseは利用可能な場合にNMSなしヘッドを選択します。CoreMLの組み込みNMSは、静的なshapeのdetect、segment、poseをサポートします。詳細はエンドツーエンド検出ガイドをご覧ください。 |
conf | float | None | エクスポート時にNMSを生成する場合に使用する信頼度しきい値です。対象はnms=Trueエクスポート、Hailoの非エンドツーエンドdetectエクスポート、および内部でnms=Trueを強制するIMXのdetect、pose、segmentエクスポートです。未設定の場合は0.25がデフォルトになります。 |
iou | float | 0.7 | エクスポート時にNMSを生成する場合に使用するIoUしきい値です。対象はnms=Trueエクスポート、Hailoの非エンドツーエンドdetectエクスポート、および内部でnms=Trueを強制するIMXのdetect、pose、segmentエクスポートです。 |
max_det | int | 300 | エクスポートモデルの出力に保持する検出数の最大値です。CoreMLのdetectを除くすべての形式のnms=Trueエクスポートに適用されます。CoreMLのdetectではネイティブNMSパイプラインに検出数の上限がありません。また、NMSなしのエンドツーエンド検出エクスポート(YOLO26、YOLOv10。利用可能なアンカー数を上限とします)と、IMXのdetect、pose、segmentエクスポートにも適用されます。 |
agnostic_nms | bool | False | 標準のnms=Trueパイプラインでエクスポート時のNMSを生成する場合は、クラス非依存NMSを有効にします。CoreML独自のNMS段階も対象となり、同じクラス内だけでなく異なるクラス間でも、重複するボックスのうちスコアが低いものを抑制します。HailoおよびIMX独自の生成NMS設定ではクラス非依存のオプションがないため、このフラグは反映されず、クラスを区別した処理が行われます。また、NMSなしのエンドツーエンドエクスポート(YOLO26、YOLOv10)にも組み込まれます。この場合、同じ検出が複数のクラスラベルで出力されること(IoU=1.0の重複)を防ぐだけで、異なるボックス間のIoUしきい値に基づく抑制は行いません。 |
batch | int | 1 | エクスポートモデルのバッチ推論サイズ、またはpredictモードでエクスポートモデルが同時に処理する画像の最大数を指定します。エクスポート引数にbatchがない形式(Edge TPU、IMX500、DEEPX、Hailo、AMD Xilinx)はバッチサイズ1でエクスポートされ、他の値は受け付けません。 |
device | str | None | エクスポートに使用するデバイスを指定します。GPU(device=0)、CPU(device=cpu)、Appleシリコン向けMPS(device=mps)、Huawei Ascend NPU(device=npuまたはdevice=npu:0)、NVIDIA Jetson向けDLA(device=dla:0またはdevice=dla:1)から選択できます。TensorRTエクスポートではGPUが自動的に使用されますが、TensorRT 11.0はDLAをサポートしていません。 |
verbose | bool | False | format='engine'のエクスポート中、TensorRTビルダーのログレベルをVERBOSEに引き上げます。他のエクスポート形式では無視されます。 |
data | str | None | データセットYAMLへのパスです。INT8量子化のキャリブレーションに必須です。分類では、代わりにデータセットディレクトリまたは組み込みデータセット名を指定します。INT8が有効でパスが指定されていない場合、Ultralyticsは必要に応じてタスク固有のキャリブレーションデータセットを選択し、またはモデルのタスクに対応するデフォルトのデータセットを使用します。quantize=8でトレーニングしたチェックポイントには独自のINT8範囲が含まれているため、キャリブレーションデータは必要ありません。 |
split | str | 'val' | dataからINT8量子化キャリブレーション用データローダーを構築する際に使用するデータセットsplit('train'、'val'、'test')です。 |
fraction | float、int、またはlist | 1.0 | INT8キャリブレーションに使用するデータセットのサブセットです。比率、画像数、または[train, val, test]の値を指定します。1はsplit全体を意味し、1を超える整数は画像数を意味します。省略可能なtest項目では、0/0.0のみを指定して対象なしを表せます。2項目のリストでは、testは全体が対象になります。 |
これらのパラメーターを調整すると、デプロイ環境、ハードウェアの制約、パフォーマンス目標など、特定の要件に合わせてエクスポートプロセスをカスタマイズできます。モデルサイズ、速度、精度のバランスを最適化するには、適切な形式と設定を選ぶことが重要です。
エクスポート形式#
YOLO26で利用できるエクスポート形式を以下の表に示します。format引数を使用すると、任意の形式にエクスポートできます。例:format='onnx'またはformat='engine'。エクスポート済みモデルに対して直接予測または検証を実行することもできます。例:yolo predict model=yolo26n.onnx。エクスポートが完了すると、モデルの使用例が表示されます。また、ローカル環境をセットアップせずに、Ultralytics Platformのブラウザーからモデルを直接エクスポートすることもできます。
| 形式 | format引数 | モデル | メタデータ | 引数 |
|---|---|---|---|---|
| PyTorch | - | yolo26n.pt | ✅ | - |
| TorchScript | torchscript | yolo26n.torchscript | ✅ | imgsz, quantize, dynamic, nms, batch, device |
| ONNX | onnx | yolo26n.onnx | ✅ | imgsz, quantize, dynamic, simplify, opset, nms, batch, data, fraction, device |
| OpenVINO | openvino | yolo26n_openvino_model/ | ✅ | imgsz, quantize, dynamic, nms, batch, data, fraction, device |
| TensorRT | engine | yolo26n.engine | ✅ | imgsz, quantize, dynamic, simplify, opset, workspace, nms, batch, data, fraction, device |
| CoreML | coreml | yolo26n.mlpackage | ✅ | imgsz, dynamic, quantize, nms, batch, device |
| Apple Core AI | coreai | yolo26n.aimodel | ✅ | imgsz, batch, quantize |
| TF SavedModel | saved_model | yolo26n_saved_model/ | ✅ | imgsz, quantize, opset, nms, batch, data, fraction, device |
| TF GraphDef | pb | yolo26n.pb | ❌ | imgsz, opset, batch, device |
| TF Edge TPU | edgetpu | yolo26n_edgetpu.tflite | ✅ | imgsz, quantize, opset, data, fraction, device |
| LiteRT | litert | yolo26n.tflite | ✅ | imgsz, quantize, batch, data, fraction, device |
| PaddlePaddle | paddle | yolo26n_paddle_model/ | ✅ | imgsz, batch, device |
| MNN | mnn | yolo26n.mnn | ✅ | imgsz, batch, dynamic, quantize, simplify, opset, nms, device |
| NCNN | ncnn | yolo26n_ncnn_model/ | ✅ | imgsz, quantize, batch, device |
| IMX500 | imx | yolo26n_imx_model/ | ✅ | imgsz, quantize, data, fraction, nms, device |
| RKNN | rknn | yolo26n_rknn_model/ | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| ExecuTorch | executorch | yolo26n_executorch_model/ | ✅ | imgsz, batch, device |
| Axelera | axelera | yolo26n_axelera_model/ | ✅ | imgsz, batch, quantize, data, fraction, device |
| DEEPX | deepx | yolo26n_deepx_model/ | ✅ | imgsz, quantize, simplify, opset, data, optimize, device |
| Qualcomm QNN | qnn | yolo26n_qnn.onnx | ✅ | imgsz, batch, name, quantize, simplify, opset, data, fraction, device |
| Hailo | hailo | yolo26n_hailo_model/ | ✅ | imgsz, name, quantize, data, fraction, simplify, conf, iou, device |
| Huawei Ascend | ascend | yolo26n_ascend_model/ | ✅ | imgsz, batch, name, quantize, opset, simplify, nms, device |
| AMD Xilinx | xilinx | yolo26n_xilinx_model/ | ✅ | imgsz, name, quantize, data, fraction, opset, simplify, device |
nms=None は外部NMS向けにraw出力をデフォルトで使用します。利用可能なNMSフリーヘッドを選択するには、nms=Falseを設定してください。未対応のフォーマットでは、ネイティブの出力パスにフォールバックします。上記のnmsの項目は、nms=Trueを使用してNMSを埋め込めるフォーマットを示しています。
ほとんどの形式では、ultralyticsと一緒にはインストールされないパッケージが必要です。不足しているパッケージがある場合、エクスポート時にuvまたはpipを使って実行時にインストールします。またLinuxでは、IMX用のJavaなどのシステムパッケージにaptを使用します。Edge TPUコンパイラーは、aptまたはsudoを使わずにダウンロードされます。コンテナイメージ、CIジョブ、本番サービスなどで環境を変更しないようにするには、YOLO_AUTOINSTALL=Falseを設定します。その場合もエクスポート時に不足パッケージを確認して報告しますが、環境は変更せず、パッケージがインストールされるまで処理は失敗します。
export YOLO_AUTOINSTALL=False量子化オプション#
エクスポート時の精度を指定するには、quantize引数を使用します。文字列値では大文字と小文字が区別されず、Ultralyticsはエクスポート前に受け付けた別名を標準形式に統一します。
| 指定値 | 標準値 | 意味 |
|---|---|---|
8, "8", "int8", "w8a8" | 8 | INT8の重みとアクティベーション |
16, "16", "fp16", "w16a16" | 16 | FP16の重みとアクティベーション |
32, "32", "fp32", "w32a32" | 32 | FP32でエクスポートします。未指定時と同じですが、CoreMLのNMS ML ProgramsはデフォルトでFP16になります |
"w8a16" | "w8a16" | INT8の重みと16ビットのアクティベーション(FP16、LiteRTではINT16) |
"w8a32" | "w8a32" | INT8の重みとFP32のアクティベーション(LiteRTの動的INT8。キャリブレーションは不要です) |
従来のhalf=Trueおよびint8=Trueフラグも引き続き受け付けられますが、非推奨の警告が表示され、quantize=16およびquantize=8に転送されます。
すべてのエクスポート形式がすべての精度に対応しているわけではありません。quantizeを明示的に指定すると、その精度でエクスポートされるか、エクスポート前にエラーになります。
| 形式 | FP32(32/未指定) | FP16(16) | INT8(8) | W8A16("w8a16") | 備考 |
|---|---|---|---|---|---|
| PyTorch | ✅ | 該当なし | 該当なし | 該当なし | ネイティブのトレーニング/チェックポイント形式です。 |
| TorchScript | ✅ | ✅ GPUのみ | ❌ | ❌ | FP16のTorchScriptエクスポートにはdevice=0が必要です。CPUでエクスポートするとFP32になります。 |
| ONNX | ✅ | ✅ | ✅ | ❌ | INT8では、ONNX Runtimeの静的量子化とキャリブレーションデータを使用します。 |
| OpenVINO | ✅ | ✅ | ✅ | ❌ | INT8では、NNCFのトレーニング後量子化を使用します。 |
| TensorRT | ✅ | ✅ | ✅ | ❌ | INT8には代表的なキャリブレーションデータが必要です。 |
| CoreML | ✅¹ | ✅ | ✅ | ✅ | CoreMLのINT8は重みの量子化です。W8A16ではINT8の重みとFP16のアクティベーションを使用します。¹ NMS ML Programsで未指定の場合はデフォルトでFP16になり、セグメンテーション/姿勢推定のnms=Trueエクスポートは常にFP16です。 |
| Core AI | ✅ | ✅ | ❌ | ❌ | デフォルトではFP32です。または、quantize=16を指定してFP16の.aimodelアセットを使用できます。INT8のパスはありません。 |
| TF SavedModel | ✅ | ❌ | ✅ | ❌ | INT8エクスポートではTensorFlowのキャリブレーションを使用します。 |
| TF GraphDef | ✅ | ❌ | ❌ | ❌ | エクスポート時の精度変換には対応していません。 |
| Edge TPU | ❌ | ❌ | ✅ 自動 | ❌ | Edge TPUにはINT8が必要です。未指定の場合は自動的に有効になります。 |
| LiteRT | ✅ | ❌ | ✅ | ✅ | 静的INT8(8)と"w8a16"(int8の重み+int16のアクティベーション)では、キャリブレーションデータを使用します。また、"w8a32"の動的INT8(キャリブレーション不要)にも対応しています。quantize=16は独立したエクスポート形式ではありません。FP32モデルは、GPUデリゲートを介して実行時にFP16で動作します。 |
| PaddlePaddle | ✅ | ❌ | ❌ | ❌ | エクスポート時の精度変換には対応していません。 |
| MNN | ✅ | ✅ | ✅ | ❌ | INT8は、MNN変換による重みの量子化です。 |
| NCNN | ✅ | ✅ | ❌ | ❌ | モバイル/組み込み向けのランタイム形式です。 |
| IMX500 | ❌ | ❌ | ✅ 自動 | ❌ | IMX500では量子化が必要です。未指定の場合はINT8が自動的に有効になります。 |
| RKNN | ❌ | ✅ チップに依存 | ✅ | ❌ | RK3588/RK3576/RK3566/RK3568/RK3562/RK2118/RV1126BはFP16またはINT8に対応し、RV1103/RV1106の各バリアントはINT8のみ対応します。 |
| ExecuTorch | ✅ | ❌ | ❌ | ❌ | エクスポート時の精度変換には対応していません。 |
| Axelera | ❌ | ❌ | ✅ 自動 | ❌ | AxeleraへのエクスポートにはINT8が必要です。未指定の場合は自動的に有効になります。 |
| DEEPX | ❌ | ❌ | ✅ 自動 | ❌ | DEEPXへのエクスポートにはINT8が必要です。未指定の場合は自動的に有効になります。 |
| Qualcomm QNN | ❌ | ❌ | ❌ | ✅ 自動 | QNN HTPへのエクスポートでは、INT8の重みと16ビットのアクティベーションが固定で使用されます。 |
| Hailo | ❌ | ❌ | ✅ 自動 | ❌ | HailoへのエクスポートにはINT8が必要です。未指定の場合は自動的に有効になります。 |
| Huawei Ascend | ❌ | ✅ 自動 | ❌ | ❌ | Ascend AI Coreの畳み込みではFP16/INT8の入力のみを受け付けるため、ATCはFP16でコンパイルします。未指定の場合は自動的に有効になります。 |
| AMD Xilinx | ❌ | ❌ | ✅ 自動 | ❌ | AMD XilinxへのエクスポートにはVitis AI INT8(VINT8)が必要です。未設定の場合は自動的に有効になります。 |
INT8およびW8A16でエクスポートする場合は、対象のインテグレーションでデフォルト動作または自動有効化が説明されていない限り、data(例:data="coco8.yaml")で代表的なキャリブレーションデータを指定してください。LiteRTの"w8a32"(動的INT8)方式では、キャリブレーションデータは不要です。
量子化を考慮したトレーニング#
上記のINT8エクスポートは、トレーニング後量子化(PTQ)です。dataを使った単一のキャリブレーションパスで範囲を観測します。一方、量子化を考慮したトレーニング(QAT)では、フェイク量子化を組み込んでファインチューニングし、INT8に耐えられる重みを学習します。これにより、キャリブレーションだけでは失われる精度を回復できます。事前学習済みチェックポイントをファインチューニングするには、trainにquantize=8を渡し、その後通常どおりエクスポートします。
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model.train(
data="coco.yaml",
quantize=8,
epochs=5,
batch=64,
optimizer="AdamW",
lr0=0.00001,
lrf=0.1,
warmup_epochs=0.5,
cos_lr=True,
mosaic=0.0,
)
model.export(format="engine", quantize=8) # # 範囲はチェックポイントに含まれるため、キャリブレーションデータは不要です事前学習済みチェックポイントをファインチューニングする場合は、低い学習率を使用してください。QATによって最初は精度が低下することがあり、トレーニング後量子化に対する効果はモデル、データセット、トレーニング予算によって異なります。エクスポートしたモデルを元のチェックポイントおよびトレーニング後に量子化したエクスポートの両方と比較して検証してください。トレーニング中のフェイク量子化によるスコアだけでは、デプロイ時の精度は確認できません。
QATを行う価値は、エクスポートバックエンド独自のキャリブレーションがモデルをどの程度適切に処理できるかによって異なります。以下の値は、COCO val2017でのmAP50-95です。TensorRT 10.16のエンジンをimgsz=640およびバッチサイズ1で測定し、各QATチェックポイントはepochs=20 patience=3でトレーニングしました。
| モデル | FP32エンジン | PTQ INT8エンジン | QAT INT8エンジン |
|---|---|---|---|
yolo26n | 0.4032 | 0.3934 | 0.3935 |
yolo26s | 0.4794 | 0.4412 | 0.4711 |
yolo26m | 0.5269 | 0.4696 | 0.5137 |
yolo26l | 0.5440 | 0.4889 | 0.5307 |
yolo26x | 0.5701 | 0.5138 | 0.5527 |
範囲全体で、QATによるFP32に対するmAP50-95の低下は0.008~0.017です。一方、トレーニング後量子化による低下は、yolo26nでは0.010、大きなモデルでは0.038~0.057です。そのため、キャリブレーションがすでにうまく機能する最小モデルではQATの効果はほとんどなく、その他のモデルでは0.030~0.044の改善が得られます。別のデータセット、エクスポート形式、またはTensorRTバージョンでは異なる値になるため、実際に測定してください。
QATモデルにはcompile=Falseが必要です。ModelOptの量子化モジュールはtorch.compileに対応していません。
INT8による精度低下を抑えるため、ヘッドの最終出力畳み込み層は意図的に浮動小数点のままにしています。TensorRTは、量子化されていないレイヤーにFP16混合精度を適用します。QATはNVIDIA TensorRT Model Optimizerを使用して実行されます。このツールは初回使用時に自動でインストールされ、生成されたチェックポイントの読み込みにもインストールが必要です。範囲はチェックポイントに含まれ、onnxおよびengine形式へのエクスポートではQ/DQノードとして出力されます。他の形式ではキャリブレーションを参照するため、QATチェックポイントは受け付けられません。
次のステップ#
エクスポートしたモデルの実行方法については、デプロイ先のインテグレーションガイドを確認してください。ONNX、TensorRT、CoreMLなどのガイドは、インテグレーション一覧に掲載されています。
よくある質問#
Ultralyticsを使えば、YOLO26モデルをONNX形式に簡単にエクスポートできます。モデルのエクスポートにはPythonとCLIの両方を使用できます。
例from ultralytics import YOLO # モデルを読み込む model = YOLO("yolo26n.pt") # 公式モデルを読み込みます model = YOLO("path/to/best.pt") # カスタム学習済みモデルを読み込む # モデルをエクスポートする model.export(format="onnx")入力サイズの変更などの高度なオプションを含む手順の詳細については、ONNXインテグレーションガイドを参照してください。
モデルのエクスポートにTensorRTを使用すると、パフォーマンスが大幅に向上します。TensorRTにエクスポートしたYOLO26モデルでは、GPUの速度を最大5倍にできるため、リアルタイム推論アプリケーションに最適です。
- 汎用性: 特定のハードウェア構成に合わせてモデルを最適化できます。
- 速度: 高度な最適化により、推論を高速化できます。
- 互換性: NVIDIAハードウェアとスムーズに統合できます。
TensorRTとの統合について詳しくは、TensorRTインテグレーションガイドを参照してください。
INT8量子化は、モデルを圧縮して推論を高速化する優れた方法であり、特にエッジデバイスで効果的です。INT8量子化を有効にする方法は次のとおりです。
例from ultralytics import YOLO model = YOLO("yolo26n.pt") # モデルを読み込む model.export(format="onnx", quantize=8, data="coco8.yaml")ONNX、TensorRT、OpenVINO、CoreML、Rockchip RKNN、AMD Xilinxなどの形式にINT8量子化を適用できます。最適な量子化結果を得るには、
dataパラメーターを使用して、代表的なデータセットを指定してください。使用可能なquantizeの値と対応形式については、量子化オプションを参照してください。動的入力サイズを使うと、エクスポートしたモデルがさまざまな画像サイズに対応できるため、柔軟性が高まり、用途に応じて処理効率を最適化できます。ONNXやTensorRTなどの形式にエクスポートする際に動的入力サイズを有効にすると、モデルはさまざまな入力形状にシームレスに対応できます。
この機能を有効にするには、エクスポート時に
dynamic=Trueフラグを使用します。例from ultralytics import YOLO model = YOLO("yolo26n.pt") model.export(format="onnx", dynamic=True)動的入力サイズは、動画処理や異なるソースからの画像の処理など、入力サイズが変わるアプリケーションで特に役立ちます。
PyTorchモデルと動的エクスポートでは、デフォルトで最小矩形パディングが使用されますが、静的エクスポートでは
imgsz全体にパディングするため、信頼度しきい値付近の検出結果が異なることがあります。静的エクスポートと一致させるには、ネイティブ推論でrect=Falseを使用するか、対応している場合はdynamic=Trueを指定してエクスポートしてください。モデルのパフォーマンスを最適化するには、エクスポート引数を理解し、適切に設定することが重要です。
format:エクスポートするモデルの対象形式(例:onnx、torchscript、saved_model)。imgsz:モデル入力の希望する画像サイズ(例:640または(height, width))。quantize:量子化精度です。たとえば、8/"int8"、16/"fp16"、32/"fp32"、または対応形式で利用できる重み/アクティベーションの混合方式"w8a16"および"w8a32"(LiteRTの動的INT8)を指定します。量子化オプションを参照してください。dynamic:ONNX、OpenVINO、TensorRTなど、動的形状に対応する形式で可変の入力サイズを受け付けます。nms:外部NMS用の生の出力(None)、組み込みNMS(True)、またはNMSフリーヘッド(False)を選択します。device:エクスポート時にモデルのトレースに使用するデバイスです。たとえば、最初のCUDA GPUにはcpuまたは0を指定します。FP16のTorchScriptにはGPUが必要です。
特定のハードウェアプラットフォームにデプロイする場合は、NVIDIA GPU向けのTensorRT、Appleデバイス向けのCoreML、Google Coralデバイス向けのEdge TPUなど、専用のエクスポート形式を検討してください。
YOLOモデルをONNXやTensorRTなどの形式にエクスポートすると、出力テンソルの構造はモデルのタスクによって異なります。カスタム推論を実装するうえで、これらの出力を理解することが重要です。
nms=Falseを使用してエクスポートしたYOLO26の検出モデル(例:yolo26n.pt)では、対応形式で[x1, y1, x2, y2, confidence, class_id]個の値を持つ(batch_size, max_detections, 6)形状のNMSフリー出力が生成されます。デフォルトのmax_det=300では、通常(batch_size, 300, 6)になります。エンドツーエンド演算子に対応していない一部の制約付き形式では、従来の出力レイアウトに自動的にフォールバックします。デフォルト(
nms=None)では、YOLO26を含む検出モデルは生のone-to-many予測をエクスポートします。通常、出力は(batch_size, 4 + num_classes, num_predictions)形状の単一テンソルで、チャネルはボックス座標とクラスごとのスコアを表し、num_predictionsはエクスポート時の入力解像度によって異なります(動的にすることもできます)。どの形式でエンドツーエンド出力が保持されるかについては、エンドツーエンド検出ガイドをご覧ください。セグメンテーションモデル(例:
yolo26n-seg.pt)では、通常2つの出力が得られます。1つ目は(batch_size, 4 + num_classes + mask_dim, num_predictions)形状のテンソル(ボックス、クラススコア、マスク係数)で、2つ目は(batch_size, mask_dim, proto_h, proto_w)形状のテンソルです。2つ目のテンソルには、係数と組み合わせてインスタンスマスクを生成するマスクプロトタイプが含まれます。サイズはエクスポート時の入力解像度によって異なります(動的にすることもできます)。Poseモデル(例:
yolo26n-pose.pt)では、通常、出力テンソルは(batch_size, 4 + num_classes + keypoint_dims, num_predictions)形状になります。keypoint_dimsはPoseの仕様(例:キーポイント数や信頼度を含めるかどうか)によって異なり、num_predictionsはエクスポート時の入力解像度によって異なります(動的にすることもできます)。ONNX推論の例では、各モデルタイプでこれらの出力を処理する方法を紹介しています。
Ultralyticsは現在、YOLOモデル専用のC++推論APIを提供していません。C++でデプロイする場合は、モデルをONNX、TensorRT、TorchScript、MNNなどのランタイム形式にエクスポートし、エクスポートした成果物を該当ランタイムのネイティブC++ APIで読み込みます。
たとえば、検出モデルを
yolo export model=yolo26n.pt format=onnxでエクスポートし、.onnxファイルをONNX Runtime C++で実行するか、format=engineでエクスポートして、TensorRT C++アプリケーションからTensorRTエンジンを実行します。カスタムC++後処理を使用する場合は、タスクとエクスポート設定に応じた出力テンソルのレイアウトに合わせてください。デフォルトのYOLO26検出モデルのエクスポートでは、生の予測テンソルが返されるため、外部でNMSを実行する必要があります。NMSフリーの検出結果を(batch, max_det, 6)形状で出力するにはnms=Falseでエクスポートし、対応形式でNMSを組み込むにはnms=Trueを指定します。quantize=16(FP16)またはquantize=8(INT8)でエクスポートすると、モデルサイズを削減してパフォーマンスを向上させるため、ほとんどのテンソルが低精度に変換されます。ただし、nms=Falseが有効な場合、クラスインデックスを含む後処理がエクスポートされたグラフに直接組み込まれます。output0テンソルにはクラスインデックスが含まれており、内部では浮動小数点値として表現されます。FP16は仮数部の精度が限られているため、2048を超える整数値を正確に表現できません。精度の損失やクラスIDの誤りを防ぐため、output0は意図的にFP32のまま保持されます。出力全体をFP16にする必要がある場合は、GPU上で
nms=Noneを使用してエクスポートし、後処理を外部で実行してください。CPUでのFP16 ONNXエクスポートでは、内部グラフのみが変換され、入力と出力はFP32のまま保持されます。