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

Głębokie uczenie w rozpoznawaniu obrazu

Dopiero w ostatnich kilku latach opracowano dostatecznie dobre rozwiązanie rozpoznawania obiektów za pomocą głębokich sieci konwolucyjnych. Dzięki niemu takie rozsławione w mediach zjawiska, jak autonomiczny sklep firmy Amazon czy inwigilacja chińskiego społeczeństwa na szeroką skalę, stały się możliwe. Dotyczy to także rozwiązań, z których każdy z nas korzysta lub z którymi się zetknął, jak rozpoznawanie twarzy lub pisma, rozszerzona rzeczywistość, wspomaganie obrazowania i diagnozowania medycznego itp. Mimo że nazwa „sieć konwolucyjna” kojarzy się z powieściami science fiction Williama Gibsona, zrozumiemy zasadę działania tego wynalazku, gdy dokonamy jego rozbioru na części składowe. 

 

Prosty start:

Zanim zaczniemy zastanawiać się, jak nasz komputer może rozpoznawać np. ptaki, spróbujmy zacząć od czegoś prostszego − od rozpoznawania napisanej odręcznie cyfry 8.

Wyobraźmy sobie, że stworzyliśmy małą sieć neuronową (na podstawie z wiedzy z artykułu o tłumaczeniu maszynowym), aby oszacować ceny domów w zależności od liczby sypialni, powierzchni czy dzielnicy, w jakiej się znajdują:

Wiemy także, że sama koncepcja uczenia maszynowego polega na wielokrotnym posługiwaniu się algorytmami. Wystarczy podstawić nowe dane, aby rozwiązać inne problemy. Dlatego też w tym przypadku zmodyfikujemy tę samą sieć neuronową, aby rozpoznać napisany odręcznie tekst. Aby uprościć ten proces, naszym zadaniem będzie rozpoznanie jednej cyfry − 8.

Uczenie maszynowe działa tylko wtedy, gdy mamy odpowiednie dane, najlepiej w dużej ilości. Dlatego, aby rozpocząć proces, potrzebne nam są duże ilości zdjęć, na których znajduje się odręcznie napisana cyfra osiem. Na nasze szczęście badacze wykreowali MNIST, czyli bazę danych zawierającą ręcznie napisane cyfry, służącą właśnie do uczenia maszynowego. MNIST daje nam dostęp do 60 000 obrazów z ręcznie napisanymi cyframi o rozmiarze 18x18 pikseli.

Oto trochę przykładów cyfry 8 z bazy MNIST:

Jeśli przyjrzymy się bliżej, dane wejściowe w naszej przykładowej sieci neuronowej to cyfry − 3 sypialnie czy 185,80 metrów kwadratowych powierzchni itd.

Teraz jednak chcemy, aby nasza sieć przeglądała obrazy. W jaki sposób tego dokonać?

Odpowiedź na to pytanie jest niezwykle prosta. Sieć neuronowa pobiera liczby jako dane wejściowe. Dla komputera każdy obraz stanowi tak naprawdę wykres cyfr, które reprezentują dane informujące o natężeniu czerni w każdym pikselu:

Zatem aby obraz cyfry 8 mógł być przetworzony w naszej sieci neuronowej, zostanie on potraktowany jako zbiór 324 cyfr (324, ponieważ 18x18 piksel). 

Aby było to możliwe, musimy zwiększyć naszą sieć, by miała 324 połączenia wejściowe:

Zauważmy, że nasza sieć neuronowa ma także dwa wyjścia (zamiast jednego). Pierwsze wyjście będzie przewidywało prawdopodobieństwo, że dany obraz reprezentuje cyfrę 8, a drugie wyjście będzie przewidywać prawdopodobieństwo, że dany obraz nie jest cyfrą 8. Stworzenie oddzielnych wyjść dla każdego typu obiektu, który chcemy rozpoznawać, umożliwia nam użycie sieci neuronowej do klasyfikacji obiektów w grupy.

Nasza sieć neuronowa jest o wiele większa niż poprzednia (324 wejścia zamiast 3!) Współczesne komputery, czy nawet telefony komórkowe są w stanie bez problemów przetwarzać takie ilości danych w sieci neuronowej.

Zostało więc tylko wytrenowanie naszej sieci neuronowej przy użyciu obrazów przedstawiających cyfrę osiem i inne cyfry, aby nauczyć ją rozpoznawania ósemki. Nauczymy ją, że prawdopodobieństwo obrazu z ósemką jest stuprocentowe, a obrazu zawierającego inną cyfrę − zero procent.

Oto przykład naszych danych uczących:

Jesteśmy w stanie wytrenować taki rodzaj sieci neuronowej w kilka minut na nowoczesnym laptopie. Kiedy ukończymy proces uczenia naszej sieci, będzie ona w stanie rozpoznawać obrazy odręcznie napisanej cyfry osiem z niezłą dokładnością.

Witajcie w erze rozróżniania obrazów późnych lat osiemdziesiątych!