Ultralytics YOLO27:

Ultralytics YOLO26のエンドツーエンド検出を理解する#

YOLO26one-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 を実行します
TrueNone と同じサポートされている場合は NMS が組み込まれた one-to-many ヘッド
FalseIoU サプレッションのない 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=Nonenms=False
検出出力(N, nc + 4, 8400)(N, 300, 6)
ボックス形式xywhxyxy
スコア候補ごとのクラスあたり 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 で利用可能な検出ヘッドが選択されます。マスクの再構築、キーポイントのデコード、回転ボックスの処理、分類確率、セマンティッククラスマップ、または深度のデコードが置き換えられるわけではありません。

コメント