Convolutionele Autoencoders voor beeldruisonderdrukking

In “Anomalie detectie met Autoencoders makkelijk gemaakt” heb ik vermeld dat Autoencoders op grote schaal zijn toegepast in dimensie reductie en beeldruisonderdrukking. Sindsdien hebben veel lezers gevraagd of ik het onderwerp ruisonderdrukking met autoencoders kan behandelen. Dat is de motivatie van deze post.

Het modelleren van beeldgegevens vereist een speciale aanpak in de neurale netwerk wereld. Het bekendste neurale netwerk voor het modelleren van beeldgegevens is het Convolutional Neural Network (CNN, of ConvNet) of Convolutional Autoencoder genoemd. In deze post zal ik beginnen met een voorzichtige inleiding voor de beeldgegevens omdat niet alle lezers zich op het gebied van beeldgegevens bevinden (voel je vrij om dat deel over te slaan als je er al mee vertrouwd bent). Daarna beschrijf ik een eenvoudig standaard neuraal netwerk voor de beeldgegevens. Dit geeft me de gelegenheid om aan te tonen waarom de Convolutionele Autoencoders de methode bij uitstek zijn om met beeldgegevens om te gaan. Bovenal zal ik demonstreren hoe de Convolutionele Autoencoders ruis in een afbeelding verminderen. Ik gebruik de Keras module en de MNIST data in deze post. De notebook is beschikbaar via deze link. Keras is een high-level neurale netwerken API, geschreven in Python en in staat om bovenop TensorFlow te draaien. Deze post is een uitbreiding van mijn eerdere post “Wat is beeldherkenning?”, die ik u aanmoedig om een kijkje te nemen.

Ik dacht dat het nuttig is om de drie brede gegevenscategorieën te vermelden. De drie gegevenscategorieën zijn: (1) Ongecorreleerde gegevens (In tegenstelling tot seriële gegevens), (2) Seriële gegevens (inclusief tekst- en spraakstroomgegevens), en (3) Beeldgegevens. Deep learning heeft drie basisvarianten om elke gegevenscategorie aan te pakken: (1) het standaard feedforward neurale netwerk, (2) RNN/LSTM, en (3) Convolutional NN (CNN). Voor lezers die op zoek zijn naar tutorials voor elk type, raden we aan “Explaining Deep Learning in a Regression-Friendly Way” te lezen voor (1), het huidige artikel “A Technical Guide for RNN/LSTM/GRU on Stock Price Prediction” voor (2), en “Deep Learning with PyTorch Is Not Torturing”, “What Is Image Recognition?”, “Anomaly Detection with Autoencoders Made Easy”, en “Convolutional Autoencoders for Image Noise Reduction” voor (3). U kunt een bladwijzer maken voor het samenvattende artikel “Dataman Learning Paths – Build Your Skills, Drive Your Career”.

Understand Image Data

Een afbeelding bestaat uit “pixels”, zoals weergegeven in figuur (A). In een zwart-witafbeelding wordt elke pixel weergegeven door een getal van 0 tot 255. De meeste beelden gebruiken tegenwoordig 24-bits kleur of hoger. Een RGB-kleurafbeelding betekent dat de kleur in een pixel de combinatie is van Rood, Groen en Blauw, waarbij elk van de kleuren varieert van 0 tot 255. Het RGB-kleurensysteem stelt alle kleuren samen uit de combinatie van de kleuren Rood, Groen en Blauw, zoals weergegeven in deze RGB-kleurgenerator. Een pixel bevat dus een reeks van drie waarden RGB(102, 255, 102) die verwijst naar kleur #66ff66.

Figuur (A)

Een beeld van 800 pixels breed en 600 pixels hoog heeft 800 x 600 = 480.000 pixels = 0,48 megapixels (“megapixel” is 1 miljoen pixels). Een afbeelding met een resolutie van 1024×768 is een raster met 1.024 kolommen en 768 rijen, dat dus 1.024 × 768 = 0,78 megapixels bevat.

MNIST

De MNIST-database (Modified National Institute of Standards and Technology-database) is een grote database van handgeschreven cijfers die veel wordt gebruikt voor het trainen van verschillende beeldverwerkingssystemen. De training dataset in Keras heeft 60.000 records en de test dataset heeft 10.000 records. Elk record heeft 28 x 28 pixels.

Hoe zien ze eruit? Laten we matplotlib en zijn beeldfunctie imshow() gebruiken om de eerste tien records te tonen.

