Ultralytics YOLO26のエンドツーエンド検出を理解する#
YOLO26 は one-to-many ヘッドと one-to-one ヘッドの両方を学習します。予測と検証では、デフォルトで Non-Maximum Suppression (NMS) を備えた one-to-many ヘッドを使用します。これにより、同じ学習済み重みを使用して精度を高めることができます。代わりに、より高速な NMS なしの one-to-one ヘッドを使用するには、nms=False を設定します。
予測、検証、追跡、エクスポート、ベンチマーク にわたる選択は、1 つの引数で制御されます。
nms | 予測と検証 | エクスポート |
|---|---|---|
None(デフォルト) | one-to-many ヘッド。Ultralytics が NMS を実行します | 生の one-to-many 出力。コンシューマーが NMS を実行します |
True | None と同じ | サポートされている場合は NMS が組み込まれた one-to-many ヘッド |
False | IoU サプレッションのない one-to-one ヘッド | サポートされている場合の NMS なしの one-to-one 出力 |
None は、オプションの後処理がモデルに組み込まれていないことを意味します。モデルの出力を予測結果や検証指標に変換する通常の処理が削除されるわけでは ありません。分類、セマンティックセグメンテーション、深度、および検出ヘッドを選択できないモデルは、それぞれのタスクのネイティブな動作を維持します。
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
results = model.predict("image.jpg") # one-to-many + NMS
metrics = model.val(data="coco.yaml") # one-to-many + NMS
results = model.predict("image.jpg", nms=False) # opt into NMS-free inference
results = model.predict("image.jpg", nms=None) # switch back to one-to-many + NMS
model.export(format="onnx") # raw one-to-many outputs
model.export(format="onnx", nms=True) # embed NMS
model.export(format="onnx", nms=False) # NMS-free one-to-one outputsエンドツーエンド検出の仕組み#
両方のヘッドはバックボーンとネックを共有し、学習 中に最適化されます。one-to-many ヘッドはオブジェクトごとに複数の候補予測を提供し、NMS が重なり合う検出を削除します。one-to-one ヘッドはオブジェクトごとに 1 つの予測を生成するように学習します。推論パスを選択しても、デュアルヘッドの監督が無効になるわけではありません。学習中の検証では選択された推論ヘッドを使用するため、チェックポイントの選択と早期終了はデプロイ時と同じ予測に従います。
| ヘッド | 外部処理前の検出出力 | 処理 |
|---|---|---|
| one-to-many (デフォルト) | (N, nc + 4, 8400) | 信頼度フィルタリングと NMS |
| one-to-one | (N, 300, 6) | 信頼度フィルタリング。IoU サプレッションはありません |
ここで N はバッチサイズ、nc はクラス数、8400 は imgsz=640 における候補数です。one-to-one 検出行には [x1, y1, x2, y2, confidence, class_id] が含まれます。他の検出タスクには追加の出力が含まれます。
| タスク | エンドツーエンド出力 | 追加データ |
|---|---|---|
| 検出 | (N, 300, 6) | — |
| インスタンスセグメンテーション | (N, 300, 6 + nm) および (N, nm, H, W) | マスク係数とプロトタイプ |
| ポーズ | (N, 300, 57) | 17 キーポイント × 3 値 |
| OBB | (N, 300, 7) | 回転角度 |
融合により、未使用の推論ブランチが削除され、Conv レイヤーと BatchNorm レイヤーが折りたたまれます。ヘッドを切り替える必要がある場合は、元の学習チェックポイントを保持してください。融合では、すでに削除されたブランチを再構築することはできません。one-to-one ヘッドのみが残ったモデルは、その利用可能なパスを維持します。
エクスポートされた出力#
YOLOv8、YOLO11、および YOLO26 の検出モデルは、デフォルトで生の one-to-many 予測をエクスポートします。NMS なしの検出を行うには、nms=False を指定して YOLO26 をエクスポートします。
nms=None | nms=False | |
|---|---|---|
| 検出出力 | (N, nc + 4, 8400) | (N, 300, 6) |
| ボックス形式 | xywh | xyxy |
| スコア | 候補ごとのクラスあたり 1 つのスコア | 検出ごとの信頼度とクラス ID |
| 外部処理 | 信頼度フィルタリングと NMS | 信頼度フィルタリング |
nms=True も処理された検出結果を出力しますが、one-to-many ヘッドを使用し、従来の NMS が組み込まれています。デプロイランタイムがサプレッション自体を実装せずに検出結果を受け取る必要がある場合に役立ちます。
エクスポートされたモデルのグラフによってその出力が決まります。ロード時に nms を渡してもグラフが再構築されるわけではありません。出力パスを選択するには、目的の nms 値を指定してソースチェックポイントをエクスポートしてください。Ultralytics はアーティファクトのメタデータを使用して、NMS が二重に適用されるのを防ぎます。
エクスポート形式の互換性#
ONNX、TensorRT、CoreML、OpenVINO、およびその他のいくつかのフォーマットは、NMS なしのエクスポートをサポートしています。NCNN、RKNN、PaddlePaddle、ExecuTorch、IMX、Edge TPU、Qualcomm QNN は、オペレーターがエンドツーエンド出力をサポートできない場合、one-to-many パスにフォールバックします。フォーマットの警告にフォールバックの理由が説明されています。
- 埋め込み NMS:
nms=Trueは、各フォーマットのタスク、精度、および動的形状の制限を受けます。埋め込み NMS をサポートしていないフォーマットは、外部処理用のネイティブ出力をエクスポートします。 - CoreML: 埋め込み NMS は、静的形状での検出、セグメント、およびポーズをサポートします。Xcode Preview の NMS パイプラインを必要とする検出モデルには、
nms=Trueを使用してください。 - MNN: 埋め込み NMS は、
dynamic=Falseによる検出とポーズをサポートします。 - IMX: 検出、インスタンスセグメンテーション、ポーズには埋め込み NMS が必要であり、自動的に選択されます。
- Hailo: YOLO26 はデフォルトでホスト NMS を備えた生テンソルを使用します。
nms=Falseはその one-to-one パスを選択します。YOLOv8/YOLO11 の検出では HailoRT NMS が使用されます。 - 量子化: バージョン 8.5.0 より前の TensorRT、JetPack 6 上の TensorRT 10.3.0 INT8、および LiteRT INT8 または
w8a16は、one-to-many 出力にフォールバックします。
ハードウェア要件については、個別の統合ガイドを参照してください。完全な FP16 出力テンソルを使用するには、nms=None を使用します。エンドツーエンドのクラスインデックスは、モデルが量子化されている場合でも、出力テンソルを FP32 に維持できます。
精度と速度のトレードオフ#
公開されている YOLO26 COCO の結果によると、one-to-many ヘッドにより、5 つのスケール全体で検出 mAP が 0.6〜0.8 ポイント向上することが示されています。たとえば、YOLO26n では 40.1 に対して 40.9、YOLO26x では 56.9 に対して 57.5 です。one-to-one ヘッドは NMS パスを回避し、レイテンシを重視します。これらの結果がデフォルトを採用する理由であり、すべてのデータセットでの向上を保証するものではありません。
公開されている NMS なしの速度測定では nms=False が使用されています。同じヘッドの選択、画像サイズ、精度、ハードウェアを使用して、精度とレイテンシを比較してください。
FAQ#
予測および検証によって返される検出数が制限されます。エンドツーエンドのエクスポートおよび埋め込みNMSのエクスポートでは、その制限がグラフの一部となるため、変更するには再エクスポートが必要です。CoreMLの検出における埋め込みNMSは例外であり、検出上限はありません。エンドツーエンドの出力には、画像内のアンカー数が
max_det未満の場合、より少ない候補が含まれることがあります。はい、デフォルトの検出制限を持つ
nms=Falseまたはnms=Trueの場合です。形状だけでは、どのヘッドがエクスポートされたかを特定できません。デフォルトの生の COCO 検出エクスポートは通常、imgsz=640で形状(1, 84, 8400)を持ちます。はい。同じ
nms引数によって、検出、インスタンスセグメンテーション、ポーズ、OBB で利用可能な検出ヘッドが選択されます。マスクの再構築、キーポイントのデコード、回転ボックスの処理、分類確率、セマンティッククラスマップ、または深度のデコードが置き換えられるわけではありません。