Come eseguire la segmentazione semantica con l’apprendimento profondo

Questo articolo è una panoramica completa che include una guida passo-passo per implementare un modello di segmentazione delle immagini in deep learning.

#Aggiornamento: abbiamo appena lanciato un nuovo prodotto: API per il rilevamento di oggetti Nanonets

Deeplab Image Semantic Segmentation Network (Source: https://sthalles.github.io/deep_segmentation_network/)

La segmentazione semantica è oggi uno dei problemi chiave nel campo della computer vision. Guardando al quadro generale, la segmentazione semantica è uno dei compiti di alto livello che apre la strada alla comprensione completa della scena. L’importanza della comprensione della scena come problema centrale della computer vision è evidenziata dal fatto che un numero crescente di applicazioni si nutre dell’inferenza di conoscenze dalle immagini. Alcune di queste applicazioni includono i veicoli a guida autonoma, l’interazione uomo-macchina, la realtà virtuale, ecc. Con la popolarità dell’apprendimento profondo negli ultimi anni, molti problemi di segmentazione semantica vengono affrontati utilizzando architetture profonde, spesso reti neurali convoluzionali, che superano altri approcci con un ampio margine in termini di precisione ed efficienza.

Che cos'è la segmentazione semantica?

La segmentazione semantica è un passo naturale nella progressione dall’inferenza grossolana a quella fine:

– L’origine può essere individuata nella classificazione, che consiste nel fare una previsione per un intero input.

– Il passo successivo è la localizzazione/rilevazione, che fornisce non solo le classi ma anche informazioni aggiuntive sulla posizione spaziale di tali classi.

– Infine, la segmentazione semantica consente di ottenere un’inferenza a grana fine facendo previsioni dense che deducono le etichette per ogni pixel, in modo che ogni pixel sia etichettato con la classe dell’oggetto o della regione che lo circonda.

An example of semantic segmentation (Source: https://blog.goodaudience.com/using-convolutional-neural-networks-for-image-segmentation-a-quick-intro-75bd68779225)

Vale anche la pena di passare in rassegna alcune reti profonde standard che hanno dato contributi significativi al campo della computer vision, poiché sono spesso utilizzate come base di sistemi di segmentazione semantica (Le potete trovare anche nel corso dedicato sulla Computer Vision):

– AlexNet: La pionieristica CNN profonda di Toronto che ha vinto il concorso ImageNet 2012 con un’accuratezza dell’84,6%. È composta da 5 strati convoluzionali, uno di max-pooling, ReLU come non linearità, 3 strati completamente convoluzionali e dropout.

– VGG-16: Questo modello di Oxford ha vinto il concorso ImageNet 2013 con un’accuratezza del 92,7%. Utilizza una pila di strati di convoluzione con campi ricettivi piccoli nei primi strati invece di pochi strati con campi ricettivi grandi.

– GoogLeNet: Questa rete di Google ha vinto il concorso ImageNet 2014 con un’accuratezza del 93,3%. È composta da 22 strati e da un blocco di costruzione di nuova introduzione chiamato modulo Inception. Il modulo consiste in un livello Network-in-Network, un’operazione di pooling, un livello di convoluzione di grandi dimensioni e un livello di convoluzione di piccole dimensioni.

– ResNet: Questo modello di Microsoft ha vinto il concorso ImageNet 2016 con un’accuratezza del 96,4%. È noto per la sua profondità (152 livelli) e per l’introduzione dei blocchi residui. I blocchi residui risolvono il problema dell’addestramento di un’architettura veramente profonda introducendo connessioni di salto di identità in modo che gli strati possano copiare i loro input allo strato successivo.

CNN Architectures (Source: https://www.semanticscholar.org/paper/An-Analysis-of-Deep-Neural-Network-Models-for-Canziani-Paszke/28ee688947cf9d31fc48f07a0497cd75200a9485)

 

Quali sono gli approcci esistenti alla segmentazione semantica?

Un’architettura generale di segmentazione semantica può essere pensata come una rete di codifica seguita da una rete di decodifica:

– Il codificatore è solitamente una rete di classificazione pre-addestrata, come VGG/ResNet, seguita da una rete di decodifica.

– Il compito del decodificatore è quello di proiettare semanticamente le caratteristiche discriminative (a bassa risoluzione) apprese dal codificatore sullo spazio dei pixel (a risoluzione più alta) per ottenere una classificazione densa.

A differenza della classificazione, dove il risultato finale della rete molto profonda è l’unica cosa importante, la segmentazione semantica non solo richiede una discriminazione a livello di pixel, ma anche un meccanismo per proiettare nello spazio dei pixel le caratteristiche discriminanti apprese in diverse fasi dell’encoder. Diversi approcci impiegano meccanismi diversi come parte del meccanismo di decodifica. Esploriamo i 3 approcci principali:

1 – Segmentazione semantica basata sulle regioni

I metodi basati sulle regioni seguono generalmente la procedura di “segmentazione tramite riconoscimento”, che prevede innanzitutto l’estrazione di regioni di forma libera da un’immagine e la loro descrizione, seguita da una classificazione basata sulle regioni. Al momento del test, le previsioni basate sulle regioni vengono trasformate in previsioni sui pixel, di solito etichettando un pixel in base alla regione con il punteggio più alto che lo contiene.

R-CNN (Regions with CNN feature) è un lavoro rappresentativo dei metodi basati sulle regioni. Esegue la segmentazione semantica sulla base dei risultati del rilevamento degli oggetti. Nello specifico, R-CNN utilizza innanzitutto la ricerca selettiva per estrarre una grande quantità di proposte di oggetti e poi calcola le caratteristiche CNN per ciascuna di esse. Infine, classifica ogni regione utilizzando le SVM lineari specifiche per ogni classe. Rispetto alle strutture CNN tradizionali, destinate principalmente alla classificazione delle immagini, R-CNN è in grado di affrontare compiti più complicati, come il rilevamento degli oggetti e la segmentazione delle immagini, diventando addirittura una base importante per entrambi i campi. Inoltre, R-CNN può essere costruita su qualsiasi struttura CNN di riferimento, come AlexNet, VGG, GoogLeNet e ResNet.

Per il compito di segmentazione delle immagini, R-CNN ha estratto due tipi di caratteristiche per ogni regione: la caratteristica di regione completa e la caratteristica di primo piano, e ha scoperto che poteva portare a prestazioni migliori quando le concatenava insieme come caratteristica di regione. R-CNN ha ottenuto miglioramenti significativi delle prestazioni grazie all’uso di caratteristiche CNN altamente discriminative. Tuttavia, soffre anche di un paio di svantaggi per il compito di segmentazione:

– La caratteristica non è compatibile con il compito di segmentazione.

– La caratteristica non contiene informazioni spaziali sufficienti per una generazione precisa dei confini.

– La generazione di proposte basate sui segmenti richiede tempo e influisce notevolmente sulle prestazioni finali.

A causa di questi colli di bottiglia, sono state proposte ricerche recenti per risolvere i problemi, tra cui SDS, Hypercolumns, Mask R-CNN.

2 – Segmentazione semantica basata su una rete interamente convoluzionale

La rete Fully Convolutional Network (FCN) originale apprende una mappatura da pixel a pixel, senza estrarre le proposte di regione. La pipeline di rete FCN è un’estensione della CNN classica. L’idea principale è quella di far sì che la CNN classica accetti come input immagini di dimensioni arbitrarie. La limitazione delle CNN ad accettare e produrre etichette solo per input di dimensioni specifiche deriva dagli strati completamente connessi che sono fissi. Al contrario, le FCN hanno solo strati convoluzionali e di pooling che danno loro la possibilità di fare previsioni su input di dimensioni arbitrarie.

Architettura FCN

Un problema di questa specifica FCN è che, propagandosi attraverso diversi strati convoluzionali e di pooling alternati, la risoluzione delle mappe di caratteristiche in uscita viene ridotta. Di conseguenza, le previsioni dirette della FCN sono tipicamente a bassa risoluzione, con il risultato di avere confini di oggetti relativamente confusi. Per risolvere questo problema sono stati proposti diversi approcci più avanzati basati su FCN, tra cui SegNet, DeepLab-CRF e Dilated Convolutions.

3 – Segmentazione semantica debolmente supervisionata

La maggior parte dei metodi di segmentazione semantica si basa su un gran numero di immagini con maschere di segmentazione pixel-wise. Tuttavia, l’annotazione manuale di queste maschere richiede molto tempo, è frustrante e commercialmente costosa. Per questo motivo, di recente sono stati proposti alcuni metodi debolmente supervisionati, che si dedicano alla segmentazione semantica utilizzando caselle di delimitazione annotate.

Boxsup Training

 

Kitti Road Dataset Training Sample (Source: http://www.cvlibs.net/datasets/kitti/eval_road_detail.php?result=3748e213cf8e0100b7a26198114b3cdc7caa3aff)

 

Ecco le caratteristiche principali dell’architettura FCN:

– FCN trasferisce le conoscenze da VGG16 per eseguire la segmentazione semantica.

– Gli strati completamente connessi di VGG16 vengono convertiti in strati completamente convoluzionali, utilizzando la convoluzione 1×1. Questo processo produce una mappa di calore della presenza di classi in bassa risoluzione. Questo processo produce una mappa di calore della presenza delle classi a bassa risoluzione.

– Il sovracampionamento di queste mappe di caratteristiche semantiche a bassa risoluzione viene effettuato utilizzando convoluzioni trasposte (inizializzate con filtri di interpolazione bilineare).

– In ogni fase, il processo di upsampling viene ulteriormente perfezionato con l’aggiunta di caratteristiche da mappe di caratteristiche più grossolane ma a più alta risoluzione provenienti da livelli inferiori di VGG16.

– Dopo ogni blocco di convoluzione viene introdotta una connessione di salto per consentire al blocco successivo di estrarre caratteristiche più astratte e salienti per la classe dalle caratteristiche precedentemente raggruppate.

Esistono 3 versioni di FCN (FCN-32, FCN-16, FCN-8). Noi implementeremo FCN-8, come illustrato di seguito passo per passo:

– Codificatore: Come codificatore viene utilizzato un VGG16 pre-addestrato. Il decodificatore parte dal livello 7 di VGG16.

– FCN Layer-8: l’ultimo strato completamente connesso di VGG16 è sostituito da una convoluzione 1×1.

– FCN Layer-9: il FCN Layer-8 viene sovracampionato 2 volte per far coincidere le dimensioni con il Layer 4 di VGG 16, utilizzando una convoluzione trasposta con i parametri: (kernel=(4,4), stride=(2,2), paddding=’same’). Successivamente, è stata aggiunta una connessione di salto tra il livello 4 del VGG16 e il livello 9 della FCN.

– FCN Layer-10: il FCN Layer-9 viene sovracampionato 2 volte per far coincidere le dimensioni con il Layer 3 del VGG16, utilizzando la convoluzione trasposta con i parametri: (kernel=(4,4), stride=(2,2), paddding=’same’). Successivamente, è stata aggiunta una connessione di salto tra il livello 3 del VGG 16 e il livello 10 della FCN.

– FCN Layer-11: il FCN Layer-10 viene sovracampionato 4 volte per far coincidere le dimensioni con quelle dell’immagine di ingresso, in modo da ottenere l’immagine reale e la profondità è uguale al numero di classi, utilizzando una convoluzione trasposta con i parametri: (kernel=(16,16), stride=(8,8), paddding=’same’).

(Source: https://www.researchgate.net/figure/Illustration-of-the-FCN-8s-network-architecture-as-proposed-in-20-In-our-method-the_fig1_305770331)

 

Passo 1

Per prima cosa carichiamo il modello VGG-16 pre-addestrato in TensorFlow. Prendendo la sessione di TensorFlow e il percorso della cartella VGG (scaricabile qui), restituiamo la tupla di tensori dal modello VGG, compresi l’immagine in ingresso, keep_prob (per controllare il tasso di abbandono), il livello 3, il livello 4 e il livello 7.

Funzione VGG16

Passo 2

Ora ci concentriamo sulla creazione degli strati per una FCN, utilizzando i tensori del modello VGG. Dati i tensori per l’output del livello VGG e il numero di classi da classificare, restituiamo il tensore per l’ultimo livello di quell’output. In particolare, applichiamo una convoluzione 1×1 agli strati di codifica e poi aggiungiamo alla rete strati di decodifica con connessioni saltate e upsampling.

Strati Funzione

Passo 3

Il passo successivo è l’ottimizzazione della rete neurale, ovvero la costruzione delle funzioni di perdita e delle operazioni di ottimizzazione di TensorFlow. Qui usiamo l’entropia incrociata come funzione di perdita e Adam come algoritmo di ottimizzazione.

Ottimizzare la funzione

Passo 4

Qui definiamo la funzione train_nn, che contiene parametri importanti come il numero di epoche, la dimensione del batch, la funzione di perdita, l’operazione di ottimizzazione e i segnaposto per le immagini di input, le immagini di etichetta e il tasso di apprendimento. Per il processo di addestramento, abbiamo anche impostato keep_probability a 0,5 e learning_rate a 0,001. Per tenere traccia dei progressi, stampiamo anche la perdita durante l’addestramento.

Passo 5

Finalmente è arrivato il momento di addestrare la nostra rete! In questa funzione di esecuzione, per prima cosa costruiamo la nostra rete utilizzando le funzioni load_vgg, layers e optimize. Poi addestriamo la rete usando la funzione train_nn e salviamo i dati di inferenza per i record.

Funzione Run

Per quanto riguarda i parametri, abbiamo scelto epochs = 40, batch_size = 16, num_classes = 2 e image_shape = (160, 576). Dopo aver effettuato 2 passaggi di prova con dropout = 0,5 e dropout = 0,75, abbiamo scoperto che la seconda prova produce risultati migliori con perdite medie migliori.

Training Sample Results

Per vedere il codice completo, visitate questo link https://gist.github.com/khanhnamle1994/e2ff59ddca93c0205ac4e566d40b5e88

Se questo articolo vi è piaciuto, vi chiedo di premere il pulsante “clap” 👏 in modo che altri possano imbattersi in esso. Vi consiglio anche di dare un’occhiata a questa guida di Neptune su come esplorare i dati per la segmentazione delle immagini e il rilevamento degli oggetti. Sembra molto completa!

 

Articolo originale di James Le

How to do Semantic Segmentation using Deep learning | by James Le | NanoNets | Medium

 

R-CNN Architecture

Share:

Contenuti
Torna in alto