Non-Maximum Suppression (NMS)
Scopri come la soppressione non massima (NMS) elimina le BBox duplicate nel rilevamento degli oggetti. Scopri come Ultralytics YOLO26 offre una NMS end-to-end nativa.
La soppressione non massima (NMS) è una tecnica di post-elaborazione utilizzata nel rilevamento degli oggetti per perfezionare le predizioni grezze effettuate da un modello. Quando un modello di rilevamento degli oggetti analizza un'immagine, spesso genera più riquadri di delimitazione sovrapposti per un singolo oggetto, ciascuno associato a un punteggio di confidenza. Queste predizioni ridondanti si verificano perché il modello può rilevare la stessa caratteristica a scale o posizioni leggermente diverse. NMS filtra questo output mantenendo solo il riquadro di delimitazione più accurato per ogni oggetto ed eliminando gli altri, assicurando che l'output finale sia pulito, preciso e privo di duplicati.
Come funziona la soppressione non massima#
L'algoritmo NMS opera su un elenco di riquadri di delimitazione candidati e sui relativi punteggi di confidenza. L'obiettivo è selezionare il riquadro migliore per un oggetto e sopprimere (rimuovere) tutti gli altri riquadri che si sovrappongono significativamente a esso, poiché probabilmente sono rilevamenti duplicati dello stesso oggetto. Il processo segue generalmente questi passaggi:
-
Filtraggio: elimina tutti i riquadri di delimitazione con punteggi di confidenza inferiori a una soglia specifica (ad esempio, 0.25) per rimuovere immediatamente le predizioni deboli.
-
Ordinamento: ordina i riquadri rimanenti in ordine decrescente in base ai relativi punteggi di confidenza.
-
Selezione: seleziona il riquadro con il punteggio di confidenza più alto come rilevamento valido.
-
Confronto: confronta questo riquadro selezionato con tutti gli altri riquadri rimanenti utilizzando l'intersezione sull'unione (IoU), una metrica che misura la sovrapposizione tra due riquadri.
-
Soppressione: se l'IoU tra il riquadro selezionato e un altro riquadro supera una soglia predefinita (ad esempio, 0.45), il riquadro con il punteggio più basso viene considerato un duplicato e rimosso.
-
Iterazione: ripeti il processo con il riquadro con il punteggio più alto successivo che non è ancora stato soppresso o selezionato, finché tutti i riquadri non sono stati elaborati.
Applicazioni nel mondo reale#
NMS è essenziale negli scenari in cui la precisione è fondamentale e i rilevamenti duplicati possono confondere i sistemi a valle.
- Guida autonoma: nei sistemi per auto a guida autonoma, le telecamere rilevano pedoni, altri veicoli e segnali stradali. Un modello potrebbe prevedere tre riquadri leggermente diversi per un singolo pedone. NMS assicura che il sistema di pianificazione del veicolo riceva una sola coordinata per quel pedone, prevenendo frenate irregolari o errori nella pianificazione del percorso causati da ostacoli "fantasma".
- Gestione dell'inventario al dettaglio: quando si utilizza la visione artificiale per contare i prodotti su uno scaffale, gli articoli sono spesso disposti molto vicini tra loro. Senza NMS, una singola lattina di bibita potrebbe essere conteggiata due volte a causa di predizioni sovrapposte, causando livelli di inventario inaccurati. NMS perfeziona questi rilevamenti per assicurare che il conteggio dell'inventario corrisponda alla realtà.
Implementazione di NMS con PyTorch#
Sebbene molti framework moderni gestiscano internamente NMS, comprenderne l'implementazione aiuta a regolare i parametri. L'esempio seguente mostra come applicare NMS utilizzando la libreria PyTorch:
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 e rilevamento end-to-end#
Tradizionalmente, NMS è stato un passaggio obbligatorio di "pulizia" esterno alla rete neurale principale, che aggiunge latenza di inferenza. Tuttavia, il settore si sta evolvendo verso architetture end-to-end.
- NMS standard: un processo euristico che richiede la regolazione manuale della soglia IoU. Se la soglia è troppo bassa, gli oggetti validi vicini tra loro potrebbero non essere rilevati (recall basso). Se è troppo alta, rimangono duplicati (precision bassa).
- Modelli end-to-end: i modelli di nuova generazione come YOLO26 sono progettati nativamente per essere end-to-end. Durante l'addestramento imparano a prevedere esattamente un riquadro per ogni oggetto, integrando di fatto il processo NMS. Questo elimina la necessità di post-elaborazione esterna, garantendo velocità di inferenza superiori e pipeline di distribuzione più semplici sulla Ultralytics Platform.
Concetti correlati#
- Soft-NMS: una variante in cui i riquadri sovrapposti non vengono rimossi rigidamente, ma i relativi punteggi di confidenza vengono ridotti. Ciò consente di rilevare comunque oggetti parzialmente sovrapposti (come persone in una folla) se i loro punteggi rimangono sufficientemente alti dopo la decrescita.
- Riquadri di ancoraggio: forme di riquadro predefinite utilizzate da molti rilevatori per stimare le dimensioni degli oggetti. NMS viene applicata alle predizioni finali perfezionate a partire da questi ancoraggi.
- Intersezione sull'unione (IoU): la formula matematica utilizzata da NMS per determinare il grado di sovrapposizione tra due riquadri, fungendo da soglia decisionale per la soppressione.









