6.14.1 EP06_01 🟢 Valutazione della Segmentazione tramite IoU (Intersection over Union)
Nel corso di questo capitolo, diverse fasi del pipeline producono maschere binarie, come nella segmentazione di documenti, nella localizzazione di QRCodes e nel rilevamento di difetti. Per valutare oggettivamente la qualità di queste segmentazioni, è necessario confrontarle con una maschera di riferimento (ground truth).
Una delle metriche più utilizzate a questo scopo è la IoU (Intersection over Union, o Intersezione su Unione), definita come il rapporto tra l’area di intersezione e l’area di unione di due maschere binarie. Quanto maggiore è il valore della IoU, tanto maggiore è la concordanza tra la segmentazione prodotta dall’algoritmo e il riferimento.
6.14.1.1 📋 Linee Guida di Implementazione
- Dimensioni: Leggere gli interi \(L\) (numero di righe) e \(C\) (numero di colonne).
- Maschera di riferimento: Leggere gli \(L \times C\) elementi binari (0 o 1) della matrice
ref. - Maschera predetta: Leggere gli \(L \times C\) elementi binari (0 o 1) della matrice
pred. - Intersezione: Contare il numero di posizioni \((i,j)\) per le quali
ref[i][j] = 1epred[i][j] = 1. - Unione: Contare il numero di posizioni \((i,j)\) per le quali
ref[i][j] = 1opred[i][j] = 1. - Caso degenere: Se l’unione è uguale a \(0\), definire \(\mathrm{IoU}=1{,}0\), poiché entrambe le maschere sono vuote.
- Calcolo: Se l’unione è maggiore di zero, calcolare
\[ \mathrm{IoU}= \frac{|\mathrm{Intersezione}|} {|\mathrm{Unione}|}. \]
- Classificazione: Determinare la classificazione qualitativa utilizzando il valore di IoU prima dell’arrotondamento.
- Arrotondamento: Visualizzare la IoU con quattro cifre decimali.
- Output: Stampare, in quest’ordine, l’intersezione, l’unione, la IoU e la classificazione.
6.14.1.2 📌 Vincoli Computazionali
- Se l’unione è uguale a \(0\), non deve essere eseguita la divisione; la IoU deve essere definita come \(1{,}0\).
- Le fasce di classificazione utilizzano confronti non stretti (\(\geq\)).
- La classificazione deve essere eseguita utilizzando il valore della IoU a piena precisione, prima dell’arrotondamento per la visualizzazione.
6.14.1.3 🧠 Fondamento Teorico
La IoU è definita da
\[ \mathrm{IoU}= \frac{|R\cap P|} {|R\cup P|}, \]
dove:
- \(R\) rappresenta l’insieme dei pixel appartenenti alla maschera di riferimento;
- \(P\) rappresenta l’insieme dei pixel appartenenti alla maschera predetta;
- \(|R\cap P|\) corrisponde al numero di pixel appartenenti simultaneamente a entrambe le maschere;
- \(|R\cup P|\) corrisponde al numero di pixel appartenenti ad almeno una delle maschere.
| Fascia di IoU | Classificazione | Interpretazione |
|---|---|---|
| \(\mathrm{IoU}\geq0{,}90\) | ECCELLENTE |
Concordanza molto elevata tra le maschere. |
| \(0{,}70\leq\mathrm{IoU}<0{,}90\) | BUONO |
Piccole differenze tra le maschere. |
| \(0{,}50\leq\mathrm{IoU}<0{,}70\) | ACCETTABILE |
Concordanza parziale tra le maschere. |
| \(\mathrm{IoU}<0{,}50\) | SCARSO |
Bassa concordanza tra le maschere. |
La IoU dipende solo dalla sovrapposizione tra le maschere e, pertanto, è indipendente dalla dimensione dell’immagine.
6.14.1.4 📦 Specifica di Input e Output (VPL)
Input:
- Riga 1: intero \(L\).
- Riga 2: intero \(C\).
- Prossime \(L\) righe: elementi binari (0 o 1) della matrice
ref. - Prossime \(L\) righe: elementi binari (0 o 1) della matrice
pred.
Output:
- Riga 1:
Intersezione: X - Riga 2:
Unione: Y - Riga 3:
IoU: Z - Riga 4:
Classificazione: NOME
Il valore di IoU deve essere stampato con quattro cifre decimali.
6.14.1.5 📌 Esempi
| Input | Output | Osservazione |
|---|---|---|
| 2 2 1 1 0 0 1 0 0 0 |
Intersezione: 1 Unione: 2 IoU: 0.5000 Classificazione: ACCETTABILE |
La metà della regione di riferimento è stata segmentata correttamente. |
| 2 2 0 0 0 0 0 0 0 0 |
Intersezione: 0 Unione: 0 IoU: 1.0000 Classificazione: ECCELLENTE |
Entrambe le maschere sono vuote; per convenzione, \(\mathrm{IoU}=1{,}0\). |
%%writefile EP06_01.py
# Codice PythonOverwriting EP06_01.py
TestSuite("EP06_01.py").run()✔️ EP06_01.cases esiste già in casos/
📋 5 caso/i caricato/i da casos/EP06_01.cases
🔍 Test di Python: EP06_01.py
⚠️ EP06_01.py: file vuoto (meno di 3 righe). Test saltati.