Non-Maximum Suppression (NMS)
La suppression des non-maxima (NMS) élimine les boîtes qui se chevauchent et font doublon, afin que chaque objet ne conserve qu’une détection. Découvre son fonctionnement, son réglage et les modèles sans NMS.
La suppression non maximale (NMS) est l’étape de post-traitement qui transforme les prédictions brutes et chevauchantes d’un détecteur en une seule boîte par objet. Un modèle dense de détection d’objets attribue un score à des milliers de boîtes englobantes candidates par image ; plusieurs candidates voisines s’activent généralement pour le même objet, avec des positions et des scores légèrement différents. La NMS conserve la boîte ayant la plus grande confiance dans chaque groupe de chevauchement et supprime les autres, en utilisant l’intersection sur l’union (IoU) pour déterminer si le chevauchement entre les boîtes suffit à les considérer comme des doublons.
Fonctionnement de la suppression non maximale#
La NMS gloutonne, la version standard, élimine d’abord les candidates situées sous un seuil de confiance et trie les autres par score. Elle conserve ensuite la boîte en tête du classement, supprime toutes les autres boîtes dont l’IoU avec celle-ci dépasse le seuil IoU, puis répète l’opération avec la meilleure boîte restante jusqu’à épuisement. Les détecteurs l’exécutent normalement une fois par classe : une boîte de personne ne supprime donc jamais une boîte de vélo qui la chevauche.
nms de torchvision implémente la NMS gloutonne pour une seule classe et renvoie, triés par score, les indices des boîtes conservées.
import torch
from torchvision.ops import nms
# Boîtes candidates sous la forme [x1, y1, x2, y2], avec un score de confiance pour chacune
boxes = torch.tensor(
[
[100, 100, 200, 200], # A
[105, 105, 195, 195], # B : presque identique à A (IoU 0.81)
[300, 300, 400, 400], # C : un objet distinct
],
dtype=torch.float32,
)
scores = torch.tensor([0.90, 0.80, 0.95])
# Supprimer toute boîte dont l’IoU avec une boîte conservée ayant un score supérieur dépasse 0.5
keep = nms(boxes, scores, iou_threshold=0.5)
print(keep.tolist())La sortie est [2, 0] : la boîte C est conservée en premier, car elle a le score le plus élevé ; la boîte A est conservée, car elle ne chevauche pas C ; et la boîte B est supprimée, car son IoU avec A est de 0.81.
Régler les seuils#
Le seuil de confiance élimine les candidates faibles avant le début de la suppression. Le seuil IoU définit le chevauchement considéré comme un doublon. S’il est trop faible, deux objets réels très proches, comme des personnes dans une foule, fusionnent en une seule détection et le rappel diminue. S’il est trop élevé, les boîtes en double sont conservées et la précision diminue. La NMS indépendante des classes permet à n’importe quelle boîte d’en supprimer une autre, quelle que soit sa classe, ce qui élimine les étiquettes en double lorsqu’un modèle attribue à un objet deux classes similaires, comme « voiture » et « camion ».
Limites de la NMS#
- Scènes encombrées : un seuil IoU unique et fixe ne peut pas distinguer une boîte en double d’un second objet qui chevauche réellement le premier ; les objets fortement occultés sont donc supprimés.
- Heuristique fixe : le seuil est choisi manuellement, se situe en dehors du réseau entraîné et n’est pas appris à partir des données.
- Latence et déploiement : la boucle gloutonne s’exécute après le réseau et son coût augmente avec le nombre de candidates, ce qui accroît la latence d’inférence. Les formats d’export qui ne peuvent pas intégrer la NMS au graphe du modèle produisent des candidates brutes ; l’application doit alors exécuter elle-même la NMS.
Variantes de la NMS et détection sans NMS#
Soft-NMS réduit les scores des boîtes qui se chevauchent en fonction de leur chevauchement, au lieu de les supprimer, ce qui permet de récupérer davantage d’objets dans les foules. DIoU-NMS, proposée avec la fonction de perte Distance-IoU, tient également compte de la distance entre les centres des boîtes ; deux boîtes dont les centres sont éloignés ont donc moins de chances d’être supprimées.
Les détecteurs de bout en bout suppriment entièrement cette étape. DETR est entraîné avec une association hongroise un-à-un entre les prédictions et les annotations, de sorte que chaque objet reçoit exactement une prédiction ; YOLOv10 a introduit une tête un-à-un dans les modèles YOLO temps réel. YOLO26 entraîne les deux types de tête et applique NMS par défaut, car sa tête un-à-plusieurs obtient un score légèrement supérieur : 40,9 contre 40,1 en mAP50-95 sur COCO pour YOLO26n. Passer nms=False sélectionne la tête un-à-un, qui produit au plus 300 boîtes finales par image sans étape NMS, comme le montre le guide de détection de bout en bout pour la prédiction et l’exportation.










