Convolutional Autoencoders for Image Noise Reduction

I “Anomaly Detection with Autoencoders Made Easy” nævnte jeg, at Autoencoders er blevet anvendt i vid udstrækning til dimensionsreduktion og reduktion af billedstøj. Siden da har mange læsere spurgt, om jeg kan dække emnet billedstøjreduktion ved hjælp af autoenkodere. Det er motivationen for dette indlæg.

Modellering af billeddata kræver en særlig tilgang i neurale netværksverdenen. Det bedst kendte neurale netværk til modellering af billeddata er det konvolutionelle neurale netværk (CNN, eller ConvNet) eller kaldet Convolutional Autoencoder. I dette indlæg vil jeg starte med en blid introduktion til billeddata, fordi ikke alle læsere er inden for området for billeddata (du er velkommen til at springe dette afsnit over, hvis du allerede er bekendt med). Derefter beskriver jeg et simpelt standard neuralt netværk for billeddata. Dette vil give mig mulighed for at demonstrere, hvorfor Convolutional Autoencoders er den foretrukne metode til behandling af billeddata. Frem for alt vil jeg demonstrere, hvordan de konvolutionelle autoenkodere reducerer støj i et billede. Jeg bruger Keras-modulet og MNIST-dataene i dette indlæg. Notesbogen er tilgængelig via dette link. Keras er et API til neurale netværk på højt niveau, skrevet i Python og i stand til at køre oven på TensorFlow. Dette indlæg er en udvidelse af mit tidligere indlæg “What Is Image Recognition?”, som jeg opfordrer dig til at tage et kig.

Jeg troede, at det er nyttigt at nævne de tre brede datakategorier. De tre datakategorier er: (1) Ukorrelerede data (I modsætning til serielle data), (2) Serielle data (herunder tekst- og talestrømsdata) og (3) Billeddata. Deep learning har tre grundlæggende variationer til at behandle hver datakategori: (1) det standard feedforward neurale netværk, (2) RNN/LSTM og (3) Convolutional NN (CNN). For læsere, der leder efter tutorials for hver type, anbefales det at tjekke “Explaining Deep Learning in a Regression-Friendly Way” for (1), den aktuelle artikel “A Technical Guide for RNN/LSTM/GRU on Stock Price Prediction” for (2), og “Deep Learning with PyTorch Is Not Torturing”, “What Is Image Recognition?”, “Anomaly Detection with Autoencoders Made Easy” og “Convolutional Autoencoders for Image Noise Reduction” for (3). Du kan bogmærke den sammenfattende artikel “Dataman Learning Paths – Build Your Skills, Drive Your Career”.

Understand Image Data

Et billede består af “pixels”, som vist i figur (A). I et sort-hvidt billede repræsenteres hver pixel af et tal, der går fra 0 til 255. De fleste billeder i dag bruger 24-bit farve eller højere. Et RGB-farvebillede betyder, at farven i en pixel er en kombination af rød, grøn og blå, idet hver af farverne går fra 0 til 255. RGB-farvesystemet konstruerer alle farver ud fra kombinationen af de røde, grønne og blå farver, som vist i denne RGB-farvegenerator. Så en pixel indeholder et sæt af tre værdier RGB(102, 255, 102) henviser til farven #66ff66.

Figur (A)

Et billede på 800 pixel i bredden og 600 pixel i højden har 800 x 600 = 480.000 pixels = 0,48 megapixel (“megapixel” er 1 million pixels). Et billede med en opløsning på 1024×768 er et gitter med 1.024 kolonner og 768 rækker, som derfor indeholder 1.024 × 768 = 0,78 megapixel.

MNIST

MNIST-databasen (Modified National Institute of Standards and Technology database) er en stor database med håndskrevne cifre, som almindeligvis bruges til træning af forskellige billedbehandlingssystemer. Træningsdatasættet i Keras har 60.000 poster og testdatasættet har 10.000 poster. Hver record har 28 x 28 pixels.

Hvordan ser de ud? Lad os bruge matplotlib og dens billedfunktion imshow() til at vise de første ti poster.