Stapelt de beeldgegevens voor training

Om een neuraal netwerk raamwerk voor model training te kunnen gebruiken, kunnen we alle 28 x 28 = 784 waarden in een kolom stapelen. De gestapelde kolom voor het eerste record ziet er als volgt uit: (met x_train.reshape(1,784)):

Figuur (B): Een deel van de waarden

Dan kunnen we het model trainen met een standaard neuraal netwerk zoals weergegeven in figuur (B). Elk van de 784 waarden is een knooppunt in de inputlaag. Maar wacht, hebben we niet veel informatie verloren toen we de gegevens stapelden? Ja. De ruimtelijke en temporele relaties in een beeld zijn weggegooid. Dit is een groot verlies van informatie. Laten we eens kijken hoe de Convolutionele Autoencoders de ruimtelijke en temporele informatie kunnen behouden.

Figuur (B)

Waarom zijn de Convolutionele Autoencoders geschikt voor beeldgegevens?

We zien een enorm verlies van informatie bij het in plakken verdelen en stapelen van de gegevens. In plaats van de gegevens te stapelen, houden de Convolutie Autoencoders de ruimtelijke informatie van de ingevoerde beeldgegevens zoals zij zijn, en extraheren voorzichtig informatie in wat de Convolutie laag wordt genoemd. Figuur (D) laat zien dat een plat 2D-beeld wordt geëxtraheerd tot een dik vierkant (Conv1), vervolgens overgaat in een lange kubus (Conv2) en nog een langere kubus (Conv3). Dit proces is bedoeld om de ruimtelijke relaties in de gegevens te behouden. Dit is het codeerproces in een Autoencoder. In het midden bevindt zich een volledig aangesloten autoencoder waarvan de verborgen laag uit slechts 10 neuronen bestaat. Daarna komt het decoderingsproces dat de kubussen afvlakt tot een 2D plat beeld. De encoder en de decoder zijn symmetrisch in figuur (D). Ze hoeven niet symmetrisch te zijn, maar de meeste beoefenaars nemen deze regel gewoon over, zoals uitgelegd in “Anomalie Detectie met Autoencoders gemakkelijk gemaakt”.

Figuur (D)

Hoe werken de Convolutionele Autoencoders?

De bovenstaande data-extractie lijkt magisch. Hoe werkt dat eigenlijk? Het gaat om de volgende drie lagen: De convolutielaag, de reLu-laag en de poolinglaag.

Figuur (E): De Feature Maps
  1. De Convolutielaag

De convolutiestap creëert vele kleine stukjes die de feature maps of kenmerken worden genoemd, zoals de groene, rode of marineblauwe vierkantjes in afbeelding (E). Deze vierkantjes behouden de relatie tussen pixels in het invoerbeeld. Laat elk kenmerk door het originele beeld scannen zoals in figuur (F). Dit proces bij het produceren van de scores wordt filteren genoemd.

Figuur (F): Het filterproces

Na het scannen van het originele beeld, levert elk kenmerk een gefilterd beeld op met hoge scores en lage scores, zoals te zien is in afbeelding (G). Als er een perfecte overeenkomst is, is er een hoge score in dat vakje. Als er een lage match of geen match is, is de score laag of nul. In het rode vierkant zijn bijvoorbeeld vier gebieden in het oorspronkelijke beeld gevonden die een perfecte overeenkomst met het kenmerk vertonen, dus de scores zijn hoog voor die vier gebieden.

Figuur (G)

Meer filters betekent meer kenmerken die het model kan extraheren. Meer kenmerken betekent echter een langere trainingstijd. U wordt dus geadviseerd een zo klein mogelijk aantal filters te gebruiken om de kenmerken te extraheren.

1.1 Padding

Hoe bepalen de kenmerken de overeenkomst? Een hyper-parameter is Padding die twee mogelijkheden biedt: (i) het oorspronkelijke beeld opvullen met nullen om het kenmerk te laten passen, of (ii) het deel van het oorspronkelijke beeld dat niet past laten vallen en het geldige deel behouden.

1.2 Strides

De convolutielaag bevat nog een parameter: de Stride. Het is het aantal pixels dat over de input matrix verschuift. Als de stride 1 is, verschuiven de filters 1 pixel per keer. We zullen het in onze Keras code zien als een hyper-parameter.

2. ReLUs Step

De Rectified Linear Unit (ReLU) is de stap die hetzelfde is als de stap in de typische neurale netwerken. Het corrigeert elke negatieve waarde tot nul om te garanderen dat de wiskunde zich correct gedraagt.

