Ultralytics YOLO26のエンドツーエンド検出を理解する#
YOLO26は、one-to-manyヘッドとone-to-oneヘッドの両方をトレーニングします。デフォルトでは、推論と検証にone-to-manyヘッドを使用し、Non-Maximum Suppression(NMS)を適用します。これは、学習済みの同じ重みを使って精度を優先する設定です。高速な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) # NMSなし推論を選択
results = model.predict("image.jpg", nms=None) # one-to-many + NMSに戻す
model.export(format="onnx") # one-to-manyの生出力
model.export(format="onnx", nms=True) # NMSを組み込む
model.export(format="onnx", nms=False) # NMSなしのone-to-one出力エンドツーエンド検出の仕組み#
両方のヘッドはバックボーンとネックを共有し、トレーニング中に最適化されます。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) | 回転角度 |
Fusionは、Conv層とBatchNorm層の統合に加え、未使用の推論分岐を削除します。ヘッドを切り替える必要がある場合は、元のトレーニングチェックポイントを保持してください。削除済みの分岐はFusionで復元できません。one-to-oneヘッドだけが残ったモデルでは、その利用可能な経路が維持されます。
エクスポートされた出力#
YOLOv8、YOLO11、YOLO26の検出モデルは、デフォルトでrawのone-to-many予測をエクスポートします。NMSなしの検出には、nms=Falseを指定してYOLO26をエクスポートしてください。
nms=None | nms=False | |
|---|---|---|
| 検出出力 | (N, nc + 4, 8400) | (N, 300, 6) |
| ボックス形式 | xywh | xyxy |
| スコア | 候補ごとにクラス別のスコア | 検出ごとの信頼度とクラス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の組み込みは、静的シェイプでdetect、segment、poseに対応しています。Xcode PreviewのNMSパイプラインが必要な検出モデルには、
nms=Trueを使用してください。 - MNN: NMSの組み込みは、
dynamic=Falseを使用するdetectとposeに対応しています。 - IMX: 検出、インスタンスセグメンテーション、poseにはNMSの組み込みが必要で、自動的に選択されます。
- Hailo: YOLO26はデフォルトでホスト側NMSを使用するrawテンソルを出力します。
nms=Falseを指定すると、one-to-one経路が選択されます。YOLOv8/YOLO11の検出では、HailoRT NMSが使用されます。 - 量子化: TensorRT 8.5.0より前のバージョン、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.9対40.1、YOLO26xでは57.5対56.9です。one-to-oneヘッドはNMS処理を省略し、レイテンシを優先します。これらの結果がデフォルト設定の根拠ですが、すべてのデータセットで向上するとは限りません。
公開されているNMSなしの速度測定では、nms=Falseが使用されています。精度とレイテンシを比較する際は、同じヘッド選択、画像サイズ、精度、ハードウェアを使用してください。
よくある質問#
この値は、予測と検証で返される検出数を制限します。エンドツーエンドエクスポートとNMS組み込みエクスポートでは、この制限がグラフに含まれるため、変更するには再エクスポートしてください。例外として、CoreMLの検出用NMS組み込みには検出数の上限がありません。画像内のアンカー数が
max_detより少ない場合、エンドツーエンド出力の候補数はさらに少なくなることがあります。はい。デフォルトの検出数上限で
nms=Falseまたはnms=Trueを指定した場合は正しい出力です。形状だけでは、どちらのヘッドがエクスポートされたかを判別できません。デフォルトのraw COCO検出エクスポートでは、通常、imgsz=640における形状は(1, 84, 8400)です。はい。同じ
nms引数で、detect、インスタンスセグメンテーション、pose、OBBに利用可能な検出ヘッドを選択します。ただし、マスクの再構成、キーポイントのデコード、回転ボックスの処理、分類確率、セマンティッククラスマップ、深度のデコードに代わるものではありません。