Konwolucyjne autoenkodery do redukcji szumów obrazu

W „Anomaly Detection with Autoencoders Made Easy” wspomniałem, że autoenkodery były szeroko stosowane w redukcji wymiarów i redukcji szumów obrazu. Od tego czasu wielu czytelników pytało, czy mogę pokryć temat redukcji szumów obrazu za pomocą autoenkoderów. To jest motywacja tego postu.

Modelowanie danych obrazu wymaga specjalnego podejścia w świecie sieci neuronowych. Najbardziej znaną siecią neuronową do modelowania danych obrazu jest Convolutional Neural Network (CNN, lub ConvNet) lub zwany Convolutional Autoencoder. W tym poście zacznę od delikatnego wprowadzenia do danych obrazu, ponieważ nie wszyscy czytelnicy są w dziedzinie danych obrazu (nie krępuj się pominąć tej sekcji, jeśli jesteś już zaznajomiony). Następnie opiszę prostą standardową sieć neuronową dla danych obrazowych. To da mi możliwość zademonstrowania, dlaczego Autoenkodery Konwolucyjne są preferowaną metodą w radzeniu sobie z danymi obrazowymi. Przede wszystkim, zademonstruję jak Autoenkodery Konwolucyjne redukują szumy w obrazie. W tym poście używam modułu Keras oraz danych MNIST. Notebook jest dostępny pod tym linkiem. Keras to wysokopoziomowe API sieci neuronowych, napisane w Pythonie i zdolne do działania na wierzchu TensorFlow. Ten post jest rozszerzeniem mojego wcześniejszego postu „What Is Image Recognition?”, który zachęcam do spojrzenia.

Pomyślałem, że pomocne jest wspomnienie o trzech szerokich kategoriach danych. Te trzy kategorie danych to: (1) Dane nieskorelowane (W przeciwieństwie do danych szeregowych), (2) Dane szeregowe (w tym dane tekstowe i dane strumienia głosowego) oraz (3) Dane obrazowe. Głębokie uczenie ma trzy podstawowe odmiany, aby zająć się każdą kategorią danych: (1) standardowa sieć neuronowa feedforward, (2) RNN/LSTM, oraz (3) Convolutional NN (CNN). Dla czytelników, którzy szukają tutoriali dla każdego typu, polecamy sprawdzić „Explaining Deep Learning in a Regression-Friendly Way” dla (1), aktualny artykuł „A Technical Guide for RNN/LSTM/GRU on Stock Price Prediction” dla (2), oraz „Deep Learning with PyTorch Is Not Torturing”, „What Is Image Recognition?”, „Anomaly Detection with Autoencoders Made Easy” i „Convolutional Autoencoders for Image Noise Reduction” dla (3). Możesz założyć zakładkę artykułu podsumowującego „Dataman Learning Paths – Build Your Skills, Drive Your Career”.

Understand Image Data

Obraz składa się z „pikseli”, jak pokazano na rysunku (A). W obrazie czarno-białym każdy piksel jest reprezentowany przez liczbę z zakresu od 0 do 255. Większość współczesnych obrazów wykorzystuje 24-bitowy kolor lub wyższy. Obraz kolorowy RGB oznacza, że kolor w pikselu jest kombinacją kolorów czerwonego, zielonego i niebieskiego, a każdy z tych kolorów ma zakres od 0 do 255. System kolorów RGB konstruuje wszystkie kolory z kombinacji kolorów czerwonego, zielonego i niebieskiego, jak pokazano na tym generatorze kolorów RGB. Tak więc piksel zawiera zestaw trzech wartości RGB(102, 255, 102) odnosi się do koloru #66ff66.

Rysunek (A)

Obraz o szerokości 800 pikseli i wysokości 600 pikseli ma 800 x 600 = 480 000 pikseli = 0,48 megapiksela („megapiksel” to 1 milion pikseli). Obraz o rozdzielczości 1024×768 to siatka o 1024 kolumnach i 768 wierszach, która zawiera zatem 1024 × 768 = 0,78 megapikseli.

MNIST

Baza danych MNIST (zmodyfikowana baza danych Narodowego Instytutu Standardów i Technologii) to duża baza danych odręcznego pisma cyfrowego, która jest powszechnie używana do szkolenia różnych systemów przetwarzania obrazu. Szkoleniowy zbiór danych w Keras ma 60 000 rekordów, a testowy zbiór danych ma 10 000 rekordów. Każdy rekord ma wymiary 28 x 28 pikseli.

Jak one wyglądają? Użyjmy matplotlib i jego funkcji obrazu imshow() do pokazania pierwszych dziesięciu rekordów.

