Uczenie maszynowe, iOS i Core ML

2

Komputery potrafią szybko liczyć i są świetne w błyskawicznym wykonywaniu dokładnie określonych poleceń, ale brakuje im kreatywności i umiejętności domyślania się w przypadku braków w specyfikacji.

Ludzie są w tej kwestii zupełnie odwrotni. Mają zwykle duże trudności z wykonaniem dokładnie określonych poleceń, ale na podstawie własnych doświadczeń robią wszystko po swojemu. Niektórzy uważają, że fajnie by było, gdyby komputery też tak potrafiły…

Co to jest uczenie maszynowe?

Uczenie maszynowe (ang. Machine Learning) to dziedzina nauki, której głównym celem jest tworzenie systemów potrafiących się doskonalić i nabywać nową wiedzę przy pomocy danych. Warto zwrócić uwagę, że nie są tu sprecyzowane żadne konkretne algorytmy. W szczególności nie są to wyłącznie sieci neuronowe, choć tak kojarzył się ten termin większości osób, z którymi rozmawiałem.

Jakie algorytmy są w takim razie wykorzystywane? Oczywiście sieci neuronowe (różne typy), ale również drzewa decyzyjne, algorytmy genetyczne, maszyny wektorów nośnych (SVM) oraz wiele, wiele innych. To naprawdę szeroki, głęboki i trudny temat. Nie zamierzam się tu skupiać na naukowej stronie sztucznej inteligencji, ponieważ nie jesteście tu, by czytać prace naukowe, a ja nie czuję się wystarczająco kompetentny w tej kwestii.

Tym, na czym chciałbym się skupić, jest praktyczne zastosowanie gotowych (nauczonych) modeli na platformie iOS. Przygotowanie modelu zostawiam data scientistom (nie słyszałem o polskim odpowiedniku tej nazwy), bo wymaga to zupełnie innych umiejętności niż programowanie.

Po co nam to?

Przeprowadzanie uczenia na urządzeniu mobilnym rzadko ma jakiś sens (ewentualnie douczanie) – nie tylko ze względów wydajnościowych, ale również z uwagi na zwykle małą dostępną ilość danych możliwych do wykorzystania w tym celu. Jednakże wykorzystywanie nauczonych modeli już jak najbardziej sens ma. Można w ten sposób pozwolić na działanie aplikacji bez dostępu do Internetu albo po prostu odciążyć serwery, obniżając koszty infrastruktury. Gdy dane użytkownika nie opuszczają należącego do niego urządzenia, nie ma też problemu z dbaniem o bezpieczeństwo informacji. Brak opóźnień wynikających z transmisji danych przez Internet pozwala również na zupełnie nowe rozwiązania, jak np. funkcje aparatu w iPhonie XS.

Można pomyśleć, że tylko najwięksi gracze mogą skorzystać z takich rozwiązań, ale w rzeczywistości jest inaczej. Owszem, jeśli jest się małą firmą lub tworzy się aplikacje na zlecenie, trudno dokonać przełomu w dziedzinie sztucznej inteligencji. Mimo to zarysowują się już pewne ścieżki, którymi można podążać.

Analiza obrazu

Analiza obrazów lub nakładanie filtrów to bardzo skomplikowane obliczeniowo zadania, które korzystają z głębokich sieci neuronowych, co sprawia, że wykonywanie tych operacji w chmurze może być bardzo kosztowne.

Wspomaganie obliczeń przez GPU albo Neural Engine pozwala na uzyskanie bardzo dobrej wydajności przy jednoczesnym uniknięciu lub zredukowaniu wspomnianego kosztu utrzymania infrastruktury. Ciekawym przykładem użycia może być biblioteka NSFWDetector, która klasyfikuje zdjęcia pod kątem zawartości pornografii. Można tego użyć np. do ukrywania podglądów niektórych plików w aplikacji lub do filtrowania treści w aplikacji społecznościowej jeszcze przed wysłaniem jej na serwer.

Proces, jaki musiał towarzyszyć uczeniu tego klasyfikatora, pozostawiam już waszej wyobraźni. ;-)

Predykcja tekstu

Z tym się już raczej wszyscy zdążyli oswoić. Chyba już każda klawiatura poza systemową na iOS posiada podpowiedzi następnego słowa. ;-) Niektórzy nawet zajmują się nauczeniem komputera pisania całych książek.

Dużo ciekawsze z perspektywy programisty są np. IntelliCode lub predykcja kodu.

Analiza tekstu

Analiza tekstu nie jest może tak zasobożerna jak analiza obrazu, ale także tutaj prywatność użytkowników ma duże znaczenie. Chyba już wszystkie liczące się komunikatory oferują szyfrowanie end-to-end. W takiej sytuacji opcją jest zastosowanie ML na urządzeniu końcowym.

A do czego? Choćby do określania stylu wiadomości (biznesowa, formalna) przed jej wysłaniem lub do analizy nastroju po odebraniu treści w celu zastosowania dla niej odpowiedniego stylu wizualnego lub przypisania kategorii (która może być wykorzystywana do powiadomień).

