Autoencodere convoluționale pentru reducerea zgomotului de imagine

În „Anomaly Detection with Autoencoders Made Easy” am menționat că autoencoderele au fost aplicate pe scară largă în reducerea dimensiunilor și reducerea zgomotului de imagine. De atunci, mulți cititori m-au întrebat dacă pot aborda subiectul reducerii zgomotului de imagine cu ajutorul autoencoderelor. Aceasta este motivația acestei postări.

Modelarea datelor de imagine necesită o abordare specială în lumea rețelelor neuronale. Cea mai cunoscută rețea neuronală pentru modelarea datelor de imagine este rețeaua neuronală convoluțională (CNN, sau ConvNet) sau numită autocodificator convoluțional. În această postare voi începe cu o introducere ușoară pentru datele de imagine, deoarece nu toți cititorii sunt în domeniul datelor de imagine (vă rog să nu ezitați să săriți peste această secțiune dacă sunteți deja familiarizați). Apoi voi descrie o rețea neuronală standard simplă pentru datele de imagine. Acest lucru îmi va oferi ocazia de a demonstra de ce autocodurile convoluționale sunt metoda preferată în tratarea datelor de imagine. Mai presus de toate, voi demonstra modul în care autocodificatoarele convoluționale reduc zgomotele dintr-o imagine. În această postare folosesc modulul Keras și datele MNIST. Caietul este disponibil prin acest link. Keras este o API de rețele neuronale de nivel înalt, scrisă în Python și capabilă să ruleze peste TensorFlow. Această postare este o extensie a postării mele anterioare „Ce este recunoașterea imaginilor?”, pe care vă încurajez să o consultați.

Am crezut că este util să menționez cele trei mari categorii de date. Cele trei categorii de date sunt: (1) Date necorelate (Spre deosebire de datele seriale), (2) Date seriale (inclusiv date de text și de flux de voce) și (3) Date de imagine. Învățarea profundă are trei variante de bază pentru a aborda fiecare categorie de date: (1) rețeaua neuronală feedforward standard, (2) RNN/LSTM și (3) NN convoluțională (CNN). Pentru cititorii care caută tutoriale pentru fiecare tip, se recomandă să consulte „Explaining Deep Learning in a Regression-Friendly Way” pentru (1), articolul actual „A Technical Guide for RNN/LSTM/GRU on Stock Price Prediction” pentru (2) și „Deep Learning with PyTorch Is Not Torturing”, „What Is Image Recognition?”, „Anomaly Detection with Autoencoders Made Easy” și „Convolutional Autoencoders for Image Noise Reduction” pentru (3). Puteți adăuga la favorite articolul de sinteză „Dataman Learning Paths – Build Your Skills, Drive Your Career”.

Înțelegeți datele de imagine

O imagine este formată din „pixeli”, așa cum se arată în figura (A). Într-o imagine alb-negru, fiecare pixel este reprezentat de un număr cuprins între 0 și 255. Majoritatea imaginilor de astăzi folosesc culori pe 24 de biți sau mai mari. O imagine color RGB înseamnă că culoarea dintr-un pixel este reprezentată de combinația de roșu, verde și albastru, fiecare dintre culori variind de la 0 la 255. Sistemul de culori RGB construiește toate culorile din combinația culorilor Roșu, Verde și Albastru, așa cum se arată în acest generator de culori RGB. Astfel, un pixel conține un set de trei valori RGB(102, 255, 102) se referă la culoarea #66ff66.

Figura (A)

O imagine cu lățimea de 800 de pixeli și înălțimea de 600 de pixeli are 800 x 600 = 480.000 de pixeli = 0,48 megapixeli („megapixel” înseamnă 1 milion de pixeli). O imagine cu o rezoluție de 1024×768 este o grilă cu 1.024 coloane și 768 rânduri, care, prin urmare, conține 1.024 × 768 = 0,78 megapixeli.

MNIST

Baza de date MNIST (baza de date modificată a Institutului Național de Standarde și Tehnologie) este o bază de date mare de cifre scrise de mână, care este utilizată în mod obișnuit pentru antrenarea diferitelor sisteme de procesare a imaginilor. Setul de date de instruire din Keras are 60.000 de înregistrări, iar setul de date de testare are 10.000 de înregistrări. Fiecare înregistrare are 28 x 28 pixeli.

