Aller au contenu principal

Module 4 — Ancres, suppression des non-maxima et seuils

Les modules 2 et 3 ont présenté deux familles de détecteurs. Aucune des deux n'est utilisable brute : les milliers de boîtes qui sortent doivent être filtrées et désambiguïsées. Ce module explique les trois mécanismes qui décident du visage réel du détecteur — les ancres, la suppression des non-maxima et les deux seuils — et pourquoi jouer sur l'un sans comprendre les autres donne systématiquement de mauvais résultats.

Ce qu'est une ancre

Une ancre est un rectangle de référence à une position et à des dimensions fixées. Le détecteur ne prédit pas une boîte à partir de zéro : il prédit une correction par rapport à l'ancre.

Sur une carte de caractéristiques 20 × 20, on pose typiquement neuf ancres par cellule : trois tailles (petite, moyenne, grande) et trois rapports d'aspect (carré, allongé horizontalement, allongé verticalement). Cela fait 3 600 ancres pour une seule échelle. Un modèle multi-échelle en cumule plusieurs dizaines de milliers.

Chaque ancre reçoit deux prédictions :

  • Une correction (tx,ty,tw,th)(t_x, t_y, t_w, t_h) à appliquer à l'ancre.
  • Un score de confiance par classe.

La correction typique est :

bx=ax+awtx,by=ay+ahtyb_x = a_x + a_w \cdot t_x, \quad b_y = a_y + a_h \cdot t_y

bw=awexp(tw),bh=ahexp(th)b_w = a_w \cdot \exp(t_w), \quad b_h = a_h \cdot \exp(t_h)

Les exponentielles garantissent que la largeur et la hauteur restent positives, quelle que soit la valeur prédite.

Détecteurs sans ancre

Les modèles sans ancre — FCOS, CenterNet, YOLOv8 — prédisent directement la boîte par cellule. À chaque position de la grille, le modèle prédit un centre, une largeur, une hauteur et une classe. Cela évite le choix arbitraire des tailles d'ancre, qui variait sensiblement d'un jeu à l'autre.

Le prix est un travail de conception un peu plus fin sur les échelles couvertes par chaque niveau du réseau. YOLOv8 assigne, à chaque position, un objet à un niveau selon sa taille : les grandes voitures sont vues à un niveau grossier, les piétons lointains à un niveau fin. Sans cette répartition, un niveau doit couvrir toutes les tailles et devient un compromis médiocre partout.

La suppression des non-maxima, pas à pas

Après les prédictions, un même objet est souvent couvert par dix à cent boîtes proches. La suppression des non-maxima (NMS) ne garde que la meilleure et supprime les redondantes. L'algorithme tient en cinq lignes :

import numpy as np

def iou(a, b):
x1 = max(a[0], b[0]); y1 = max(a[1], b[1])
x2 = min(a[2], b[2]); y2 = min(a[3], b[3])
inter = max(0, x2 - x1) * max(0, y2 - y1)
union = (a[2]-a[0])*(a[3]-a[1]) + (b[2]-b[0])*(b[3]-b[1]) - inter
return inter / union if union > 0 else 0.0

def nms(boites, scores, seuil_iou=0.5):
ordre = np.argsort(scores)[::-1]
gardees = []
while len(ordre) > 0:
i = ordre[0]
gardees.append(i)
ordre = [j for j in ordre[1:] if iou(boites[i], boites[j]) < seuil_iou]
return gardees

Lecture pas à pas :

  1. Trier les boîtes par score décroissant.
  2. Prendre la première, la garder.
  3. Supprimer toutes celles dont l'IoU avec la gardée dépasse le seuil.
  4. Recommencer avec la suivante encore en liste.

La NMS est appliquée par classe dans presque toutes les implémentations : deux boîtes qui se chevauchent mais portent des classes différentes coexistent, ce qui est ce qu'on veut sur une voiture et son piéton à côté.

Deux seuils qui décident de tout