Jak się za to zabrać?

Gdy już określimy nasz cel, trzeba przygotować lub znaleźć odpowiedni model. To najtrudniejsza część całego zadania i w największym stopniu wpływa na wyniki. Niestety nie ma jedynej słusznej odpowiedzi, ponieważ każdy przypadek jest inny i wymaga innego podejścia.

Ciekawym źródłem na początek może być zestawienie Awesome Core ML Models. Na platformie iOS najłatwiejszym rozwiązaniem jest skorzystanie z Core ML, ale istnieją także inne rozwiązania, jak np. TensorFlow Lite. Można zaimplementować cały algorytm manualnie, czego oczywiście nie polecam.

Jak to zwykle bywa w takich sytuacjach: jeśli rzeczywiście istnieje potrzeba pisania złożonych algorytmów samodzielnie, to nie ma już co do tej potrzeby wątpliwości.

Core ML

Tryb pracy z Core ML składa się z kilku kroków. Pierwszym jest uzyskanie odpowiedniego modelu.

Następnie trzeba go konwertować przy użyciu coremltools lub innych bibliotek, np. tf-coreml na format [Core ML model] (https://apple.github.io/coremltools/coremlspecification/). Przy tej konwersji podaje się metadane określające parametry wejściowe i wyjściowe.

Kolejnym krokiem jest import modelu do swojego projektu w Xcode. To chyba najłatwiejsze zadanie, ponieważ wymaga jedynie przeciągnięcia pliku mlmodel na okno z projektem.

Gdy mamy to już za sobą, możemy przejść do implementacji. Tę można zrobić na dwa sposoby: użyć bezpośrednio klasy MLModel albo skorzystać z klas wygenerowanych przez Xcode. To drugie rozwiązanie jest oczywiście wygodniejsze. Gdy pracujemy na obrazach, jeszcze lepszym rozwiązaniem może być skorzystanie z frameworka Vision.

Jeśli używamy klas wygenerowanych przez Xcode, wystarczy zaledwie kilka linijek kodu, aby otrzymać wyniki:

let userParams: MLMultiArray = ...
let classifier = MyClassifier()
let prediction = try classifier.prediction(input1: userParams)
let userStatus = prediction.output1

Jeśli ktoś chciałby zobaczyć, jak wygląda taka implementacja używająca Vision zintegrowana z prostą aplikacją, to niedawno wrzuciłem na GitHuba przykładowy projekt z mojej prezentacji o CoreML.

Jak się okazało, faktycznej pracy z CoreML nie ma zbyt wiele. Apple postanowiło prawie całość działań przerzucić na etap przed dodaniem modelu do projektu. Programista aplikacji iOS lub macOS nie musi znać się na sztucznej inteligencji – dostaje plik mlmodel, który przedstawia gotowy model przyjmujący na wejściu jedne dane i produkujący inne. Nie jest to w żadnym razie przypadek. Tak jak wspominałem na początku, przygotowanie odpowiedniego modelu jest zadaniem raczej dla naukowca niż programisty. Nie tylko pozwala to odpowiednio podzielić pracę pomiędzy odpowiednimi osobami – prócz tego Python, którego używa się choćby do konwersji modelu, jest w środowisku naukowym po prostu najpopularniejszy. Nie bez znaczenia jest też stabilność formatu mlmodel.

Programista, który otrzyma taki plik, może z niego skorzystać bez martwienia się o wersje bibliotek itp. – system sam zadba o to, by obliczenia były wykonywane możliwie jak najlepiej (CPU, GPU, Neural Engine).

Co dalej?

Znając podstawy, możemy poddać się naszej kreatywności i zbudować kolejną aplikację zarabiającą miliony.

Co Twoim zdaniem warto zbudować przy wykorzystaniu CoreML? A o czym chcesz przeczytać w przyszłości?

Koniecznie daj znać w komentarzu!

Nie przegap kolejnych postów!

Dołącz do ponad 9000 programistów w devstyle newsletter!

Tym samym wyrażasz zgodę na otrzymanie informacji marketingowych z devstyle.pl (doh...). Powered by ConvertKit
Share.

About Author

Programista iOS w intive, prelegent, mentor, bloger. Nie cierpi oprogramowania niskiej jakości. Ważniejsze niż odgadnięcie czemu coś się psuje jest zrozumienie dlaczego działa. Więcej na mojej stronie oraz Medium.

2 Comments

  1. HEJ, witaj. Jestem poczatkujacym programista Java. Nie uzywam, jak na razie produktow Apple, ale artykul przeczytalem z duzym zaciekawieniem (dawno temu zajmowalem sie algotytmami przetwarzania obrazow). Pierwsze skojarzenie odnosnie mozliwych zastosowan tej technologii, jakie mi sie narzuca, to obrobka sciezki dzwiekowej lub wrecz tworzenie utworow muzycznych na podstawie krotkiej wstawki dzwiekowej, a byc moze tylko obrazow. Super narzedzie I fajna zabawa. Powodzenia w dalszej tworczosci.

Leave A Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.