Come implementare il rilevamento di oggetti personalizzati con template matching. Nessun dato annotato necessario!
Oggi, algoritmi di rilevamento di oggetti all’avanguardia (algoritmi che mirano a rilevare oggetti in immagini) utilizzano reti neurali come Yolov4.
Template matching è una tecnica nell’elaborazione di immagini digitali per trovare piccole parti di un’immagine che corrisponde a un’immagine modello. È una soluzione molto più semplice di una rete neurale per condurre il rilevamento di oggetti. Inoltre, viene fornito con i seguenti vantaggi:
- non c’è bisogno di annotare i dati (un tempo obbligatoria e il compito di addestrare le reti neurali)
- riquadri sono più accurati
- non c’è bisogno per la GPU
Nella mia esperienza, che unisce una rete neurale come Yolov4 e il rilevamento di oggetti con il template matching qui è un buon modo per migliorare notevolmente la vostra rete neurale prestazioni!
Che cos’è la corrispondenza dei modelli?
Quando si utilizza OpenCV template matching, il modello scorre pixel per pixel sull’immagine. Per ogni posizione, viene calcolata una metrica di somiglianza tra l’immagine del modello e la parte dell’immagine recuperata:
Se la metrica di similarità è abbastanza alta per un pixel, questo pixel è probabilmente l’angolo in alto a sinistra di un oggetto corrispondente al modello!
Di conseguenza, è possibile ottenere il rilevamento di oggetti con la corrispondenza del modello solo se gli oggetti che si tenta di rilevare sono abbastanza simili —quasi identici— all’interno di una classe. È comunque possibile includere più modelli per affrontare le variazioni degli oggetti (dimensioni, colore, orientamento). Ma aumenterà il tempo di previsione.
A prima vista, sembra molto restrittivo. Ma molti casi d’uso di rilevamento di oggetti possono essere affrontati con la corrispondenza dei modelli:
- ID nei documenti scansionati
- spazio di parcheggio vuoto da una telecamera fissa
- componenti su una catena di montaggio…
Un esempio pratico
Un buon caso d’uso per il rilevamento di oggetti utilizzando la corrispondenza dei modelli è quello di rilevare componenti su circuiti stampati, come questo:
Potremmo immaginare una catena di montaggio che produce tali circuiti. Immaginiamo che alcuni circuiti fabbricati siano componenti mancanti e quindi difettosi. Potremmo proporre di installare una telecamera alla fine del percorso e di riprendere ogni circuito, al fine di filtrare i prodotti difettosi. Possiamo raggiungere questo obiettivo con il rilevamento degli oggetti con la corrispondenza dei modelli!
Per semplicità, ci concentreremo sul rilevamento di alcuni componenti.
Una prima componente che appare due volte:
Questo quello che appare quattro volte:
E questo terzo che appare sei volte:
Infine, abbiamo scelto queste tre immagini come modelli. Di conseguenza, la complessità di questo caso d’uso è ridotta: rileveremo facilmente almeno gli oggetti scelti come modelli.
Rilevamento di oggetti di base con la corrispondenza del modello
Definizione del modello
In primo luogo, definiamo i modelli da:
- un percorso immagine,
- un’etichetta,
- un colore (per la visualizzazione dei risultati —caselle di delimitazione e colore delle etichette),
- e una soglia corrispondente.
In secondo luogo, consideriamo che tutti i pixel con una metrica di somiglianza superiore a questa soglia indicano un rilevamento per questo modello.
Ecco i modelli di definizione del codice:
Rilevamento dell’oggetto con la corrispondenza dei modelli
Quindi, eseguiamo il loop sui modelli per eseguire il rilevamento degli oggetti con la corrispondenza dei modelli per ciascun modello. Poiché stiamo usando una soglia, selezioniamo una metrica di somiglianza normalizzata (TM_CCOEFF_NORMED) quando applichiamo la corrispondenza del modello. Quindi, possiamo scegliere una soglia tra 0 e 1:
Consideriamo che ogni pixel con un punteggio di somiglianza sopra la soglia del modello è l’angolo in alto a sinistra di un oggetto (con l’altezza, la larghezza e l’etichetta del modello).
Visualizza gli oggetti rilevati
Quindi, tracciamo i riquadri di delimitazione previsti di questo rilevamento di oggetti con la corrispondenza del modello sull’immagine di input:
Infine, otteniamo i seguenti risultati:
Come indicato dallo spessore delle caselle (in verde, giallo e rosso), ogni oggetto è stato rilevato più volte.
Rimuovi duplicati
Perché abbiamo ottenuto rilevamenti duplicati? Come spiegato sopra, OpenCV template matching restituisce una matrice 2-D avente la dimensione dell’immagine di input (una cella— e quindi un punteggio di somiglianza— per ogni pixel dell’immagine di input).
Pertanto, se un oggetto viene rilevato in una posizione, tutti i pixel circostanti avranno molto probabilmente lo stesso punteggio di somiglianza e quindi considerati come altri oggetti angoli in alto a sinistra.
Per affrontare questo problema, ordineremo tutti i rilevamenti diminuendo i valori corrispondenti. Quindi, sceglieremo se convalidare o meno ogni rilevamento. Convalidiamo il rilevamento se non si sovrappone troppo a nessuno dei rilevamenti già convalidati. Infine, determiniamo che due rilevamenti si sovrappongono se l’Intersezione sull’Unione dei loro riquadri di delimitazione è al di sopra di una data soglia. Questo processo è chiamato Soppressione non massima.
Qui è una spiegazione visiva di ciò che Incrocio corso Unione (IoU) è:
Ecco come l’ho implementato (calcola IoU metodo con più spiegazioni possono essere trovati qui):
E poi, Ho aggiunto queste due righe dopo il rilevamento loop:
Come risultato, si ottiene:
Molto più pulito! Ora vediamo chiaramente che tutti i primi e i terzi componenti vengono rilevati senza falsi positivi (precisione e richiamo di 1).
Ora vogliamo ridurre il numero di falsi positivi per il componente 2. Il modo più semplice è aumentare la soglia di corrispondenza per il modello utilizzato per questa etichetta.
Scelta degli iperparametri
È ovviamente preferibile calcolare le metriche di rilevamento degli oggetti su varie immagini per scegliere gli iperparametri (soglia di corrispondenza del modello e soglia di soppressione non massima). Per ora, si può semplicemente aumentare la soglia per la componente 2:
E otteniamo:
ora Abbiamo solo due falsi positivi per la componente 2, invece di decine (precisione di 2/3, il richiamo 1)! Inoltre, i componenti 1 e 2 sono ancora perfettamente rilevati (precisione e richiamo di 1).
Per migliorare i nostri risultati potremmo:
- includere modelli per i componenti scambiati con il componente 2.
- provare diverse metriche di similarità
- annotare alcune immagini per calcolare le metriche di rilevamento ed eseguire una ricerca griglia su questi parametri.
Sommario
Abbiamo ottenuto il rilevamento di oggetti con la corrispondenza dei modelli di:
- definizione di almeno un modello per ogni oggetto (la più modelli per un oggetto il più il tuo richiamo sarà alta e con precisione il tuo basso)
- utilizzo di OpenCV modello metodo di corrispondenza sull’immagine per ogni template
- considerando che ogni pixel avere un punteggio di somiglianza di sopra di un modello di soglia è l’angolo superiore sinistro di un oggetto (con questo modello di altezza, larghezza e l’etichetta)
- applicazione Non di Soppressione Massima di rilevamenti ottenuti
- selezione di un modello soglie per migliorare la precisione di rilevamento!
Questo è tutto!
Sei alla ricerca di esperti di riconoscimento delle immagini? Non esitate a contattarci!