Non-Maximum Suppression (NMS)
Non-Maximum Suppression(NMS)がオブジェクト検出において重複するバウンディングボックスをどのように排除するかを学びます。Ultralytics YOLO26がどのようにネイティブなエンドツーエンドのNMSを提供するかを発見しましょう。
Non-Maximum Suppression (NMS) は、object detectionにおいてモデルの生の予測結果を洗練させるために使用される後処理技術です。オブジェクト検出モデルが画像を解析する際、単一のオブジェクトに対して複数の重なり合うbounding boxesを生成することが多く、それぞれにconfidence scoreが関連付けられます。これらの冗長な予測は、モデルが同一の特徴をわずかに異なるスケールや位置で検出するために発生します。NMSは、各オブジェクトに対して最も正確なbounding boxのみを残し、他を破棄することでこの出力をフィルタリングし、最終的な出力をクリーンで正確、かつ重複のないものにします。
Link to this sectionNon-Maximum Suppressionの仕組み#
NMSアルゴリズムは、候補となるbounding boxのリストとそれに対応するconfidence scoreに対して動作します。目的は、オブジェクトに対して最適なボックスを選択し、それと大きく重なる他のボックスを抑制(削除)することです。これらは同じオブジェクトの重複検出である可能性が高いためです。処理は通常、以下の手順で行われます。
-
フィルタリング: 特定のしきい値(例:0.25)を下回るconfidence scoreを持つすべてのbounding boxを排除し、弱い予測を即座に除去します。
-
並べ替え: 残ったボックスをconfidence scoreに基づいて降順に並べ替えます。
-
選択: 最も高いconfidence scoreを持つボックスを有効な検出結果として選択します。
-
比較: 選択したこのボックスと、残りのすべてのボックスをIntersection over Union (IoU)を用いて比較します。これは2つのボックス間の重なりを測定する指標です。
-
抑制: 選択したボックスと別のボックスとの間のIoUが、定義済みのしきい値(例:0.45)を超えた場合、スコアの低い方のボックスは重複とみなされ、削除されます。
-
反復: すべてのボックスが処理されるまで、まだ抑制または選択されていないスコアが次に高いボックスに対してプロセスを繰り返します。
Link to this section実社会での応用#
NMSは、精度が最も重要であり、重複する検出結果が後続のシステムを混乱させる可能性があるシナリオにおいて不可欠です。
- 自動運転: 自動運転システムでは、カメラが歩行者、他の車両、交通標識を検出します。モデルが1人の歩行者に対して、わずかに異なる3つのボックスを予測することがあります。NMSは、車両の計画システムがその歩行者に対して1つの座標のみを受信するようにし、幽霊のような障害物によって引き起こされる不規則なブレーキや経路計画の誤りを防ぎます。
- 小売在庫管理: computer visionを使用して棚の商品を数える際、アイテムが密集して配置されていることがよくあります。NMSがない場合、重なり合う予測によって単一の炭酸飲料の缶が2度カウントされてしまい、不正確な在庫レベルにつながる可能性があります。NMSはこれらの検出を洗練させ、在庫数が実態と一致するようにします。
Link to this sectionPyTorchによる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.Link to this sectionNMSとEnd-to-End検出の比較#
従来、NMSはメインのニューラルネットワークの外側に配置される必須の「クリーンアップ」ステップであり、inference latencyを増加させていました。しかし、この分野はエンドツーエンドのアーキテクチャへと進化しています。
- 標準的なNMS: IoUしきい値の手動調整を必要とするヒューリスティックなプロセスです。しきい値が低すぎると、近くにある有効なオブジェクトが見逃される可能性があり(recallが低下)、高すぎると重複が残ってしまいます(precisionが低下)。
- エンドツーエンドモデル: YOLO26のような次世代モデルは、ネイティブにエンドツーエンドとなるように設計されています。これらはトレーニング中にオブジェクトごとに正確に1つのボックスを予測することを学習し、NMSプロセスを効果的に内部化します。これにより外部の後処理が不要となり、Ultralytics Platform上での推論速度の向上とデプロイパイプラインの簡素化が実現します。
Link to this section関連概念#
- Soft-NMS: 重なり合うボックスを完全には削除せず、そのconfidence scoreを低下させる手法です。これにより、(群衆の中の人々のように)ある程度重なり合うオブジェクトでも、減衰後もスコアが十分に高ければ検出できるようになります。
- Anchor Boxes: 多くの検出器がオブジェクトのサイズを推定するために使用する定義済みのボックス形状です。NMSは、これらのアンカーから洗練された最終的な予測に対して適用されます。
- Intersection over Union (IoU): NMSが2つのボックスがどれだけ重なっているかを判断するために使用する数学的な公式であり、抑制の決定しきい値として機能します。






