Non-Maximum Suppression (NMS)
Non-Maximum Suppression(NMS)がオブジェクト検出において重複するバウンディングボックスをどのように排除するかを学びます。Ultralytics YOLO26がどのようにネイティブなエンドツーエンドのNMSを提供するかを発見しましょう。
Non-Maximum Suppression (NMS) は、モデルによる生の予測を洗練させるためにobject detectionで使用される後処理テクニックです。物体検出モデルが画像を分析する際、1つの物体に対して複数の重なり合うbounding boxesを生成することが多く、それぞれにconfidence scoreが関連付けられています。これらの冗長な予測が発生するのは、モデルがわずかに異なるスケールや位置で同じ特徴を検出する可能性があるためです。NMSは、各物体に対して最も精度の高いバウンディングボックスのみを保持し、残りを破棄することでこの出力をフィルタリングし、最終的な出力がクリーンで正確、かつ重複のない状態になるようにします。
Non-Maximum Suppressionの仕組み#
NMSアルゴリズムは、候補となるbounding boxのリストとそれに対応するconfidence scoreに対して動作します。目的は、オブジェクトに対して最適なボックスを選択し、それと大きく重なる他のボックスを抑制(削除)することです。これらは同じオブジェクトの重複検出である可能性が高いためです。処理は通常、以下の手順で行われます。
-
フィルタリング: 特定のしきい値(例:0.25)を下回るconfidence scoreを持つすべてのbounding boxを排除し、弱い予測を即座に除去します。
-
並べ替え: 残ったボックスをconfidence scoreに基づいて降順に並べ替えます。
-
選択: 最も高いconfidence scoreを持つボックスを有効な検出結果として選択します。
-
Comparison: 2つのボックス間の重なりを測定する指標であるIntersection over Union (IoU)を使用して、選択したこのボックスと他のすべての残りのボックスを比較します。
-
抑制: 選択したボックスと別のボックスとの間のIoUが、定義済みのしきい値(例:0.45)を超えた場合、スコアの低い方のボックスは重複とみなされ、削除されます。
-
反復: すべてのボックスが処理されるまで、まだ抑制または選択されていないスコアが次に高いボックスに対してプロセスを繰り返します。
実社会での応用#
NMSは、精度が最も重要であり、重複する検出結果が後続のシステムを混乱させる可能性があるシナリオにおいて不可欠です。
- 自動運転: 自動運転システムでは、カメラが歩行者、他の車両、交通標識を検出します。モデルが1人の歩行者に対して、わずかに異なる3つのボックスを予測することがあります。NMSは、車両の計画システムがその歩行者に対して1つの座標のみを受信するようにし、幽霊のような障害物によって引き起こされる不規則なブレーキや経路計画の誤りを防ぎます。
- Retail Inventory Management: 棚の上の商品を数えるためにcomputer visionを使用する場合、アイテムが密接に並んでいることがよくあります。NMSがないと、予測の重複により1本の缶ジュースが2回カウントされ、不正確な在庫レベルにつながる可能性があります。NMSはこれらの検出結果を洗練させ、在庫数が現実と一致するようにします。
PyTorchによるNMSの実装#
多くのモダンなフレームワークはNMSを内部で処理しますが、実装を理解することはパラメータのチューニングに役立ちます。次の例は、PyTorch libraryを使用してNMSを適用する方法を示しています。
import torch
import torchvision.ops as ops
# Example bounding boxes: [x1, y1, x2, y2]
boxes = torch.tensor(
[
[100, 100, 200, 200], # Box A
[105, 105, 195, 195], # Box B (High overlap with A)
[300, 300, 400, 400], # Box C (Distinct object)
],
dtype=torch.float32,
)
# Confidence scores for each box
scores = torch.tensor([0.9, 0.8, 0.95], dtype=torch.float32)
# Apply NMS with an IoU threshold of 0.5
# Boxes with IoU > 0.5 relative to the highest scoring box are suppressed
keep_indices = ops.nms(boxes, scores, iou_threshold=0.5)
print(f"Indices to keep: {keep_indices.tolist()}")
# Output will likely be [2, 0] corresponding to Box C (0.95) and Box A (0.9),
# while Box B (0.8) is suppressed due to overlap with A.NMSとEnd-to-End検出の比較#
従来、NMSはメインのニューラルネットワークの外部に位置する必須の「クリーンアップ」ステップであり、inference latencyを追加していました。しかし、分野はエンドツーエンドのアーキテクチャに向けて進化しています。
- Standard NMS: IoUしきい値の手動調整が必要なヒューリスティックプロセスです。しきい値が低すぎる場合、互いに近い有効なオブジェクトが見逃される可能性があり(低いrecall)、高すぎる場合、重複が残ります(低いprecision)。
- End-to-End Models: YOLO26のような次世代モデルは、ネイティブにエンドツーエンドになるように設計されています。トレーニング中にオブジェクトごとに正確に1つのボックスを予測することを学習し、NMSプロセスを効果的に内部化します。これにより、外部の後処理の必要性がなくなり、Ultralytics Platform上での推論速度の向上とシンプルなデプロイパイプラインが実現します。
関連概念#
- Soft-NMS: 重なり合うボックスが厳密に削除されるのではなく、信頼度スコアが低下させられるバリエーションです。これにより、減衰後もスコアが十分に高いままであれば、多少重なり合うオブジェクト(群衆の中の人々など)を引き続き検出できるようになります。
- Anchor Boxes: オブジェクトのサイズを推定するために多くの検出器で使用される事前定義されたボックス形状です。NMSは、これらのアンカーから洗練された最終予測に適用されます。
- Intersection over Union (IoU): 2つのボックスがどれだけ重なり合っているかを判断するためにNMSで使用される数式であり、抑制の決定しきい値として機能します。