Cum arată? Să folosim matplotlib și funcția sa de imagine imshow() pentru a afișa primele zece înregistrări.

Stampilează datele de imagine pentru antrenare

Pentru a potrivi un cadru de rețea neuronală pentru antrenarea modelului, putem stivui toate cele 28 x 28 = 784 de valori într-o coloană. Coloana stivuită pentru prima înregistrare arată în felul următor: (folosind x_train.reshape(1,784)):

Figura (B): O parte din valori

Apoi putem antrena modelul cu o rețea neuronală standard, așa cum se arată în figura (B). Fiecare dintre cele 784 de valori este un nod în stratul de intrare. Dar stați puțin, nu am pierdut multe informații atunci când am stivuit datele? Ba da. Relațiile spațiale și temporale dintr-o imagine au fost eliminate. Aceasta este o mare pierdere de informații. Să vedem cum autocodurile convoluționale pot reține informațiile spațiale și temporale.

Figura (B)

De ce sunt autocodurile convoluționale potrivite pentru datele de imagine?

Vezi o mare pierdere de informații atunci când feliezi și stivuiești datele. În loc să stivuiască datele, autocodificatoarele convoluționale păstrează informațiile spațiale ale datelor de imagine de intrare așa cum sunt, și extrag ușor informațiile în ceea ce se numește stratul de convoluție. Figura (D) demonstrează că o imagine plană 2D este extrasă într-un pătrat gros (Conv1), apoi continuă să devină un cub lung (Conv2) și un alt cub mai lung (Conv3). Acest proces este conceput pentru a păstra relațiile spațiale din date. Acesta este procesul de codificare într-un Autoencoder. În mijloc se află un Autoencoder complet conectat, al cărui strat ascuns este compus din numai 10 neuroni. După aceasta vine cu procesul de decodificare care aplatizează cuburile, apoi la o imagine plană 2D. Codificatorul și decodificatorul sunt simetrice în figura (D). Nu este necesar ca ele să fie simetrice, dar majoritatea practicienilor adoptă pur și simplu această regulă, așa cum se explică în „Anomaly Detection with Autoencoders made easy”.

Figura (D)

Cum funcționează autocodificatoarele convoluționale?

Extragerea datelor de mai sus pare magică. Cum funcționează cu adevărat? Ea implică următoarele trei straturi: Stratul de convoluție, stratul reLu și stratul de punere în comun.

Figura (E): The Feature Maps
  1. The Convolution Layer

Etapa de convoluție creează multe piese mici numite feature maps sau caracteristici precum pătratele verzi, roșii sau albastru marin din figura (E). Aceste pătrate păstrează relația dintre pixelii din imaginea de intrare. Lăsați fiecare trăsătură să parcurgă imaginea originală așa cum se arată în figura (F). Acest proces de producere a scorurilor se numește filtrare.

Figura (F): Procesul de filtrare

După scanarea imaginii originale, fiecare caracteristică produce o imagine filtrată cu scoruri mari și scoruri mici, după cum se arată în figura (G). Dacă există o potrivire perfectă, există un scor ridicat în acel pătrat. Dacă există o potrivire slabă sau nu există nicio potrivire, scorul este scăzut sau zero. De exemplu, pătratul roșu a găsit patru zone din imaginea originală care prezintă o potrivire perfectă cu caracteristica, astfel încât scorurile sunt ridicate pentru acele patru zone.

Figura (G)

Mai multe filtre înseamnă un număr mai mare de caracteristici pe care modelul le poate extrage. Cu toate acestea, mai multe caracteristici înseamnă un timp de instruire mai lung. Așadar, vă sfătuim să folosiți un număr minim de filtre pentru a extrage caracteristicile.

1.1 Padding

Cum determină caracteristicile potrivirea? Un hiperparametru este Padding care oferă două opțiuni: (i) suplimentarea imaginii originale cu zerouri pentru a se potrivi caracteristicii sau (ii) renunțarea la partea din imaginea originală care nu se potrivește și păstrarea părții valide.

1.2 Stride

Capacitatea de convoluție include un alt parametru: Stride. Acesta este numărul de pixeli care se deplasează peste matricea de intrare. Atunci când Stride este 1, filtrele se deplasează câte un pixel pe rând. Îl vom vedea în codul nostru Keras ca un hiper-parametru.

2. Pasul ReLUs

