7.13. Suppression des non-maxima

Un réseau de détection produit généralement plusieurs boîtes candidates qui se chevauchent autour d’un même objet réel : chaque ancre proche de l’objet se déclenche avec un score similaire, et le post-traitement les voit toutes. La suppression des non-maxima (NMS) est l’étape qui transforme cet amas en une seule boîte.

L’algorithme est court : on trie les boîtes candidates par score, on prend celle ayant le score le plus élevé, on supprime toutes les autres boîtes qui la chevauchent au-delà d’un seuil choisi, puis on prend la suivante parmi celles qui restent, et on recommence. La mesure de chevauchement est l”intersection sur union (IoU) – la surface commune de deux boîtes divisée par leur surface combinée, une valeur comprise entre 0 (aucun chevauchement) et 1 (boîtes identiques). L’argument du constructeur nms_threshold présent sur chaque post-traitement fourni est le seuil au-delà duquel les boîtes sont considérées comme des doublons d’une boîte déjà conservée.

À gauche, trois boîtes englobantes qui se chevauchent autour d'un seul sujet, étiquetées avec les scores 0.92, 0.83 et 0.71. Une flèche pointe vers la droite, où une seule boîte survivante subsiste avec le score 0.92. Les deux boîtes au score plus faible sont supprimées par celle au score plus élevé car leur intersection sur union avec elle dépasse le seuil.

La NMS réduit un amas de détections qui se chevauchent à celle ayant le score le plus élevé.

7.13.1. Soft-NMS

La classe ml.utils.NMS fournie implémente la Soft-NMS, un raffinement qui atténue le score d’une boîte qui se chevauche d’une quantité dépendant de l’ampleur du chevauchement, plutôt que de supprimer la boîte purement et simplement. Si le score abaissé tombe sous le seuil, la boîte est supprimée ; sinon, elle survit avec le score réduit et entre en concurrence au tour suivant.

Le paramètre nms_sigma contrôle l’agressivité de l’atténuation. Avec un nms_sigma faible (la valeur par défaut fournie de 0.1), l’atténuation est forte : une boîte qui se chevauche fortement voit son score ramené à presque zéro et la Soft-NMS se réduit à la NMS classique. Avec un nms_sigma plus grand, l’atténuation est douce et les boîtes qui se chevauchent appartenant à des objets différents survivent plus souvent, ce qui compte lorsque des objets réels de la même classe se chevauchent réellement (une foule de visages, un amas de paumes).

Régler nms_sigma sur <= 0 désactive entièrement l’atténuation : les boîtes qui se chevauchent passent avec leurs scores d’origine, et seul le seuil de score les filtre.

7.13.2. En construire un directement

Chaque post-traitement fourni construit une nouvelle NMS par inférence, y ajoute chaque candidat, et appelle get_bounding_boxes() à la fin. Un post-traitement personnalisé suit le même modèle

from ml.utils import NMS

iw = model.input_shape[0][2]
ih = model.input_shape[0][1]

nms = NMS(iw, ih, inputs[0].roi)
for box, score, class_idx in candidates:
    nms.add_bounding_box(box.xmin, box.ymin,
                         box.xmax, box.ymax,
                         score, class_idx)
result = nms.get_bounding_boxes(threshold=nms_threshold,
                                sigma=nms_sigma)

Le constructeur prend la largeur et la hauteur d’entrée du réseau en pixels ainsi que la ROI de l’image d’origine sur laquelle le modèle a été exécuté ; add_bounding_box() prend les coordonnées de boîte dans cet espace de pixels d’entrée du réseau, et get_bounding_boxes() reprojette les survivantes vers les coordonnées de l’image en utilisant la ROI. Le remappage tient compte automatiquement de l”étirement de normalisation – la même ROI que celle vue par le prédicteur est utilisée pour reprojeter les boîtes – de sorte que les boîtes retournées sont prêtes à être dessinées sur la trame capturée.

La forme retournée est une liste de listes par classe, indexée par le label_index passé à add_bounding_box. Les listes de classes vides sont préservées afin que l’index corresponde à l’index de classe du modèle ; enumerate(result) parcourt les classes en même temps que leurs détections.