Après la NMS, deux seuils règlent le compromis entre précision et rappel :

  • Le seuil de confiance ss : on ne conserve que les boîtes dont le score dépasse ss. Un ss élevé donne peu de faux positifs mais rate les objets peu visibles.
  • Le seuil d'IoU de NMS τ\tau : deux boîtes gardent leur redondance quand leur IoU dépasse τ\tau. Un τ\tau élevé garde plus de boîtes, ce qui augmente le rappel au prix de doublons.

Leurs effets se combinent, et l'erreur classique consiste à les régler séparément.

SituationAction
Trop de faux positifsaugmenter ss
Objets manquésdiminuer ss
Doubles détections sur un même objetdiminuer τ\tau
Deux objets collés fusionnésaugmenter τ\tau

Sur le carrefour, deux motos en file l'une derrière l'autre à 10 mètres d'écart peuvent se chevaucher visuellement. Un τ\tau à 0,45 par défaut tend à les fusionner en une seule détection ; monter à 0,6 les préserve, au prix de doublons ponctuels sur les grandes voitures.

Précision et rappel : les définitions à réciter

À un seuil ss donné, une détection est un vrai positif si elle correspond à une boîte de vérité avec un IoU au-dessus d'un seuil de validation (souvent 0,5 pour la mAP à 0,5). Sinon c'est un faux positif. Une boîte de vérité qui n'est appariée à aucune détection est un faux négatif.

preˊcision=VPVP+FP,rappel=VPVP+FN\text{précision} = \frac{\text{VP}}{\text{VP} + \text{FP}}, \quad \text{rappel} = \frac{\text{VP}}{\text{VP} + \text{FN}}

Balayer ss de 1 à 0 et tracer précision contre rappel donne la courbe précision-rappel, qui est la base des métriques du module 5.

Soft-NMS et alternatives

La NMS supprime brutalement les boîtes redondantes. Soft-NMS les pénalise proportionnellement à leur chevauchement, ce qui aide sur les scènes très denses (foules, essaims d'objets) où plusieurs vrais objets ont un IoU proche du seuil. Les détecteurs comme DETR vont plus loin en supprimant complètement la NMS : ils prédisent un ensemble de boîtes avec une perte de Hungarian matching qui évite les doublons dès l'apprentissage.

Pour la majorité des projets, la NMS standard reste la valeur par défaut raisonnable. Passer à Soft-NMS se justifie sur un jeu où les objets se touchent régulièrement.

Un mauvais réglage biaise les métriques

Un seuil de confiance s=0,5s = 0{,}5 écrit en dur dans le script d'évaluation biaise la précision et le rappel : la métrique standard mAP les calcule sur toute la plage de ss. Ne fixez jamais ss dans l'évaluation ; ce seuil n'est utile qu'à l'inférence en production. Confondre les deux fait apparaître des variations de mAP qui ne reflètent que le seuil choisi.

Faire un balayage à deux dimensions

Sur votre jeu de validation, mesurez la précision et le rappel pour chaque couple (s,τ){0,3,0,5,0,7}×{0,3,0,5,0,7}(s, \tau) \in \{0{,}3, 0{,}5, 0{,}7\} \times \{0{,}3, 0{,}5, 0{,}7\}. Un tableau 3 × 3 vous donne en un regard le compromis effectif de votre détecteur, ce qu'aucun chiffre unique ne peut faire.

En résumé

  • Une ancre est un rectangle de référence dont le modèle apprend une correction, alors qu'un détecteur sans ancre prédit directement la boîte à chaque position — YOLOv8, FCOS et CenterNet sont sans ancre.
  • La NMS trie les boîtes par score puis élimine celles dont l'IoU dépasse un seuil, par classe, jusqu'à épuisement. Sans elle, une voiture est détectée dix fois.
  • Le seuil de confiance ss contrôle précision et rappel globaux ; le seuil d'IoU τ\tau de la NMS contrôle la coexistence de deux objets proches. Les deux se règlent ensemble, jamais séparément.
  • L'évaluation standard balaie ss sur toute la plage ; fixer ss dans le script d'évaluation invalide la mAP et fait croire à des variations qui n'en sont pas.

Module suivant : les métriques de détection — IoU calculé à la main, courbe précision-rappel, AP par classe, mAP à 0,5 et 0,5-0,95, et lecture d'un rapport COCO.