Układanie danych obrazu do szkolenia

Aby dopasować ramy sieci neuronowej do szkolenia modelu, możemy ułożyć wszystkie wartości 28 x 28 = 784 w kolumnie. Ułożona kolumna dla pierwszego rekordu wygląda następująco: (używając x_train.reshape(1,784)):

Rysunek (B): Część wartości

Wtedy możemy wytrenować model za pomocą standardowej sieci neuronowej, jak pokazano na rysunku (B). Każda z 784 wartości jest węzłem w warstwie wejściowej. Ale zaraz, czy nie straciliśmy dużo informacji, gdy układaliśmy dane w stos? Tak. Przestrzenne i czasowe relacje w obrazie zostały odrzucone. Jest to duża strata informacji. Zobaczmy, w jaki sposób autokodery konwolucyjne mogą zachować informacje przestrzenne i czasowe.

Rysunek (B)

Dlaczego autokodery konwolucyjne są odpowiednie dla danych obrazowych?

Widzimy ogromną utratę informacji podczas krojenia i układania danych. Zamiast układania danych, Convolution Autoencoders zachowują informacje przestrzenne wejściowych danych obrazu takimi, jakimi są, i delikatnie wydobywają informacje w tym, co nazywa się warstwą Convolution. Rysunek (D) pokazuje, że płaski obraz 2D jest ekstrahowany do grubego kwadratu (Conv1), a następnie kontynuowany do długiego sześcianu (Conv2) i innego dłuższego sześcianu (Conv3). Proces ten ma na celu zachowanie relacji przestrzennych w danych. Tak wygląda proces kodowania w Autoenkoderze. W środku znajduje się w pełni połączony autoenkoder, którego warstwa ukryta składa się tylko z 10 neuronów. Po tym następuje proces dekodowania, który spłaszcza sześciany, następnie do płaskiego obrazu 2D. Na rysunku (D) koder i dekoder są symetryczne. Nie muszą być symetryczne, ale większość praktyków po prostu przyjmuje tę zasadę, jak wyjaśniono w „Anomaly Detection with Autoencoders made easy”.

Rysunek (D)

How Does the Convolutional Autoencoders Work?

Powyższa ekstrakcja danych wydaje się magiczna. Jak to naprawdę działa? Wiąże się to z następującymi trzema warstwami: Warstwa konwolucji, warstwa reLu i warstwa poolingu.

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

Krok konwolucji tworzy wiele małych kawałków zwanych mapami cech lub cechami, takimi jak zielone, czerwone lub granatowe kwadraty na rysunku (E). Kwadraty te zachowują relacje pomiędzy pikselami w obrazie wejściowym. Niech każda cecha skanuje przez oryginalny obraz, jak to pokazano na rysunku (F). Ten proces tworzenia wyników jest nazywany filtrowaniem.

Rysunek (F): Proces filtrowania

Po przeskanowaniu oryginalnego obrazu, każda cecha tworzy przefiltrowany obraz z wysokimi i niskimi wynikami, jak pokazano na rysunku (G). Jeśli jest idealne dopasowanie, w tym kwadracie jest wysoki wynik. Jeśli istnieje niskie dopasowanie lub brak dopasowania, wynik jest niski lub zero. Na przykład, czerwony kwadrat znalazł cztery obszary w oryginalnym obrazie, które wykazują idealne dopasowanie do cechy, więc wyniki są wysokie dla tych czterech obszarów.

Rysunek (G)

Więcej filtrów oznacza większą liczbę cech, które model może wyodrębnić. Jednak więcej cech oznacza dłuższy czas treningu. Zaleca się więc użycie minimalnej liczby filtrów do wyodrębnienia cech.

1.1 Padding

Jak cechy określają dopasowanie? Jednym z hiper-parametrów jest Padding, który oferuje dwie opcje: (i) wyścielenie oryginalnego obrazu zerami w celu dopasowania cechy, lub (ii) usunięcie części oryginalnego obrazu, która nie pasuje i zachowanie prawidłowej części.

1.2 Strides

Warstwa konwolucji zawiera jeszcze jeden parametr: Stride. Jest to liczba pikseli przesuwających się po macierzy wejściowej. Gdy stride wynosi 1, filtry przesuwają się o 1 piksel na raz. Zobaczymy go w naszym kodzie Keras jako hiperparametr.

2. Krok ReLUs

Krok Rectified Linear Unit (ReLU) to krok, który jest taki sam jak krok w typowych sieciach neuronowych. Prostuje on każdą wartość ujemną do zera, aby zagwarantować, że matematyka będzie działać poprawnie.

