Sztuczna inteligencja jest ostatnio bardzo popularna. Do tego stopnia, że niemalże każdy toster potrafi przygotować odpowiednio kruche kromki, bazując na naszych upodobaniach. Z uwagi na to, że ostatnio pisałem o tym jak robić procesy ETL w Azure Databricks, pomyślałem, że warto powiedzieć też o nieco innym zastosowaniu tej usługi. Mianowicie chodzi o Machine Learning, z którym Databricks radzi sobie całkiem nieźle. Co zatem jest tematem tego posta? Rozpoznawanie pisma odręcznego z Azure Databricks!
Co będziemy robić?
Zadanie jest proste – chcemy zbudować rozwiązanie, które będzie w stanie rozpoznać cyfrę napisaną odręcznie. Każdy kto kiedykolwiek programował domyśla się, że tego problemu nie rozwiążemy poprzez klasyczne algorytmy. Dlatego też powinniśmy sięgnąć po uczenie maszynowe. Nie będę tu omawiał tego zagadnienia od podstaw, bo tym zajął się już mój kolega i serdecznie zapraszam na jego bloga. Wykorzystamy tutaj klasyczne uczenie maszynowe z nauczycielem. Upraszczając – najpierw powiemy sieci neuronowej jak wyglądają cyfry napisane przez człowieka. Ta określi sobie cechy charakterystyczne każdej cyfry i będzie umiała ocenić, czy napisana cyfra to 5 czy 7.
Skąd wziąć cyfry do nauki sieci neuronowej?
Nie martw się! Na szczęście istnieją zbiory cyfr pisanych odręcznie. Są one ogólnodostępne, a opisywany przykład to takie „Hello World” dla Machine learningu. Zbiór, z którego będziemy korzystać to MNIST i można go pobrać stąd. Jak widać mamy tu dwa pliki CSV, a nie żadne obrazki, ale spokojnie, tak ma być! Na podstawie tego pliku jesteśmy w stanie wygenerować obrazki 🙂
Cały kod źródłowy opiera się na przykładzie, który pochodzi stąd i nie jestem jego autorem. Ja tylko przystosowałem go do poprawnego działania w Azure Databricks, a także trochę uprościłem. Dodam, że będziemy pisali w języku Python. Do dzieła!
Przygotowanie środowiska
Przede wszystkim potrzebujemy Azure Databricks i odpowiedniego klastra, którego konfigurację widzisz na obrazku poniżej, zwróć uwagę, że korzystamy z wersji ML. Co więcej, niezbędne będzie doinstalowanie biblioteki Fastai – to załatwimy jednym poleceniem, widocznym również na obrazku. Pamiętaj proszę, że używanie mocnych klastrów jest dosyć drogie, więc warto wyłączać go, kiedy nie potrzebujemy.
Do dzieła!
Pierwszym krokiem, jaki powinniśmy wykonać, jest pobranie bazy danych z cyframi pisanymi odręcznie . Są to dwa pliki CSV. Jeden służy do trenowania, a drugi do testowania modelu. Każdy plik składa się z 255 kolumn. Pierwsza opisuje cyfrę (0-9), a kolejne są pikselami obrazka – ale o tym więcej później.
Kolejnym krokiem jest importowanie niezbędnych bibliotek i przypisanie zmiennych z adresem plików do testów i trenowania. Konieczne jest także utworzenie folderów, w których będą przechowywane pliki z obrazkami cyfr. W tym celu wykorzystamy pętlę i to właśnie w niej utworzymy foldery dla każdej z trenowanych cyfr. W folderze „Test” umieszczone zostaną pliki do testów, czyli te, które będziemy opisywać.
Trenowanie konwolucyjnej sieci neuronowej
Skoro mamy już wszystko gotowe zajmijmy się trenowaniem naszej sieci neuronowej. Przygotujmy najpierw zbiór danych, na podstawie którego przygotowywany będzie model. Następnie rozpoczniemy naukę w 5 cyklach. Dlaczego akurat 5? Ponieważ daje dosyć dobre rezultaty. Oczywiście można zmieniać tę wartość, jeśli chcemy osiągnąć lepsze wyniki. Ten krok będzie trwał dosyć długo, więc warto się do tego przygotować, w moim przypadku trwało to 4 godziny, ale wszystko zależy od mocy klastra.
Jedyne co nam pozostaje to wypróbować działanie modelu. Jak wiemy, w folderze test znajdują się grafiki odręcznie pisanych cyfr, które nasza wytrenowana sieć neuronowa powinna rozpoznać. Zatem rozpocznijmy rozpoznawanie. Wynikiem tego procesu, będzie tablica z prawdopodobieństwem do jakiej klasy dany obrazek powinien być przypisany. Klasa to nic innego jak wartość cyfry od 0 do 9. Jeśli już dostaniemy taką tablicę, to powinniśmy wybrać indeks z najwyższym prawdopodobieństwem i będzie to poprawne przypisanie obrazka do wartości.
Teraz pozostaje nam jedynie zapisać nasze predykcje do pliku i wyświetlić klika testowanych plików, aby sprawdzić, czy nasze rozwiązanie działa poprawnie.
Rezultaty
Jak widać rozwiązanie działa poprawnie! Oczywiście jest to tylko jedna z propozycji rozpoznawania pisma odręcznego. Jeśli chcemy spróbować zrobić coś podobnego z literami to możemy wykorzystać bazę EMNIST. Cały notatnik dostępny tutaj, wystarczy zaimportować i uruchomić.
ProTip: Jeżeli nie mamy dostępu do subskrypcji Azure, to możemy skorzystać z wersji Community, zupełnie darmowej – więcej info tutaj.
ProTip 2: Chcesz więcej przykładów? Wejdź tutaj.