Stabler billeddataene til træning

For at passe til en neuronal netværksramme til modeltræning kan vi stable alle 28 x 28 = 784 værdier i en kolonne. Den stablede kolonne for den første post ser således ud: (ved hjælp af x_train.reshape(1,784)):

Figur (B): Del af værdierne

Så kan vi træne modellen med et standard neuralt netværk som vist i figur (B). Hver af de 784 værdier er en knude i indgangslaget. Men vent, mistede vi ikke meget information, da vi stablede dataene? Jo. De rumlige og tidsmæssige relationer i et billede er blevet kasseret. Dette er et stort tab af information. Lad os se, hvordan de konvolutionelle autoenkodere kan bevare rumlige og tidsmæssige oplysninger.

Figur (B)

Hvorfor er de konvolutionelle autoenkodere egnede til billeddata?

Vi ser et stort tab af information, når vi skærer og stabler dataene. I stedet for at stable dataene beholder konvolutionsautoenkoderne de rumlige oplysninger i de indgående billeddata, som de er, og uddrager forsigtigt oplysninger i det, der kaldes konvolutionslaget. Figur (D) viser, at et fladt 2D-billede ekstraheres til en tyk firkant (Conv1), der derefter fortsætter med at blive til en lang kubik (Conv2) og en anden længere kubik (Conv3). Denne proces er designet til at bevare de rumlige relationer i dataene. Dette er kodningsprocessen i en Autoencoder. I midten er der en fuldt forbundet autoenkoder, hvis skjulte lag kun består af 10 neuroner. Derefter kommer med afkodningsprocessen, der flader kubikken ud, derefter til et 2D-fladt billede. Enkoderen og dekoderen er symmetriske i figur (D). De behøver ikke at være symmetriske, men de fleste praktikere anvender blot denne regel, som forklaret i “Anomaly Detection with Autoencoders made easy”.

Figur (D)

Hvordan virker de konvolutionelle autoenkodere?

Overstående dataudtræk synes magisk. Hvordan fungerer det egentlig? Det involverer følgende tre lag: Foldningslaget, reLu-laget og poolinglaget.

Figur (E): Funktionskort
  1. Foldningslaget

Foldningstrinnet skaber mange små stykker kaldet funktionskort eller funktioner som f.eks. de grønne, røde eller marineblå firkanter i figur (E). Disse firkanter bevarer forholdet mellem pixelerne i indgangsbilledet. Lad hver feature scanne gennem det oprindelige billede som det, der er vist i figur (F). Denne proces med at producere scorerne kaldes filtrering.

Figur (F): Filtreringsprocessen

Efter scanning af det originale billede giver hver funktion et filtreret billede med høje scorer og lave scorer, som vist i figur (G). Hvis der er et perfekt match, er der en høj score i det pågældende felt. Hvis der er et lavt match eller intet match, er scoren lav eller nul. For eksempel har den røde firkant fundet fire områder i det oprindelige billede, der viser et perfekt match med funktionen, så scoren er høj for disse fire områder.

Figur (G)

Mere filtre betyder flere funktioner, som modellen kan udtrække. Flere funktioner betyder imidlertid længere træningstid. Så det anbefales at bruge det mindste antal filtre til at udtrække funktionerne.

1.1 Padding

Hvordan bestemmer funktionerne matchet? En hyperparameter er Padding, der giver to muligheder: (i) udfyldning af det oprindelige billede med nuller for at passe til funktionen, eller (ii) fjernelse af den del af det oprindelige billede, der ikke passer, og bevaring af den gyldige del.

1.2 Strides

Foldningslaget omfatter endnu en parameter: Stride. Det er antallet af pixels, der forskydes over inputmatrixen. Når stride er 1, skifter filtrene 1 pixel ad gangen. Vi vil se det i vores Keras-kode som en hyperparameter.

2. ReLUs trin

Den rektificerede lineære enhed (Rectified Linear Unit, ReLU) er det trin, der er det samme som trinnet i de typiske neurale netværk. Det berigtiger enhver negativ værdi til nul for at garantere, at matematikken opfører sig korrekt.