3. Max Pooling Layer

Pooling krimpt de beeldgrootte. In figuur (H) wordt een venster van 2 x 2, de poolgrootte genoemd, door elk van de gefilterde beelden gescand en wordt de maximumwaarde van dat venster van 2 x 2 toegewezen aan een vierkant van 1 x 1 in een nieuw beeld. Zoals geïllustreerd in figuur (H), is de maximumwaarde in het eerste venster van 2 x 2 een hoge score (rood), zodat de hoge score wordt toegewezen aan het vierkant van 1 x 1.

Figuur (H): Max Pooling

Naast het nemen van de maximumwaarde zijn er nog andere, minder gebruikelijke poolingmethoden, zoals de Average Pooling (het nemen van de gemiddelde waarde) of de Sum Pooling (de som).

Figuur (J)

Na het poolen wordt een nieuwe stapel kleinere gefilterde beelden geproduceerd. Nu splitsen we de kleinere gefilterde beelden en stapelen ze in een lijst zoals weergegeven in figuur (J).

Model in Keras

De bovenstaande drie lagen zijn de bouwstenen in het convolutieneuraal netwerk. Keras biedt de volgende twee functies:

Je kunt veel convolutielagen bouwen in de Convolution Autoencoders. In Figuur (E) zijn er drie lagen met de labels Conv1, Conv2 en Conv3 in het coderingsgedeelte. Dus zullen we dienovereenkomstig bouwen.

  • De code onder input_img = Input(shape=(28,28,1) verklaart dat de 2D invoerafbeelding 28 bij 28 is.
  • Dan bouwt het de drie lagen Conv1, Conv2 en Conv3.
  • Merk op dat Conv1 binnen Conv2 ligt en Conv2 binnen Conv3.
  • De padding specificeert wat er moet gebeuren als de filter niet goed bij de invoerafbeelding past. padding='valid' betekent het laten vallen van het deel van het beeld wanneer het filter niet past; padding='same' vult het beeld met nullen om het beeld te laten passen.

Daarna gaat het verder met het decoderingsproces. Dus het decode deel hieronder heeft alle gecodeerde en gedecodeerde.

De Keras api vereist de verklaring van het model en de optimalisatie methode:

  • Model(inputs= input_img,outputs= decoded): Het model zal alle lagen die nodig zijn in de berekening van de outputs decoded gegeven de invoergegevens input_img. compile(optimizer='adadelta',loss='binary_crossentropy'): De optimalisator voert optimalisaties uit zoals de gradiënt decent dat doet. De meest voorkomende zijn stochastic gradient decent (SGD), Adapted gradient (Adagrad), en Adadelta dat een uitbreiding is van Adagrad. Zie de Keras optimizer documentatie voor de details. De verliesfuncties zijn te vinden in de Keras-verliezendocumentatie.

Hieronder train ik het model met x_train als zowel de invoer als de uitvoer. De batch_size is het aantal monsters en de epoch is het aantal iteraties. Ik specificeer shuffle=True om te eisen dat de train data voor elk tijdperk wordt geschud.

We kunnen de eerste tien originele afbeeldingen en de voorspellingen voor dezelfde tien afbeeldingen afdrukken.

Hoe bouw je een Convolutie Autoencoder voor beeldruisonderdrukking?

Het idee van beeldruisonderdrukking is om een model te trainen met gegevens met ruis als invoer, en de overeenkomstige heldere gegevens als uitvoer. Dit is het enige verschil met het bovenstaande model. Laten we eerst ruis aan de gegevens toevoegen.

De eerste tien ruisige beelden zien er als volgt uit:

Dan trainen we het model met de ruisige gegevens als invoer, en de schone gegevens als uitvoer.

Tot slot drukken we de eerste tien afbeeldingen met ruis af, evenals de overeenkomstige afbeeldingen die zijn ontdaan van ruis.

De notebook is beschikbaar via deze link.

Zijn er voorgetrainde CNNs Code die ik kan gebruiken?

Ja. Als u geïnteresseerd bent in het leren van de code, heeft Keras verschillende vooraf getrainde CNN’s, waaronder Xception, VGG16, VGG19, ResNet50, InceptionV3, InceptionResNetV2, MobileNet, DenseNet, NASNet, en MobileNetV2. Vermeldenswaard is deze grote beelddatabase ImageNet die u kunt bijdragen of downloaden voor onderzoeksdoeleinden.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.