artykuły

Głębokie uczenie w rozpoznawaniu obrazu

25
20 marca 2019, 14:01 Krzysztof Wołk

Konwolucyjne sieci neuronowe

Intuicyjnie wiemy, że każdy obraz ma pewną hierarchię albo strukturę koncepcyjną.

Weźmy za przykład to oto zdjęcie:

  • Drewniana podłoga.
  • Na zdjęciu jest mydełko w kształcie dziecka.
  • Dziecko leży na poduszce, która znajduje się na drewnianej podłodze.

Najważniejsze w wypadku tego zdjęcia jest to, że niezależnie od typu powierzchni jesteśmy pewni, że widzimy właśnie mydełko w kształcie dziecka. Dla ludzkiej percepcji niezależnie od jakiejkolwiek zmiany typu powierzchni mydełko będzie zawsze mydełkiem − nie musimy się ponownie zaznajamiać z koncepcją mydełka.

Niestety, jest to umiejętność, której nasza prosta sieć neuronowa nie ma. Dla niej cyfra 8 poza pozycją środkową na obrazie jest traktowana jako kompletnie inny obiekt. Nasza sieć nie pojmuje, że zmiana położenia cyfry nie wpływa na tę cyfrę. A zatem sieć musi mieć możliwość ciągłego uczenia się, aby rozpoznawać ósemkę w każdej możliwej pozycji na zdjęciu.

Trzeba więc dostarczyć sieci neuronowej możliwości translacji inwariancji − cyfra 8 pozostanie zawsze tą samą cyfrą niezależnie od pozycji, w jakiej pojawi się na zdjęciu.

Dokonamy tego, używając procesu, który nazywa się konwolucją. Pomysł konwolucji wziął się po części z nauk informatycznych, ale też po części z biologii (jacyś opętani naukowcy zgłębiali zasadę przetwarzania obrazów przez kocie mózgi).

Zasada działania konwolucji jest intuicyjna. Zamiast dostarczać do naszej sieci danych wejściowych w formie całych obrazów w postaci cyfrowej, dokonamy czegoś bardziej inteligentnego − wykorzystamy koncepcję, że dowolny obiekt pozostaje niezmiennie tym samym obiektem niezależnie od pozycji zajmowanej na obrazie.

Krok po kroku do naszego rozwiązania:

Etap 1: Podzielmy obraz na nakładające się na siebie kwadraty przypominające przesuwające się okno na ilustracji powyżej. Następnie przesuńmy sliding window nad każdym fragmentem i zapiszmy każdy wynik jako oddzielne dane:

W ten sposób zamieniliśmy nasz oryginalny obraz w 77 malutkich kwadracików o tych samych rozmiarach.

Etap 2: Załadujmy każdy mały fragment oddzielnie do sieci neuronowej. Wcześniej dostarczyliśmy cały obraz cyfry 8. Teraz zrobimy dokładnie to samo, ale będą to oddzielne fragmenty:

Powtórzmy to 77 razy, po jednym razie na każdy fragment. 

Ważne jest, abyśmy utrzymali te same wagi sieci neuronowej dla każdego elementu. Jednym słowem, traktujemy każdy pojedynczy fragment na równi z innymi. Jeśli pojawi się coś interesującego na którymkolwiek fragmencie, to możemy zaznaczyć, że jest on w jakiś sposób szczególny.

Etap 3: Zapiszmy wyniki z każdego wczytanego fragmentu w nowy zbiór, aby nie zatracić oryginalnego układu całości. Zachowamy informację z każdego fragmentu na siatce, która będzie wiernie odwzorowywała oryginalny obraz. Wygląda to następująco:

Inaczej to ujmując, zaczęliśmy od dużego obrazu, a skończyliśmy na niewiele mniejszym zbiorze małych elementów całości, które odwzorowują całość, ale niektóre z nich zaznaczone są jako najbardziej interesujące.