Unitatea liniară rectificată (ReLU) este pasul care este același cu pasul din rețelele neuronale tipice. Aceasta rectifică orice valoare negativă la zero, astfel încât să garanteze că matematica se va comporta corect.

3. Max Pooling Layer

Pooling-ul micșorează dimensiunea imaginii. În figura (H), o fereastră de 2 x 2, numită dimensiune pool, parcurge fiecare dintre imaginile filtrate și atribuie valoarea maximă din acea fereastră de 2 x 2 unui pătrat de 1 x 1 dintr-o nouă imagine. După cum este ilustrat în figura (H), valoarea maximă din prima fereastră 2 x 2 este un scor ridicat (reprezentat cu roșu), astfel încât scorul ridicat este atribuit pătratului 1 x 1.

Figura (H): Max Pooling

În afară de luarea valorii maxime, alte metode de pooling mai puțin comune includ Average Pooling (luarea valorii medii) sau Sum Pooling (suma).

Figura (J)

După pooling, se produce o nouă stivă de imagini filtrate mai mici. Acum împărțim imaginile filtrate mai mici și le stivuim într-o listă, așa cum se arată în figura (J).

Model în Keras

Cele trei straturi de mai sus sunt elementele constitutive ale rețelei neuronale de convoluție. Keras oferă următoarele două funcții:

Puteți construi mai multe straturi de convoluție în Convolution Autoencoders. În figura (E) există trei straturi etichetate Conv1, Conv2 și Conv3 în partea de codificare. Așa că vom construi în consecință.

  • Codul de mai jos input_img = Input(shape=(28,28,1) declară că imaginea 2D de intrare este de 28 pe 28.
  • Apoi construiește cele trei straturi Conv1, Conv2 și Conv3.
  • Observați că Conv1 este în interiorul lui Conv2 și Conv2 este în interiorul lui Conv3.
  • Codul padding specifică ce trebuie făcut atunci când filtrul nu se potrivește bine cu imaginea de intrare. padding='valid' înseamnă renunțarea la partea din imagine atunci când filtrul nu se potrivește; padding='same' tamponează imaginea cu zerouri pentru a se potrivi cu imaginea.

Apoi continuă să adauge procesul de decodificare. Deci partea decode de mai jos are toate codificate și decodificate.

Aperi Keras necesită declararea modelului și a metodei de optimizare:

  • Model(inputs= input_img,outputs= decoded): Modelul va include toate straturile necesare în calculul ieșirilor decoded date fiind datele de intrare input_img. compile(optimizer='adadelta',loss='binary_crossentropy'): Optimizatorul realizează optimizarea așa cum o face gradientul decent. Cele mai comune sunt gradientul stochastic decent (SGD), gradientul adaptat (Adagrad) și Adadelta care este o extensie a lui Adagrad. Pentru detalii, consultați documentația optimizatorului Keras. Funcțiile de pierdere pot fi găsite în documentația Keras losses.

Mai jos antrenez modelul folosind x_train atât ca intrare, cât și ca ieșire. batch_size este numărul de eșantioane, iar epoch este numărul de iterații. Specific shuffle=True pentru a cere amestecarea datelor de antrenament înainte de fiecare epocă.

Pot fi tipărite primele zece imagini originale și predicțiile pentru aceleași zece imagini.

Cum se construiește un autocoordonator de convoluție pentru reducerea zgomotului de imagine?

Ideea de reducere a zgomotului de imagine este de a antrena un model cu date zgomotoase ca intrări, iar datele clare respective ca ieșiri. Aceasta este singura diferență față de modelul de mai sus. Să adăugăm mai întâi zgomote la date.

Primele zece imagini zgomotoase arată după cum urmează:

Apoi antrenăm modelul cu datele zgomotoase ca intrări, iar datele curate ca ieșiri.

În cele din urmă, tipărim primele zece imagini zgomotoase, precum și imaginile de-noizate corespunzătoare.

Cartetul de notițe este disponibil prin intermediul acestui link.

Există vreun cod de CNN pre-antrenat pe care îl pot folosi?

Da. Dacă sunteți interesat să învățați codul, Keras are mai multe CNN-uri pre-antrenate, inclusiv Xception, VGG16, VGG19, ResNet50, InceptionV3, InceptionResNetV2, MobileNet, DenseNet, NASNet și MobileNetV2. Merită să menționăm această mare bază de date de imagini ImageNet la care puteți contribui sau pe care o puteți descărca în scopuri de cercetare.

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.