Non-Maximum Suppression (NMS)
Découvre comment la suppression des non-maxima (NMS) élimine les cadres englobants en double lors de la détection d’objets. Explore comment Ultralytics YOLO26 fournit une NMS native de bout en bout.
La suppression des non-maxima (NMS) est une technique de post-traitement utilisée dans la détection d’objets pour affiner les prédictions brutes effectuées par un modèle. Lorsqu’un modèle de détection d’objets analyse une image, il génère souvent plusieurs boîtes englobantes qui se chevauchent pour un même objet, chacune étant associée à un score de confiance. Ces prédictions redondantes apparaissent parce que le modèle peut détecter la même caractéristique à des échelles ou des positions légèrement différentes. La NMS filtre cette sortie en conservant uniquement la boîte englobante la plus précise pour chaque objet et en supprimant les autres, afin de garantir une sortie finale propre, précise et exempte de doublons.
Fonctionnement de la suppression des non-maxima#
L’algorithme NMS s’applique à une liste de boîtes englobantes candidates et à leurs scores de confiance correspondants. L’objectif est de sélectionner la meilleure boîte pour un objet et de supprimer toute autre boîte qui se chevauche fortement avec elle, car il s’agit probablement de détections en double du même objet. Le processus suit généralement les étapes suivantes :
-
Filtrage : Éliminer toutes les boîtes englobantes dont les scores de confiance sont inférieurs à un seuil donné (par exemple, 0.25) afin de supprimer immédiatement les prédictions faibles.
-
Tri : Trier les boîtes restantes par ordre décroissant en fonction de leurs scores de confiance.
-
Sélection : Sélectionner comme détection valide la boîte ayant le score de confiance le plus élevé.
-
Comparaison : Comparer cette boîte sélectionnée à toutes les autres boîtes restantes à l’aide de l’intersection sur union (IoU), une métrique qui mesure le chevauchement entre deux boîtes.
-
Suppression : Si l’IoU entre la boîte sélectionnée et une autre boîte dépasse un seuil prédéfini (par exemple, 0.45), la boîte ayant le score le plus faible est considérée comme un doublon et supprimée.
-
Itération : Répéter le processus avec la boîte suivante ayant le score le plus élevé et qui n’a pas encore été supprimée ou sélectionnée, jusqu’au traitement de toutes les boîtes.
Applications concrètes#
La NMS est essentielle dans les situations où la précision est primordiale et où les détections en double peuvent perturber les systèmes en aval.
- Conduite autonome : Dans les systèmes de véhicules autonomes, les caméras détectent les piétons, les autres véhicules et les panneaux de signalisation. Un modèle peut prédire trois boîtes légèrement différentes pour un seul piéton. La NMS garantit que le système de planification du véhicule ne reçoit qu’une seule coordonnée pour ce piéton, évitant ainsi les freinages brusques ou les erreurs de planification de trajectoire causés par des obstacles « fantômes ».
- Gestion des stocks dans le commerce de détail : Lorsqu’on utilise la vision par ordinateur pour compter les produits sur une étagère, les articles sont souvent rangés très près les uns des autres. Sans NMS, une seule canette de soda peut être comptée deux fois en raison de prédictions qui se chevauchent, ce qui entraîne des niveaux de stock inexacts. La NMS affine ces détections afin que le décompte des stocks corresponde à la réalité.
Implémentation de la NMS avec PyTorch#
Même si de nombreux frameworks modernes gèrent la NMS en interne, comprendre son implémentation aide à ajuster les paramètres. L’exemple suivant montre comment appliquer la NMS à l’aide de la bibliothèque 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 et détection de bout en bout#
Traditionnellement, la NMS est une étape obligatoire de « nettoyage » exécutée en dehors du réseau neuronal principal, ce qui ajoute de la latence d’inférence. Cependant, le domaine évolue vers des architectures de bout en bout.
- NMS standard : Un processus heuristique qui nécessite un réglage manuel du seuil d’IoU. Si le seuil est trop bas, des objets valides proches les uns des autres peuvent ne pas être détectés (rappel faible). S’il est trop élevé, les doublons sont conservés (précision faible).
- Modèles de bout en bout : Les modèles de nouvelle génération comme YOLO26 sont conçus nativement pour fonctionner de bout en bout. Ils apprennent à prédire exactement une boîte par objet pendant l’entraînement, intégrant ainsi le processus NMS. Cela élimine le besoin d’un post-traitement externe, ce qui permet d’accélérer l’inférence et de simplifier les pipelines de déploiement sur la plateforme Ultralytics.
Concepts associés#
- Soft-NMS : Une variante dans laquelle les boîtes qui se chevauchent ne sont pas strictement supprimées, mais voient leur score de confiance réduit. Cela permet de continuer à détecter des objets qui se chevauchent partiellement (comme des personnes dans une foule) si leur score reste suffisamment élevé après la décroissance.
- Boîtes d’ancrage : Formes de boîtes prédéfinies utilisées par de nombreux détecteurs pour estimer la taille des objets. La NMS est appliquée aux prédictions finales affinées à partir de ces ancres.
- Intersection sur union (IoU) : Formule mathématique utilisée par la NMS pour déterminer le degré de chevauchement entre deux boîtes, et qui sert de seuil de décision pour la suppression.









