TNI+VO · Exercice de Programmation

EP09_06 — 🔴 Pipeline intégré : de la détection à la mesure du monde réel

9.10.6 EP09_06 🔴 Pipeline intégré : de la détection à la mesure du monde réel

Cet exercice final intègre les deux exercices de détection et le principe de photogrammétrie présenté dans la section « Photogrammétrie et référence d’échelle » — exactement le même calcul que celui implémenté dans la figure de mesure par référence d’échelle de ce chapitre. Le scénario reproduit une situation réaliste : un détecteur (Faster R-CNN ou YOLO) génère plusieurs boîtes candidates se chevauchant pour le même objet d’intérêt ; après les avoir filtrées par NMS, la boîte survivante de plus haute confiance est utilisée, avec une boîte de référence de largeur réelle connue (comme la carte de \(8{,}56\) cm), pour estimer les dimensions réelles de l’objet détecté.

9.10.6.1 📋 Directives d’implémentation

  1. Référence connue : Lire la valeur réelle \(L_{ref}\) (largeur réelle de l’objet de référence, en cm), puis les quatre réels \(x_1\ y_1\ x_2\ y_2\) de sa boîte englobante en pixels (déjà connue, sans nécessité de détection).
  2. Candidates de l’objet à mesurer : Lire l’entier \(N\) (nombre de boîtes candidates produites par le détecteur pour l’objet d’intérêt) et le seuil réel \(\tau\) ; puis lire les \(N\) lignes de boîtes candidates, chacune avec \(x_1\ y_1\ x_2\ y_2\ \text{score}\).
  3. Étape 1 — NMS : Appliquer exactement l’algorithme de Suppression Non Maximale de l’EP09_04 aux \(N\) boîtes candidates, en utilisant le seuil \(\tau\), pour éliminer les détections redondantes du même objet.
  4. Étape 2 — Sélection de la boîte finale : Après le NMS, la boîte de plus grand score parmi celles conservées est la détection finale de l’objet (l’entrée garantit que toutes les boîtes candidates correspondent à un seul objet physique, donc la première boîte sélectionnée par le NMS est déjà le résultat final).
  5. Étape 3 — Mesure par référence d’échelle : Calculer le rapport \(\text{cm/pixel} = L_{ref} / \text{largeur de la référence en pixels}\) et l’appliquer à la fois à la largeur et à la hauteur (en pixels) de la boîte finale de l’objet, obtenant ainsi ses dimensions réelles estimées en centimètres.
  6. Sortie : D’abord, une ligne par boîte conservée après le NMS (même format que l’EP09_04) : indice score. Ensuite, la ligne Total conservées : X. Enfin, la ligne Objet : L x A cm, où \(L\) et \(A\) sont la largeur et la hauteur estimées de l’objet, chacune avec 2 décimales.

9.10.6.2 📌 Contraintes de calcul

  • Réutiliser intégralement le NMS de l’EP09_04 — même règle de départage, même critère de suppression (\(\text{IoU} > \tau\)).
  • La référence ne passe pas par le NMS : sa boîte est donnée directement, sans candidates concurrentes.
  • Rapport unique pour la largeur et la hauteur : comme dans la figure de photogrammétrie du chapitre, le même rapport cm/pixel (dérivé de la largeur de la référence) est appliqué à la fois à la largeur et à la hauteur de l’objet — il n’y a pas de calibration verticale séparée.

9.10.6.3 🧠 Fondement théorique

Étape Concept du chapitre
Plusieurs boîtes candidates Sortie brute d’un détecteur comme le Faster R-CNN ou le YOLO, avant le post-traitement
NMS (EP09_04) Filtre les détections redondantes, ne conservant que la plus fiable pour l’objet
Référence d’échelle connue Même principe que la carte de \(8{,}56\) cm utilisée dans la section « Photogrammétrie et référence d’échelle »
Conversion pixel → centimètre Règle de trois simple : \(\text{cm/pixel} = L_{ref} / w_{ref\_px}\), appliquée à la boîte finale de l’objet

9.10.6.4 🧩 Méthodes de morph.py pouvant aider

  • mm.IoU(boxA, boxB) — la même fonction suggérée dans l’EP09_04, ici réutilisée dans l’étape de NMS de ce pipeline intégré (rappelez-vous de la conversion de format : \(w = x_2-x_1\), \(h = y_2-y_1\)).
  • Si vous avez déjà résolu l’EP09_04 en encapsulant le NMS dans une fonction dédiée, c’est le moment idéal de réutiliser ce code — l’intégration de modules déjà testés individuellement est exactement la pratique d’ingénierie que cet exercice veut renforcer.

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

Entrée :

  • Ligne 1 : Réel \(L_{ref}\).
  • Ligne 2 : \(x_1\ y_1\ x_2\ y_2\) de la boîte de référence.
  • Ligne 3 : Entier \(N\) et réel \(\tau\).
  • \(N\) lignes suivantes : \(x_1\ y_1\ x_2\ y_2\ \text{score}\) des boîtes candidates de l’objet.

Sortie :

  • Une ligne par boîte conservée après le NMS : indice score.
  • Ligne suivante : Total conservées : X.
  • Dernière ligne : Objet : L x A cm.

9.10.6.6 📌 Exemples

Entrée Sortie Observation
8.56
30 200 170 288
3 0.5
250 100 470 250 0.92
255 105 468 245 0.88
600 600 650 650 0.40
0 0.9200
2 0.4000
Total conservées : 2
Objet : 13.45 x 9.17 cm
La boîte 1 est supprimée car elle chevauche fortement la boîte 0 ; la détection finale de l’objet est la boîte 0.
🎮 Simulateur : Pipeline intégré — De la détection à la mesure 🔴 Photogrammétrie
Boîte sélectionnée Boîte masquée Référence Objet final
8.56
0.50
Modèle
🎯 Visualisation du pipeline
📋 Pipeline étape par étape
Figure 9.48: Simulateur EP09_06 : Pipeline Intégré — Détection à la Mesure du Monde Réel
%%writefile EP09_06.py
# Code Python
Overwriting EP09_06.py
TestSuite("EP09_06.py").run()
✔️ EP09_06.cases existe déjà dans casos/
📋 3 cas chargé(s) depuis casos/EP09_06.cases

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