TNI+VO · Exercice de Programmation

EP08_04 — 🟢 IoU et Suppression des Non-Maximums (NMS)

8.14.4 EP08_04 🟢 IoU et Suppression des Non-Maximums (NMS)

La figure de cette section a montré l’effet de la Suppression des Non-Maximums sur un ensemble de boîtes produites par un détecteur de type sliding window : de multiples détections redondantes par objet ont été réduites à une seule boîte par objet. Vous avez été chargé de réimplémenter, octet par octet, les deux fonctions qui ont produit ce résultat — calcular_iou et supressao_nao_maximos — afin de confirmer, de vos propres mains, exactement les nombres que le chapitre a présentés.

8.14.4.1 📋 Directives d’implémentation

  1. Entrée : Lire l’entier \(N\) (nombre de boîtes) et le réel \(\tau\) (seuil d’IoU). Ensuite, lire \(N\) lignes, chacune avec cinq réels \(x_{min}\ y_{min}\ x_{max}\ y_{max}\ \text{score}\).

  2. Intersection sur Union : Pour deux boîtes \(A\) et \(B\), \[ \mathrm{IoU}(A,B) = \frac{\text{aire}(A \cap B)}{\text{aire}(A \cup B)}, \] avec une aire d’intersection nulle lorsque les boîtes ne se chevauchent pas.

  3. Algorithme de NMS (exactement comme décrit dans le chapitre) :

    1. Trier les boîtes par score décroissant (les égalités conservent l’ordre de lecture original).

    2. Sélectionner la boîte ayant le score le plus élevé parmi les restantes ; l’ajouter à la sortie et la retirer de la liste.

    3. Éliminer, de la liste restante, toutes les boîtes dont l’IoU avec la boîte sélectionnée est supérieur ou égal à \(\tau\) — seules les boîtes avec \(\mathrm{IoU} < \tau\) restent candidates.

    4. Répéter (b)–(c) jusqu’à ce que la liste des restantes soit vide.

  4. Sortie : Pour chaque boîte conservée, dans l’ordre où elle a été sélectionnée, imprimer son indice original (position de lecture, à partir de \(0\)) et son score, avec 2 décimales. À la fin, imprimer Total mantidas: X.

8.14.4.2 📌 Contraintes computationnelles

  • Attention au sens du seuil : contrairement à ce que l’on pourrait supposer, une boîte est supprimée lorsque \(\mathrm{IoU} \ge \tau\) (et non seulement lorsque \(\mathrm{IoU} > \tau\)) — suivez exactement ce critère, le même que celui du code de référence du chapitre.
  • Indices originaux : la sortie référence la position de lecture de chaque boîte dans l’entrée, et non sa position après le tri par score.
  • Aire sans ajout de 1 pixel : utilisez l’aire \(= (x_{max}-x_{min}) \times (y_{max}-y_{min})\), exactement comme dans le chapitre (sans l’ajustement « +1 » parfois utilisé dans d’autres conventions).

8.14.4.3 🧠 Fondements théoriques

Élément Rôle dans le post-traitement
IoU Quantifie le chevauchement spatial entre deux boîtes englobantes
Sliding window (Haar Cascade) Produit généralement plusieurs détections chevauchantes pour le même objet, à des positions et échelles proches
Seuil \(\tau\) Contrôle l’agressivité de la suppression : trop faible fusionne les objets proches ; trop élevé laisse passer les redondances
Tri par score Garantit que, parmi les boîtes redondantes, celle avec la plus grande confiance survive toujours

8.14.4.4 📦 Spécification d’entrée et de sortie (VPL)

Entrée :

  • Ligne 1 : Entier \(N\) et réel \(\tau\).
  • Lignes suivantes \(N\) : cinq réels \(x_{min}\ y_{min}\ x_{max}\ y_{max}\ \text{score}\).

Sortie :

  • Une ligne par boîte conservée, dans l’ordre de sélection : indice score (score avec 2 décimales).
  • Dernière ligne : Total mantidas: X.

8.14.4.5 📌 Exemples

Entrée Sortie Observation
5 0.4
50 50 150 150 0.90
60 55 155 145 0.75
58 60 160 150 0.60
300 300 400 420 0.95
310 305 395 415 0.70
3 0.95
0 0.90
Total mantidas: 2
Exactement l’exemple de la figure du chapitre : 5 boîtes redondantes (2 objets) deviennent 2 détections finales. L’IoU entre la 1re et la 2e boîtes est \(\approx 0{,}775\), bien au-dessus de \(\tau=0{,}4\).
🎮 Simulateur EP08_04 : IoU et suppression des non-maxima (NMS) Suppression si IoU ≥ τ
3
0.40
La boîte bleue (score plus élevé) a déjà été sélectionnée. Ajustez le chevauchement et le seuil τ pour vérifier la suppression de la boîte rouge (candidate).
–
Figure 8.18: Simulateur EP08_04: IoU et suppression des non-maximums
%%writefile EP08_04.py
# Code Python
Overwriting EP08_04.py
TestSuite("EP08_04.py").run()
✔️ EP08_04.cases existe déjà dans casos/
📋 6 cas chargé(s) depuis casos/EP08_04.cases

🔍 Test de Python : EP08_04.py
⚠️ EP08_04.py : fichier vide (moins de 3 lignes). Tests ignorés.