EDI+VA · Esercizio di Programmazione

EP09_04 — 🟡 Intersezione su Unione (IoU) e Soppressione dei Non-Massimi (NMS)

9.10.4 EP09_04 🟡 Intersezione su Unione (IoU) e Soppressione dei Non-Massimi (NMS)

I modelli di rilevamento degli oggetti possono produrre diverse bounding box candidate per lo stesso oggetto, con posizioni e punteggi di confidenza differenti. La fase di post-elaborazione responsabile dell’eliminazione di queste rilevazioni ridondanti è la Soppressione dei Non-Massimi (NMS), la cui operazione fondamentale utilizza la metrica di Intersezione su Unione (IoU).

La NMS utilizza questa misura per decidere quali box devono essere mantenute. In generale, la box con la confidenza più alta viene selezionata per prima; successivamente, le box che presentano un’IoU superiore a una certa soglia con la box selezionata sono considerate ridondanti e vengono rimosse. Il processo viene ripetuto finché non rimangono box candidate.

In questo esercizio, dovrai implementare l’algoritmo NMS da zero, calcolando l’IoU tra le box e applicando successivamente il criterio di selezione e soppressione per produrre l’insieme finale di rilevazioni.

9.10.4.1 📋 Linee Guida di Implementazione

  1. Input: Leggere l’intero \(N\) (numero di box candidate) e la soglia reale \(\tau\) (soglia IoU per la soppressione), sulla stessa riga.

  2. Box: Leggere \(N\) righe, ciascuna con cinque valori reali:

    x1 y1 x2 y2 score

    dove \((x_1,y_1)\) rappresenta l’angolo superiore sinistro, \((x_2,y_2)\) l’angolo inferiore destro e score il punteggio di confidenza.

  3. Intersezione su Unione: Per due box \(A\) e \(B\),

    \[ IoU(A,B)= \frac{\operatorname{Area}(A\cap B)} {\operatorname{Area}(A\cup B)}. \]

    L’area di intersezione deve essere calcolata dalla sovrapposizione degli intervalli in \(x\) e \(y\). Se non c’è sovrapposizione, l’area di intersezione è zero.

  4. Algoritmo greedy di NMS:

    1. Ordina le box per score decrescente. In caso di parità, mantieni l’ordine originale di lettura.

    2. Seleziona la box con il punteggio più alto tra le box rimanenti e aggiungila all’insieme di output.

    3. Calcola l’IoU tra la box selezionata e tutte le box ancora rimanenti. Sopprimi le box per cui

    \[ \text{IoU} > \tau. \]

    1. Ripeti i passaggi (b) e (c) finché non rimangono box.
  5. Output: Per ogni box mantenuta, nell’ordine in cui è stata selezionata, stampa il suo indice originale (posizione di lettura, a partire da \(0\)) e il suo score, formattato con 4 cifre decimali. Alla fine, stampa:

    Totale mantenute: X

9.10.4.2 📌 Vincoli Computazionali

  • Soppressione stretta: solo le box con \(\text{IoU} > \tau\) vengono soppresse. Le box con \(\text{IoU}=\tau\) vengono mantenute.
  • Indici originali: l’output fa riferimento alla posizione in cui ogni box è stata letta nell’input (a partire da \(0\)), non alla sua posizione dopo l’ordinamento.
  • Ordinamento stabile: in caso di score uguali, deve essere preservato l’ordine originale di lettura.
  • Rettangoli allineati agli assi: tutte le box sono specificate da due angoli, con \(x_1 < x_2\) e \(y_1 < y_2\) garantiti nell’input.
  • Coordinate e punteggi: i valori reali possono essere positivi o negativi, secondo i limiti definiti dall’input, ma le dimensioni delle box sono sempre positive.

9.10.4.3 🧠 Fondamento Teorico

Elemento Ruolo nella post-elaborazione della rilevazione
IoU Quantifica la sovrapposizione spaziale tra due box; \(\text{IoU}=1\) per box identiche e \(\text{IoU}=0\) per box senza sovrapposizione
Ordinamento per confidenza Fa sì che la box con score più alto venga analizzata per prima
Soglia \(\tau\) Definisce la quantità di sovrapposizione necessaria affinché una box sia considerata ridondante
Soppressione Rimuove le box che presentano una grande sovrapposizione con una box già selezionata
Box distanti Hanno IoU vicina a zero e, in generale, non vengono soppresse da questa regola

9.10.4.4 🧩 Metodi di morph.py che possono aiutare

  • mm.IoU(boxA, boxB) — calcola la metrica IoU, ma si aspetta le box nel formato \((x,y,w,h)\), cioè angolo superiore sinistro, larghezza e altezza. L’input di questo esercizio utilizza il formato \((x_1,y_1,x_2,y_2)\). La conversione è diretta:

    \[ w=x_2-x_1,\qquad h=y_2-y_1. \]

    L’uso di questa funzione è facoltativo. L’obiettivo principale dell’esercizio è implementare correttamente il processo di selezione e soppressione della NMS.

9.10.4.5 📦 Specifica di Input e Output (VPL)

Input:

  • Riga 1: intero \(N\) e reale \(\tau\).
  • Prossime \(N\) righe: \(x_1\ y_1\ x_2\ y_2\ \text{score}\).

Output:

  • Una riga per box mantenuta, nell’ordine di selezione: indice score.
  • Ultima riga: Totale mantenute: X.
🎮 Simulatore: IoU e Soppressione Non-Massimale 🟡 NMS
Casella selezionata Casella mantenuta Casella soppressa Casella candidata
5
0.50
Predefinito
🎯 Visualizzazione delle caselle
📋 Procedura passo passo della NMS
Figura 9.46: Simulatore EP09_04: IoU e Soppressione Non-Massima (NMS)
%%writefile EP09_04.py
# Codice Python
Overwriting EP09_04.py
TestSuite("EP09_04.py").run()
✔️ EP09_04.cases esiste già in casos/
📋 3 caso/i caricato/i da casos/EP09_04.cases

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