Convolutional Autoencoders for Image Noise Reduction

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.

Figura (A)

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)):

Figura (B): Parte dei valori

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.

Figura (B)

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”.

Figura (D)

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.

Figura (E): Le mappe delle caratteristiche
  1. 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.

Figura (F): Il processo di 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.

Figura (G)

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.

Figura (H): Max Pooling

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).

Figura (J)

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.

Poi continua ad aggiungere il processo di decodifica. Quindi la parte decode sotto ha tutte le codifiche e decodifiche.

La Keras api richiede la dichiarazione del modello e del metodo di ottimizzazione:

  • Model(inputs= input_img,outputs= decoded): Il modello includerà tutti i livelli richiesti nel calcolo delle uscite decoded dati i dati di ingresso input_img. compile(optimizer='adadelta',loss='binary_crossentropy'): L’ottimizzatore esegue l’ottimizzazione come fa il gradiente decente. I più comuni sono il gradiente stocastico decente (SGD), il gradiente adattato (Adagrad), e Adadelta che è un’estensione di Adagrad. Vedi la documentazione dell’ottimizzatore Keras per i dettagli. Le funzioni di perdita possono essere trovate nella documentazione delle perdite di Keras.

Di seguito alleno il modello usando x_train sia come input che come output. Il batch_size è il numero di campioni e il epoch è il numero di iterazioni. Specifico shuffle=True per richiedere il rimescolamento dei dati di allenamento prima di ogni epoca.

Possiamo stampare le prime dieci immagini originali e le previsioni per le stesse dieci immagini.

Come costruire un Autoencoder di Convoluzione per la riduzione del rumore delle immagini?

L’idea della riduzione del rumore delle immagini è di addestrare un modello con dati rumorosi come input, e i loro rispettivi dati chiari come output. Questa è l’unica differenza rispetto al modello precedente. Aggiungiamo prima i rumori ai dati.

Le prime dieci immagini rumorose hanno il seguente aspetto:

Poi addestriamo il modello con i dati rumorosi come input, e i dati puliti come output.

Finalmente, stampiamo le prime dieci immagini rumorose e le corrispondenti immagini de-noise.

Il notebook è disponibile tramite questo link.

Ci sono codici CNN pre-addestrati che posso usare?

Sì. Se sei interessato a imparare il codice, Keras ha diverse CNN pre-addestrate tra cui Xception, VGG16, VGG19, ResNet50, InceptionV3, InceptionResNetV2, MobileNet, DenseNet, NASNet e MobileNetV2. Vale la pena menzionare questo grande database di immagini ImageNet che è possibile contribuire o scaricare per scopi di ricerca.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.