Non-Maximum Suppression (NMS)
Die Nichtmaximalunterdrückung (NMS) entfernt überlappende, doppelte Boxen, sodass für jedes Objekt nur eine Erkennung bleibt. Erfahre, wie sie funktioniert, wie du sie einstellst und welche Modelle ohne NMS auskommen.
Nicht-maximale Unterdrückung (NMS) ist der Nachverarbeitungsschritt, der aus den rohen, überlappenden Vorhersagen eines Detektors eine Box pro Objekt macht. Ein dichtes Objektdetektionsmodell bewertet Tausende potenzieller Begrenzungsrahmen pro Bild. Häufig lösen mehrere benachbarte Kandidaten für dasselbe Objekt aus, wobei sich Positionen und Bewertungen leicht unterscheiden. NMS behält die Box mit der höchsten Konfidenz in jedem überlappenden Cluster bei und unterdrückt die übrigen. Dabei wird anhand der Schnittmenge über Vereinigungsmenge (IoU) entschieden, welche Boxen stark genug überlappen, um als Duplikate zu gelten.
So funktioniert Non-Maximum Suppression#
Die gängige Variante, Greedy NMS, verwirft zunächst Kandidaten unterhalb eines Konfidenzschwellenwerts und sortiert die übrigen nach ihrer Bewertung. Anschließend behält sie die oberste Box bei, entfernt alle übrigen Boxen, deren IoU mit dieser Box den IoU-Schwellenwert überschreitet, und wiederholt den Vorgang mit der am höchsten bewerteten verbleibenden Box, bis keine Boxen mehr übrig sind. Detektoren führen NMS normalerweise pro Klasse aus, sodass eine Personenbox niemals eine überlappende Fahrradbox unterdrückt.
nms von torchvision implementiert Greedy NMS für eine einzelne Klasse und gibt die Indizes der beibehaltenen Boxen nach Bewertung sortiert zurück.
import torch
from torchvision.ops import nms
# Kandidatenboxen als [x1, y1, x2, y2] mit jeweils einem Konfidenzwert
boxes = torch.tensor(
[
[100, 100, 200, 200], # A
[105, 105, 195, 195], # B: fast identisch mit A (IoU 0.81)
[300, 300, 400, 400], # C: ein separates Objekt
],
dtype=torch.float32,
)
scores = torch.tensor([0.90, 0.80, 0.95])
# Jede Box unterdrücken, deren IoU mit einer beibehaltenen Box mit höherer Bewertung 0.5 überschreitet
keep = nms(boxes, scores, iou_threshold=0.5)
print(keep.tolist())Die Ausgabe ist [2, 0]: Box C wird zuerst beibehalten, weil sie die höchste Bewertung hat. Box A bleibt erhalten, weil sie sich nicht mit C überlappt, und Box B wird entfernt, weil ihre IoU mit A 0.81 beträgt.
Schwellenwerte abstimmen#
Der Konfidenzschwellenwert entfernt schwache Kandidaten, bevor die Unterdrückung beginnt. Der IoU-Schwellenwert legt fest, ab welcher Überlappung Boxen als Duplikate gelten. Ist er zu niedrig, verschmelzen zwei echte Objekte, die dicht beieinander stehen, etwa Personen in einer Menschenmenge, zu einer Erkennung und der Recall sinkt. Ist er zu hoch, bleiben doppelte Boxen erhalten und die Präzision sinkt. Bei klassenunabhängigem NMS kann jede Box jede andere unabhängig von der Klasse unterdrücken. Dadurch werden doppelte Labels entfernt, wenn ein Modell ein Objekt mit zwei ähnlichen Klassen wie „Auto“ und „Lkw“ versieht.
Einschränkungen von NMS#
- Dicht bevölkerte Szenen: Ein einzelner, fester IoU-Schwellenwert kann eine doppelte Box nicht von einem zweiten Objekt unterscheiden, das sich tatsächlich mit dem ersten überlappt. Daher werden stark verdeckte Objekte unterdrückt.
- Feste Heuristik: Der Schwellenwert wird von Hand gewählt, liegt außerhalb des trainierten Netzwerks und wird nicht aus den Daten gelernt.
- Latenz und Bereitstellung: Die Greedy-Schleife wird nach dem Netzwerk ausgeführt. Ihr Aufwand wächst mit der Anzahl der Kandidaten, wodurch sich die Inferenzlatenz erhöht. Exportformate, die NMS nicht in den Modellgraphen integrieren können, geben rohe Kandidaten aus, und die Anwendung muss NMS selbst ausführen.
NMS-Varianten und Detektion ohne NMS#
Soft-NMS senkt die Bewertungen überlappender Boxen abhängig von ihrer Überlappung, anstatt sie zu löschen. Dadurch werden in Menschenmengen mehr Objekte erkannt. DIoU-NMS berücksichtigt zusätzlich den Abstand zwischen den Boxmittelpunkten. Daher werden zwei Boxen mit weit auseinanderliegenden Mittelpunkten seltener unterdrückt. Das Verfahren wurde zusammen mit dem Distance-IoU-Verlust vorgeschlagen.
Ende-zu-Ende-Detektoren lassen diesen Schritt vollständig entfallen. DETR wird mit einer eins-zu-eins-Hungarian-Zuordnung zwischen Vorhersagen und Labels trainiert, sodass jedes Objekt genau eine Vorhersage erhält. YOLOv10 brachte einen One-to-One-Kopf in echtzeitfähige YOLO-Modelle. YOLO26 trainiert beide Arten von Köpfen und wendet standardmäßig NMS an, weil sein One-to-Many-Kopf etwas besser abschneidet: 40,9 statt 40,1 mAP50-95 auf COCO für YOLO26n. Mit nms=False wird der One-to-One-Kopf ausgewählt, der pro Bild höchstens 300 endgültige Boxen ohne NMS-Durchlauf ausgibt, wie der Leitfaden zur Ende-zu-Ende-Erkennung für Vorhersage und Export zeigt.