Etap 4: Przejdźmy do zmniejszania ilości danych. Wynikiem etapu 3 było uzyskanie zbioru elementów całego obrazu, ale z zaznaczonymi najbardziej interesującymi fragmentami oryginału. Ten zbiór jest ciągle dość duży.

Aby zmniejszyć ilość danych, posłużymy się algorytmem nazwanym warstwą zbiorczą (max pooling). Brzmi to skomplikowanie, ale tak naprawdę nie jest to wcale bardzo trudne.

Dokonaliśmy przeglądu każdego kwadratu 2x2 ze zbioru, zatrzymując największe numery.

Kierowaliśmy się zasadą, że gdy znaleźliśmy coś interesującego w każdym z czterech kwadratów stanowiących dane wejściowe fragmentów na siatce o wymiarach 2x2, to zatrzymujemy tylko te części, które nas najbardziej interesują.

To powoduje zmniejszenie zbioru danych i jednocześnie zachowanie najbardziej istotnych dla nas fragmentów całości.

Etap kończący: Teraz dokonamy wstępnego prognozowania. Do tej pory udało się nam zredukować ogromny obraz naszej cyfry do dość małego zbioru danych.

Ten zbiór to po prostu cyfry i możemy ich użyć jako danych wejściowych dla następnej sieci neuronowej. Ta ostatnia sieć neuronowa zadecyduje o tym, czy nasz obraz zgadza się z wzorcem, czy też nie. Aby odróżnić ten etap od konwolucji, określimy go jako sieć całkowicie podłączoną.

Od etapu początkowego do końcowego nasze działania można podsumować następująco:

Dodawanie jeszcze większej liczby etapów

Nasza linia produkcyjna przetwarzania obrazu składa się teraz z kolejnych etapów: konwolucji, warstwy zbiorczej oraz końcowej całkowicie połączonej sieci neuronowej.

Aby rozwiązywać skomplikowane zadania ze świata rzeczywistego, możemy łączyć i nakładać te wszystkie procesy w dowolnych ilościach. Możemy utworzyć więcej warstw sieci konwolucyjnej − od dwóch nawet do dziesięciu (więcej rzadko się stosuje). Za każdym razem można posłużyć się warstwami zbiorczymi, czyli ekstrakcją najistotniejszych informacji z równoczesną dyskryminacją innych danych, aby zmniejszyć ich ilość.

Podstawowym założeniem jest tutaj, aby zacząć od dużego obrazu i kontynuować jego zmniejszanie, krok po kroku, aż uzyskamy pożądany przez nas wynik. Dodawanie większej liczby warstw konwolucyjnych doprowadzi do większej ilości cech, które nasza głęboka sieć neuronowa będzie w stanie rozpoznać.

Dla przykładu można podać, że pierwszy etap konwolucji może rozpoznawać ostre krawędzie, w drugim etapie możemy dodać rozpoznawanie dziobów na podstawie wiedzy o ostrych krawędziach, trzecia warstwa konwolucyjna może już rozpoznać całego ptaka, opierając się na wiedzy o dziobie − i tak dalej.

Oto przykład bardziej realistycznej sieci konwolucyjnej:

W tym przypadku tworzenie sieci zapoczątkowano od obrazu o wymiarach 224x224 pikseli i dodano konwolucję oraz warstwę zbiorczą danych dwa razy. Następnie dodano trzy dodatkowe warstwy konwolucyjne oraz powtórzono utworzenie warstwy zbiorczej danych i dwóch warstw całkowicie połączonych. W rezultacie otrzymano klasyfikację danego obrazu bazującą na 1000 różnych kategorii!

A jak dowiemy się, które z tych etapów musimy połączyć, aby nasz „wykrywacz” obrazów działał jak najlepiej?

Szczerze mówiąc, jedyną dobrą odpowiedzią na to pytanie jest wykonanie wielu eksperymentów oraz prób. Może się okazać, że musimy nauczyć około 100 warstw sieci neuronowych, zanim osiągniemy optymalne parametry i strukturę dla zadania, które mamy rozwiązać. Uczenie maszynowe to ciągłe uczenie się na błędach.

3