3. Max Pooling Layer

Pooling zmniejsza rozmiar obrazu. Na rysunku (H) okno 2 x 2, zwane wielkością puli, skanuje każdy z przefiltrowanych obrazów i przypisuje maksymalną wartość tego okna 2 x 2 do kwadratu 1 x 1 w nowym obrazie. Jak pokazano na rysunku (H), maksymalna wartość w pierwszym oknie 2 x 2 to wysoki wynik (reprezentowany przez kolor czerwony), więc wysoki wynik jest przypisywany do kwadratu 1 x 1.

Rysunek (H): Max Pooling

Oprócz przyjmowania wartości maksymalnej, inne mniej popularne metody łączenia obejmują Average Pooling (przyjmowanie wartości średniej) lub Sum Pooling (suma).

Rysunek (J)

Po łączeniu powstaje nowy stos mniejszych przefiltrowanych obrazów. Teraz dzielimy mniejsze przefiltrowane obrazy i układamy je w listę, jak pokazano na rysunku (J).

Model w Keras

Powyższe trzy warstwy są elementami konstrukcyjnymi w sieci neuronowej convolution. Keras oferuje następujące dwie funkcje:

Można zbudować wiele warstw konwolucji w Autoenkoderach konwolucji. Na rysunku (E) w części kodującej znajdują się trzy warstwy oznaczone jako Conv1, Conv2 i Conv3. Więc zbudujemy odpowiednio.

  • Kod poniżej input_img = Input(shape=(28,28,1) deklaruje, że wejściowy obraz 2D ma wymiary 28 na 28.
  • Następnie buduje trzy warstwy Conv1, Conv2 i Conv3.
  • Zauważ, że Conv1 jest wewnątrz Conv2, a Conv2 jest wewnątrz Conv3.
  • Kod padding określa, co zrobić, gdy filtr nie pasuje dobrze do obrazu wejściowego. padding='valid' oznacza upuszczanie części obrazu, gdy filtr nie pasuje; padding='same' padów obrazu z zerami, aby dopasować obraz.

Następnie kontynuuje dodawanie procesu dekodowania. Tak więc decode część poniżej ma wszystkie zakodowane i zdekodowane.

Api Keras wymaga deklaracji modelu i metody optymalizacji:

  • Model(inputs= input_img,outputs= decoded): Model będzie zawierał wszystkie warstwy wymagane w obliczaniu danych wyjściowych decoded biorąc pod uwagę dane wejściowe input_img. compile(optimizer='adadelta',loss='binary_crossentropy'): Optymalizator wykonuje optymalizację podobnie jak gradient decentralny. Najpopularniejsze z nich to stochastyczny gradient porządny (SGD), gradient adaptowany (Adagrad) i Adadelta, która jest rozszerzeniem Adagrad. Zobacz dokumentację optymalizatora Keras, aby uzyskać szczegółowe informacje. Funkcje strat można znaleźć w dokumentacji strat Keras.

Poniżej trenuję model używając x_train zarówno jako dane wejściowe, jak i wyjściowe. batch_size jest liczbą próbek, a epoch jest liczbą iteracji. Określam shuffle=True, aby wymagać tasowania danych treningowych przed każdą epoką.

Możemy wypisać pierwsze dziesięć oryginalnych obrazów i przewidywania dla tych samych dziesięciu obrazów.

Jak zbudować autoenkoder konwolucyjny do redukcji szumów obrazu?

Pomysł redukcji szumów obrazu polega na wytrenowaniu modelu z hałaśliwymi danymi jako wejściami i odpowiadającymi im czystymi danymi jako wyjściami. To jest jedyna różnica w stosunku do powyższego modelu. Najpierw dodajmy szumy do danych.

Pierwsze dziesięć zaszumionych obrazów wygląda następująco:

Następnie trenujemy model z zaszumionymi danymi jako danymi wejściowymi, a czystymi danymi jako danymi wyjściowymi.

Na koniec wypisujemy pierwsze dziesięć zaszumionych obrazów oraz odpowiadające im obrazy pozbawione szumu.

Zeszyt jest dostępny pod tym linkiem.

Are There Any Pre-trained CNNs Code that I Can Use?

Tak. Jeśli jesteś zainteresowany nauką kodu, Keras ma kilka wstępnie wytrenowanych CNNs, w tym Xception, VGG16, VGG19, ResNet50, InceptionV3, InceptionResNetV2, MobileNet, DenseNet, NASNet i MobileNetV2. Warto wspomnieć o dużej bazie danych obrazów ImageNet, którą można współtworzyć lub pobierać do celów badawczych.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.