3. Max Pooling Layer

Pooling skrumper billedstørrelsen. I figur (H) scanner et vindue på 2 x 2, kaldet puljestørrelsen, gennem hvert af de filtrerede billeder og tildeler den maksimale værdi af dette vindue på 2 x 2 til et kvadrat på 1 x 1 i et nyt billede. Som illustreret i figur (H) er den maksimale værdi i det første 2 x 2 vindue en høj score (repræsenteret ved rødt), så den høje score tildeles den 1 x 1 firkant.

Figur (H): Max Pooling

Ud over at tage den maksimale værdi omfatter andre mindre almindelige poolingmetoder Average Pooling (at tage den gennemsnitlige værdi) eller Sum Pooling (summen).

Figur (J)

Efter pooling produceres en ny stak af mindre filtrerede billeder. Nu opdeler vi de mindre filtrerede billeder og stabler dem i en liste som vist i figur (J).

Model i Keras

De tre ovenstående lag er byggestenene i det neurale konvolutionsnetværk. Keras tilbyder følgende to funktioner:

Du kan opbygge mange konvolutionslag i Convolution Autoencoders. I figur (E) er der tre lag mærket Conv1, Conv2 og Conv3 i kodningsdelen. Så vi vil bygge tilsvarende.

  • Koden under input_img = Input(shape=(28,28,1) erklærer, at 2D-indgangsbilledet er 28 gange 28.
  • Derpå bygges de tre lag Conv1, Conv2 og Conv3.
  • Bemærk, at Conv1 er inde i Conv2, og Conv2 er inde i Conv3.
  • Den padding angiver, hvad der skal gøres, når filteret ikke passer godt til indgangsbilledet. padding='valid' betyder, at man dropper den del af billedet, når filteret ikke passer; padding='same' fylder billedet med nuller, så det passer til billedet.

Dernæst fortsætter den med at tilføje afkodningsprocessen. Så decode-delen nedenfor har alt det kodede og afkodede.

Keras api kræver deklaration af modellen og optimeringsmetoden:

  • Model(inputs= input_img,outputs= decoded): Modellen vil omfatte alle lag, der kræves i beregningen af output decoded givet inputdataene input_img. compile(optimizer='adadelta',loss='binary_crossentropy'): Optimeringsmetoden udfører optimering som gradienten decent gør. De mest almindelige er stochastic gradient decent (SGD), Adapted gradient (Adagrad) og Adadelta, som er en udvidelse af Adagrad. Se dokumentationen om Keras-optimering i Keras-dokumentationen for at få nærmere oplysninger. Tabsfunktionerne kan findes i Keras losses-dokumentationen.

Nedenfor træner jeg modellen ved hjælp af x_train som både input og output. batch_size er antallet af prøver og epoch er antallet af iterationer. Jeg angiver shuffle=True for at kræve, at træningsdataene skal blandes før hver epoch.

Vi kan udskrive de første ti originale billeder og forudsigelserne for de samme ti billeder.

Hvordan opbygger man en konvolutionsautoenkoder til reduktion af billedstøj?

Ideen med reduktion af billedstøj er at træne en model med støjende data som input, og deres respektive klare data som output. Dette er den eneste forskel i forhold til ovenstående model. Lad os først tilføje støj til dataene.

De første ti støjende billeder ser ud som følger:

Så træner vi modellen med de støjende data som input, og de rene data som output.

Slutteligt udskriver vi de første ti støjende billeder samt de tilsvarende de-noisede billeder.

Notebooken er tilgængelig via dette link.

Er der nogen præ-trænede CNN’er kode, som jeg kan bruge?

Ja. Hvis du er interesseret i at lære koden, har Keras flere forudtrænede CNN’er, herunder Xception, VGG16, VGG19, ResNet50, InceptionV3, InceptionResNetV2, MobileNet, DenseNet, NASNet og MobileNetV2. Det er værd at nævne denne store billeddatabase ImageNet, som du kan bidrage med eller downloade til forskningsformål.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.