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
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}\).
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.
Algorithme de NMS (exactement comme décrit dans le chapitre) :
Trier les boîtes par
scoredécroissant (les égalités conservent l’ordre de lecture original).Sélectionner la boîte ayant le score le plus élevé parmi les restantes ; l’ajouter à la sortie et la retirer de la liste.
É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.
Répéter (b)–(c) jusqu’à ce que la liste des restantes soit vide.
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, imprimerTotal 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\). |
%%writefile EP08_04.py
# Code PythonOverwriting 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.