EDI+VA · Esercizio di Programmazione

EP08_11 — 🔴 Classificazione e Validazione di Oggetti con Riferimento di Bounding Box

8.14.11 EP08_11 🔴 Classificazione e Validazione di Oggetti con Riferimento di Bounding Box

In questo esercizio, l’obiettivo è elaborare un’immagine in scala di grigi contenente molteplici oggetti geometrici, estrarne le proprietà con mm.measure e validare le scatole delimitatrici (bounding boxes) rilevate rispetto a un riferimento reale (Ground Truth - GT) fornito in input, utilizzando la metrica IoU (Intersection over Union).

8.14.11.1 📋 Linee Guida di Implementazione

  1. Lettura dell’Immagine: Leggere le dimensioni \(H \times W\) e la matrice \(H \times W\) di pixel dell’immagine in scala di grigi.
  2. Pipeline Morfologico: Binarizzare l’immagine tramite il metodo di Otsu (mm.threshold) e visualizzare la maschera binarizzata risultante utilizzando mm.drawImg.
  3. Lettura del Riferimento Reale (Ground Truth):
  • Leggere la quantità \(G\) di scatole delimitatrici del riferimento.
  • Se \(G > 0\), leggere \(G\) righe contenenti 5 valori ciascuna: id xmin_norm ymin_norm xmax_norm ymax_norm.
  • Conversione delle Coordinate: Le coordinate del riferimento sono normalizzate nell’intervallo \([0.0, 1.0]\). Per convertirle in pixel sulla griglia dell’immagine:

\[x_{\min} = \lfloor \text{xmin\_norm} \times W \rfloor, \quad y_{\min} = \lfloor \text{ymin\_norm} \times H \rfloor\]

\[w = \lfloor \text{xmax\_norm} \times W \rfloor - x_{\min}, \quad h = \lfloor \text{ymax\_norm} \times H \rfloor - y_{\min}\]

  1. Estrazione delle Metriche e Calcolo dell’IoU:
  • Estrarre le proprietà delle istanze con mm.measure(img_bin, precision=0.02).
  • Per ogni bounding box rilevata \((x, y, w, h)\), calcolare la sovrapposizione IoU rispetto alle scatole del riferimento e definire hits = 1 se esiste una corrispondenza con \(\text{IoU} \ge 0.50\), oppure hits = 0 in caso contrario.
  1. Output: Ordinare le istanze per posizione (bbox[0], bbox[1]) e stampare la tabella CSV con la colonna aggiuntiva hits.
    • Per ordinare, usare medidas.sort(key=lambda m: (m['bbox'][1], m['bbox'][0])), con medidas = mm.measure(img).

8.14.11.2 🧠 Fondamenti Teorici e Conversione

Concetto Formula / Operazione Descrizione
BBox Rilevata \((x, y, w, h)\) tramite mm.measure Scatola delimitatrice calcolata sulla griglia discreta in pixel interi.
BBox Riferimento (GT) \((x_{\min}, y_{\min}, w, h)\) convertiti Scatola reale fornita in input in coordinate relative \([0.0, 1.0]\).
IoU (Intersection over Union) \(\text{IoU} = \frac{\text{Area}(B_{\text{DET}} \cap B_{\text{GT}})}{\text{Area}(B_{\text{DET}} \cup B_{\text{GT}})}\) Valuta il tasso di sovrapposizione delle scatole. È considerata valida se \(\text{IoU} \ge 0.50\).
Stato di Validazione (hits) \(1\) se \(\max(\text{IoU}) \ge 0.50\), altrimenti \(0\) Indicatore binario di correttezza del rilevatore rispetto al riferimento.

8.14.11.3 📦 Specifica di Input e Output (VPL)

Input:

  • Riga 1: Interi \(H\) e \(W\) (dimensioni della matrice).
  • Successive \(H\) righe: \(W\) interi (\(0\) a \(255\)) che rappresentano l’immagine in scala di grigi.
  • Riga \(H + 2\): Intero \(G\) (quantità di scatole del riferimento reale).
  • Successive \(G\) righe: 5 valori numerici per riga: id xmin_norm ymin_norm xmax_norm ymax_norm (dove le coordinate sono valori fluttuanti tra \(0.0\) e \(1.0\)).

Output:

  1. Matrice binarizzata visualizzata tramite mm.drawImg(img_bin).
  2. Intestazione CSV: id,area,perimeter,cx,cy,x,y,w,h,circularity,solidity,vertices,hits
  3. Una riga CSV per oggetto rilevato contenente le sue proprietà formattate e l’indicatore hits (\(1\) o \(0\)).

8.14.11.4 📌 Esempi

Input Output
10 20
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 180 0 0 0 0 0 0 0 0 180 180 180 0 0 0 0 0
0 0 180 180 180 0 0 0 0 0 0 0 180 180 180 0 0 0 0 0
0 0 0 180 0 0 0 0 0 0 0 0 180 180 180 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2
1 0.10 0.30 0.25 0.60
2 0.60 0.30 0.75 0.60
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0
0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
id area perimeter cx cy x y w h circularity solidity vertices hits
1 2.0 5.7 3.0 4.0 2 3 3 3 0.79 1.000 4 1
2 4.0 8.0 13.0 4.0 12 3 3 3 0.79 1.000 4 1
🧮 Simulatore EP08_11: Bounding Boxes e Confronto IoU con Controlli Indipendenti Validazione BBox GT vs DET
MODALITÀ DI VISUALIZZAZIONE
VISUALIZZAZIONE DELLE BOUNDING BOXES
LEGENDA DELLE BBOXES:
Riferimento Reale (GT)
Rilevazione Accettata (IoU ≥ 0.5)
Rilevazione Rifiutata (IoU < 0.5)
Sovrapposizione di BBoxes
VISUALIZZAZIONE DELLA MATRICE DI PIXEL
MISURE, CLASSIFICAZIONE GEOMETRICA E CONFRONTO IoU CON RIFERIMENTO
id classe area solidità vertici bbox det (x,y,w,h) bbox gt (x,y,w,h) IoU stato (IoU ≥ 0.5)
Figura 8.25: Simulatore EP08_11: Classificazione Geometrica con Controlli Indipendenti di Overlay BBox (GT e DET)
%%writefile EP08_11.py
# Codice Python
Overwriting EP08_11.py
TestSuite("EP08_11.py").run()
✔️ EP08_11.cases esiste già in casos/
📋 3 caso/i caricato/i da casos/EP08_11.cases

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