In “Anomaly Detection with Autoencoders Made Easy” ho menzionato che gli Autoencoders sono stati ampiamente applicati nella riduzione delle dimensioni e del rumore di immagine. Da allora molti lettori mi hanno chiesto se posso trattare l’argomento della riduzione del rumore dell’immagine usando gli autoencoder. Questa è la motivazione di questo post.
Modellare i dati delle immagini richiede un approccio speciale nel mondo delle reti neurali. La rete neurale più conosciuta per la modellazione dei dati di immagine è la Rete Neurale Convoluzionale (CNN, o ConvNet) o chiamata Convolutional Autoencoder. In questo post inizierò con una leggera introduzione per i dati di immagine perché non tutti i lettori sono nel campo dei dati di immagine (sentitevi liberi di saltare questa sezione se avete già familiarità con). Poi descriverò una semplice rete neurale standard per i dati di immagine. Questo mi darà l’opportunità di dimostrare perché gli autocodificatori convoluzionali sono il metodo preferito per trattare i dati di immagine. Soprattutto, dimostrerò come gli autocodificatori convoluzionali riducono i rumori in un’immagine. In questo post utilizzo il modulo Keras e i dati MNIST. Il notebook è disponibile tramite questo link. Keras è un’API di alto livello per reti neurali, scritta in Python e in grado di funzionare sopra TensorFlow. Questo post è un’estensione del mio precedente post “Cos’è il riconoscimento delle immagini?” a cui vi invito a dare un’occhiata.
Ho pensato che fosse utile menzionare le tre grandi categorie di dati. Le tre categorie di dati sono: (1) Dati non correlati (in contrasto con i dati seriali), (2) Dati seriali (compresi i dati del flusso di testo e voce), e (3) Dati di immagine. L’apprendimento profondo ha tre varianti di base per affrontare ogni categoria di dati: (1) la rete neurale feedforward standard, (2) RNN/LSTM, e (3) NN convoluzionale (CNN). Per i lettori che sono alla ricerca di tutorial per ogni tipo, si raccomanda di controllare “Explaining Deep Learning in a Regression-Friendly Way” per (1), l’attuale articolo “A Technical Guide for RNN/LSTM/GRU on Stock Price Prediction” per (2), e “Deep Learning with PyTorch Is Not Torturing”, “What Is Image Recognition?”, “Anomaly Detection with Autoencoders Made Easy”, e “Convolutional Autoencoders for Image Noise Reduction” per (3). Puoi mettere tra i segnalibri l’articolo riassuntivo “Percorsi di apprendimento Dataman – Costruisci le tue competenze, guida la tua carriera”.
Capire i dati delle immagini
Un’immagine è fatta di “pixel” come mostrato nella figura (A). In un’immagine in bianco e nero ogni pixel è rappresentato da un numero che va da 0 a 255. La maggior parte delle immagini oggi usa un colore a 24 bit o superiore. Un’immagine a colori RGB significa che il colore in un pixel è la combinazione di Rosso, Verde e Blu, ognuno dei colori che vanno da 0 a 255. Il sistema di colori RGB costruisce tutti i colori dalla combinazione dei colori Rosso, Verde e Blu come mostrato in questo generatore di colori RGB. Così un pixel contiene un insieme di tre valori RGB(102, 255, 102) si riferisce al colore #66ff66.
Un’immagine larga 800 pixel, alta 600 pixel ha 800 x 600 = 480.000 pixel = 0,48 megapixel (“megapixel” è 1 milione di pixel). Un’immagine con una risoluzione di 1024×768 è una griglia con 1.024 colonne e 768 righe, che quindi contiene 1.024 × 768 = 0,78 megapixel.
MNIST
Il database MNIST (Modified National Institute of Standards and Technology database) è un grande database di cifre scritte a mano che è comunemente usato per l’addestramento di vari sistemi di elaborazione delle immagini. Il dataset di allenamento in Keras ha 60.000 record e il dataset di test ha 10.000 record. Ogni record ha 28 x 28 pixel.
Come sono fatti? Usiamo matplotlib
e la sua funzione immagine imshow()
per mostrare i primi dieci record.
Impila i dati dell’immagine per l’addestramento
Per adattare una rete neurale all’addestramento del modello, possiamo impilare tutti i 28 x 28 = 784 valori in una colonna. La colonna impilata per il primo record ha questo aspetto: (usando x_train.reshape(1,784)
):
Poi possiamo addestrare il modello con una rete neurale standard come mostrato nella figura (B). Ognuno dei 784 valori è un nodo nel livello di input. Ma aspetta, non abbiamo perso molte informazioni quando abbiamo impilato i dati? Sì. Le relazioni spaziali e temporali in un’immagine sono state scartate. Questa è una grande perdita di informazioni. Vediamo come gli autocodificatori convoluzionali possono mantenere le informazioni spaziali e temporali.
Perché gli autocodificatori convoluzionali sono adatti ai dati delle immagini? Invece di impilare i dati, gli autocodificatori di convoluzione mantengono le informazioni spaziali dei dati dell’immagine in ingresso così come sono, ed estraggono delicatamente le informazioni in quello che è chiamato lo strato di convoluzione. La figura (D) dimostra che un’immagine 2D piatta viene estratta in un quadrato spesso (Conv1), poi continua per diventare un cubico lungo (Conv2) e un altro cubico più lungo (Conv3). Questo processo è progettato per mantenere le relazioni spaziali nei dati. Questo è il processo di codifica in un Autoencoder. Al centro, c’è un autoencoder completamente connesso il cui strato nascosto è composto da soli 10 neuroni. Dopo di che arriva il processo di decodifica che appiattisce i cubi, quindi ad un’immagine 2D piatta. Il codificatore e il decodificatore sono simmetrici nella figura (D). Non è necessario che siano simmetrici, ma la maggior parte dei professionisti adotta questa regola come spiegato in “Anomaly Detection with Autoencoders made easy”.
Come funziona l’Autoencoder Convoluzionale?
L’estrazione dei dati di cui sopra sembra magico. Come funziona veramente? Coinvolge i seguenti tre strati: Lo strato di convoluzione, lo strato di reLu e lo strato di pooling.
- Il livello di convoluzione
Il passo di convoluzione crea molti piccoli pezzi chiamati mappe delle caratteristiche o caratteristiche come i quadrati verdi, rossi o blu scuro nella figura (E). Questi quadrati conservano la relazione tra i pixel nell’immagine di input. Lasciate che ogni caratteristica scansioni l’immagine originale come mostrato nella figura (F). Questo processo di produzione dei punteggi è chiamato filtraggio.
Dopo la scansione dell’immagine originale, ogni caratteristica produce un’immagine filtrata con punteggi alti e bassi come mostrato nella figura (G). Se c’è una corrispondenza perfetta, c’è un punteggio alto in quel quadrato. Se c’è una bassa corrispondenza o nessuna corrispondenza, il punteggio è basso o zero. Per esempio, il quadrato rosso ha trovato quattro aree nell’immagine originale che mostrano una perfetta corrispondenza con la caratteristica, quindi i punteggi sono alti per quelle quattro aree.
Più filtri significano più numero di caratteristiche che il modello può estrarre. Tuttavia, più caratteristiche significano un tempo di addestramento più lungo. Quindi si consiglia di utilizzare il numero minimo di filtri per estrarre le caratteristiche.
1.1 Padding
Come fanno le caratteristiche a determinare la corrispondenza? Un iper-parametro è Padding che offre due opzioni: (i) riempire l’immagine originale con degli zeri per adattarla alla caratteristica, o (ii) eliminare la parte dell’immagine originale che non si adatta e mantenere la parte valida.
1.2 Strides
Il livello di convoluzione include un altro parametro: lo Stride. È il numero di pixel che si spostano sulla matrice di ingresso. Quando lo stride è 1, i filtri spostano 1 pixel alla volta. Lo vedremo nel nostro codice Keras come un iper-parametro.
2. Passo ReLUs
La Rectified Linear Unit (ReLU) è il passo che è lo stesso del passo nelle tipiche reti neurali. Rettifica qualsiasi valore negativo a zero in modo da garantire che la matematica si comporti correttamente.
3. Max Pooling Layer
Il pooling riduce le dimensioni dell’immagine. Nella figura (H) una finestra 2 x 2, chiamata dimensione del pool, scansiona ciascuna delle immagini filtrate e assegna il valore massimo di quella finestra 2 x 2 a un quadrato 1 x 1 in una nuova immagine. Come illustrato nella figura (H), il valore massimo nella prima finestra 2 x 2 è un punteggio elevato (rappresentato in rosso), quindi il punteggio elevato viene assegnato al quadrato 1 x 1.
Oltre a prendere il valore massimo, altri metodi di pooling meno comuni includono l’Average Pooling (prendere il valore medio) o il Sum Pooling (la somma).
Dopo il pooling, viene prodotto un nuovo stack di immagini filtrate più piccole. Ora dividiamo le immagini filtrate più piccole e le impiliamo in una lista come mostrato nella Figura (J).
Modello in Keras
I tre strati di cui sopra sono gli elementi costitutivi della rete neurale di convoluzione. Keras offre le seguenti due funzioni:
È possibile costruire molti strati di convoluzione nel Convolution Autoencoders. Nella figura (E) ci sono tre strati etichettati Conv1, Conv2 e Conv3 nella parte di codifica. Quindi costruiremo di conseguenza.
- Il codice sotto
input_img = Input(shape=(28,28,1)
dichiara che l’immagine 2D in ingresso è 28 per 28. - Poi costruisce i tre strati Conv1, Conv2 e Conv3.
- Nota che Conv1 è dentro Conv2 e Conv2 è dentro Conv3.
- Il
padding
specifica cosa fare quando il filtro non si adatta bene all’immagine in ingresso.padding='valid'
significa abbandonare la parte dell’immagine quando il filtro non si adatta;padding='same'
imbottiglia l’immagine con degli zeri per adattarla.