Non-Maximum Suppression (NMS)
Apprends comment la suppression des non-maxima (NMS) élimine les boîtes englobantes en double dans la détection d'objets. Découvre comment Ultralytics YOLO26 fournit une NMS native de bout en bout.
La suppression des non-maximums (NMS) est une technique de post-traitement utilisée en object detection pour affiner les prédictions brutes faites par un modèle. Lorsqu'un modèle de détection d'objets analyse une image, il génère souvent plusieurs bounding boxes qui se chevauchent pour un seul objet, chacune étant associée à un confidence score. Ces prédictions redondantes se produisent parce que le modèle peut détecter la même caractéristique à des échelles ou des positions légèrement différentes. NMS filtre ce résultat en ne conservant que la boîte englobante la plus précise pour chaque objet et en écartant les autres, garantissant ainsi que le résultat final est propre, précis et exempt de doublons.
Comment fonctionne le Non-Maximum Suppression#
L'algorithme NMS opère sur une liste de bounding boxes candidates et leurs scores de confiance correspondants. L'objectif est de sélectionner la meilleure boîte pour un objet et de supprimer (retirer) toutes les autres boîtes qui se chevauchent de manière significative avec elle, car il s'agit probablement de détections en double du même objet. Le processus suit généralement ces étapes :
-
Filtrage : Élimine toutes les bounding boxes dont le score de confiance est inférieur à un seuil spécifique (par exemple, 0,25) pour supprimer immédiatement les prédictions faibles.
-
Tri : Trie les boîtes restantes par ordre décroissant en fonction de leurs scores de confiance.
-
Sélection : Choisit la boîte avec le score de confiance le plus élevé comme détection valide.
-
Comparaison : Compare cette boîte sélectionnée avec toutes les autres boîtes restantes en utilisant l'Intersection over 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 est supprimée.
-
Itération : Répète le processus avec la boîte suivante ayant le score le plus élevé qui n'a pas encore été supprimée ou sélectionnée, jusqu'à ce que toutes les boîtes soient traitées.
Applications concrètes#
Le NMS est essentiel dans les scénarios 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 voitures autonomes, les caméras détectent les piétons, d'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. Le 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 un freinage erratique ou des erreurs de planification de trajectoire causées par des obstacles "fantômes".
- Gestion des stocks de détail : Lorsque tu utilises la computer vision pour compter des produits sur une étagère, les articles sont souvent serrés les uns contre les autres. Sans NMS, une seule canette de soda pourrait être comptée deux fois en raison de prédictions qui se chevauchent, ce qui entraînerait des niveaux de stock inexacts. NMS affine ces détections pour s'assurer que le décompte des inventaires correspond à la réalité.
Implémentation du NMS avec PyTorch#
Bien que de nombreux frameworks modernes gèrent NMS en interne, comprendre son implémentation aide à ajuster les paramètres. L'exemple suivant montre comment appliquer NMS en utilisant la PyTorch library :
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 vs détection de bout en bout#
Traditionnellement, NMS a été une étape de « nettoyage » obligatoire située en dehors du réseau de neurones principal, ajoutant de l'inference latency. Cependant, le domaine évolue vers des architectures de bout en bout.
- NMS standard : Un processus heuristique qui nécessite un ajustement manuel du seuil IoU. Si le seuil est trop bas, des objets valides proches les uns des autres risquent d'être manqués (recall faible). S'il est trop haut, des doublons subsistent (precision faible).
- Modèles de bout en bout : Les modèles de nouvelle génération comme YOLO26 sont conçus pour être nativement de bout en bout. Ils apprennent à prédire exactement une boîte par objet pendant l'entraînement, internalisant ainsi efficacement le processus NMS. Cela élimine le besoin d'un post-traitement externe, ce qui se traduit par des vitesses d'inférence plus rapides et des pipelines de déploiement plus simples sur la Ultralytics Platform.
Concepts associés#
- Soft-NMS : Une variante où les boîtes qui se chevauchent ne sont pas strictement supprimées, mais voient leurs scores de confiance réduits. Cela permet à des objets qui se chevauchent quelque peu (comme des personnes dans une foule) d'être tout de même détectés si leurs scores restent suffisamment élevés après la décote.
- Anchor Boxes : Formes de boîtes prédéfinies utilisées par de nombreux détecteurs pour estimer la taille des objets. NMS est appliqué aux prédictions finales affinées à partir de ces ancres.
- Intersection over Union (IoU) : La formule mathématique utilisée par NMS pour déterminer dans quelle mesure deux boîtes se chevauchent, agissant comme le seuil de décision pour la suppression.






