EDI+VA · Esercizio di Programmazione

EP09_06 — 🔴 Pipeline Integrato: Dalla Rilevazione alla Misurazione nel Mondo Reale

9.10.6 EP09_06 🔴 Pipeline Integrato: Dalla Rilevazione alla Misurazione nel Mondo Reale

Questo esercizio finale integra i due esercizi di rilevazione e il principio di fotogrammetria presentato nella sezione “Fotogrammetria e Riferimento di Scala” — esattamente lo stesso calcolo implementato nella figura di misurazione per riferimento di scala di questo capitolo. Lo scenario riproduce una situazione realistica: un rilevatore (Faster R-CNN o YOLO) genera diverse scatole candidate sovrapposte per lo stesso oggetto di interesse; dopo averle filtrate tramite NMS, la scatola sopravvissuta con maggiore confidenza viene utilizzata, insieme a una scatola di riferimento di larghezza reale nota (come la carta da \(8{,}56\) cm), per stimare le dimensioni reali dell’oggetto rilevato.

9.10.6.1 📋 Linee Guida di Implementazione

  1. Riferimento noto: Leggere il valore reale \(L_{ref}\) (larghezza reale dell’oggetto di riferimento, in cm) e successivamente i quattro reali \(x_1\ y_1\ x_2\ y_2\) della sua scatola delimitante in pixel (già nota, senza necessità di rilevazione).
  2. Candidati dell’oggetto da misurare: Leggere l’intero \(N\) (numero di scatole candidate prodotte dal rilevatore per l’oggetto di interesse) e la soglia reale \(\tau\); successivamente, leggere le \(N\) righe di scatole candidate, ciascuna con \(x_1\ y_1\ x_2\ y_2\ \text{score}\).
  3. Fase 1 — NMS: Applicare esattamente l’algoritmo di Soppressione Non Massima dell’EP09_04 alle \(N\) scatole candidate, utilizzando la soglia \(\tau\), per eliminare rilevazioni ridondanti dello stesso oggetto.
  4. Fase 2 — Selezione della scatola finale: Dopo il NMS, la scatola con il score più alto tra quelle mantenute è la rilevazione finale dell’oggetto (l’input garantisce che tutte le scatole candidate corrispondano a un singolo oggetto fisico, quindi la prima scatola selezionata dal NMS è già il risultato finale).
  5. Fase 3 — Misurazione per riferimento di scala: Calcolare il rapporto \(\text{cm/pixel} = L_{ref} / \text{larghezza del riferimento in pixel}\) e applicarlo sia alla larghezza che all’altezza (in pixel) della scatola finale dell’oggetto, ottenendo le sue dimensioni reali stimate in centimetri.
  6. Output: Prima, una riga per ogni scatola mantenuta dopo il NMS (stesso formato dell’EP09_04): índice score. Successivamente, la riga Total mantidas: X. Infine, la riga Objeto: L x A cm, dove \(L\) e \(A\) sono la larghezza e l’altezza stimate dell’oggetto, ciascuna con 2 cifre decimali.

9.10.6.2 📌 Vincoli Computazionali

  • Riutilizzare integralmente il NMS dell’EP09_04 — stessa regola di parità, stesso criterio di soppressione (\(\text{IoU} > \tau\)).
  • Il riferimento non passa attraverso il NMS: la sua scatola è data direttamente, senza candidati concorrenti.
  • Rapporto unico per larghezza e altezza: così come nella figura di fotogrammetria del capitolo, lo stesso rapporto cm/pixel (derivato dalla larghezza del riferimento) viene applicato sia alla larghezza che all’altezza dell’oggetto — non vi è calibrazione verticale separata.

9.10.6.3 🧠 Fondamenti Teorici

Fase Concetto del capitolo
Multiple scatole candidate Output grezzo di un rilevatore come Faster R-CNN o YOLO, prima della post-elaborazione
NMS (EP09_04) Filtra le rilevazioni ridondanti, preservando solo la più affidabile per l’oggetto
Riferimento di scala noto Stesso principio della carta da \(8{,}56\) cm utilizzata nella sezione “Fotogrammetria e Riferimento di Scala”
Conversione pixel → centimetro Regola del tre semplice: \(\text{cm/pixel} = L_{ref} / w_{ref\_px}\), applicata alla scatola finale dell’oggetto

9.10.6.4 🧩 Metodi di morph.py che possono aiutare

  • mm.IoU(boxA, boxB) — la stessa funzione suggerita nell’EP09_04, qui riutilizzata all’interno della fase di NMS di questo pipeline integrato (ricordarsi della conversione di formato: \(w = x_2-x_1\), \(h = y_2-y_1\)).
  • Se hai già risolto l’EP09_04 incapsulando il NMS in una funzione propria, questo è il momento ideale per riutilizzare quel codice — l’integrazione di moduli già testati singolarmente è esattamente la pratica ingegneristica che questo esercizio vuole rafforzare.

9.10.6.5 📦 Specifica di Input e Output (VPL)

Input:

  • Riga 1: Reale \(L_{ref}\).
  • Riga 2: \(x_1\ y_1\ x_2\ y_2\) della scatola di riferimento.
  • Riga 3: Intero \(N\) e reale \(\tau\).
  • Prossime \(N\) righe: \(x_1\ y_1\ x_2\ y_2\ \text{score}\) delle scatole candidate dell’oggetto.

Output:

  • Una riga per ogni scatola mantenuta dopo il NMS: índice score.
  • Riga successiva: Total mantidas: X.
  • Ultima riga: Objeto: L x A cm.

9.10.6.6 📌 Esempi

Input Output Osservazione
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 mantidas: 2
Objeto: 13.45 x 9.17 cm
La scatola 1 viene soppressa perché si sovrappone fortemente alla scatola 0; la rilevazione finale dell’oggetto è la scatola 0.
🎮 Simulatore: Pipeline Integrato — Dal Rilevamento alla Misurazione 🔴 Fotogrammetria
Casella selezionata Casella soppressa Riferimento Oggetto finale
8.56
0.50
Modello
🎯 Visualizzazione del Pipeline
📋 Pipeline Passo dopo Passo
Figura 9.48: Simulatore EP09_06: Pipeline Integrato — Rilevamento alla Misurazione del Mondo Reale
%%writefile EP09_06.py
# Codice Python
Overwriting EP09_06.py
TestSuite("EP09_06.py").run()
✔️ EP09_06.cases esiste già in casos/
📋 3 caso/i caricato/i da casos/EP09_06.cases

🔍 Test di Python: EP09_06.py
⚠️ EP09_06.py: file vuoto (meno di 3 righe). Test saltati.