Jak zbudować aplikację mobilną do komputerowej wizji we Flutterze

Opublikowany: 2020-04-22

Funkcje uczenia maszynowego stały się koniecznością we współczesnych aplikacjach. Mogą zwiększyć satysfakcję i zapewnić odbiorcom niezwykłe wrażenia z aplikacji, których chcą. Dzięki ostatnim optymalizacjom sprzętu i oprogramowania realizacja modeli uczenia maszynowego przenosi się z chmury na same urządzenia mobilne.

Ma to ogromny wpływ na wrażenia użytkownika, usuwając opóźnienia odpowiedzi i rozwiązując problemy z prywatnością. Kiedy zdecydowaliśmy się stworzyć Planter, aplikację pomagającą użytkownikom dbać o rośliny domowe, wiedzieliśmy, że tym, co może wyróżnić ją na rynku aplikacji, jest sztuczna inteligencja.

Naszą ideą było dodanie funkcjonalności rozpoznawania rodzaju rośliny doniczkowej z obrazu przy użyciu komputerowych technik wizyjnych. Dzięki optymalizacji wydajności na urządzeniu TensorFlow Lite aplikacja może uruchomić nasz model klasyfikacji wyłącznie na urządzeniu użytkownika. W tym artykule wyjaśnię, jak szybko przygotować model klasyfikacji obrazów i wdrożyć go w aplikacji stworzonej na Flutterze.

Budowanie modułu uczenia maszynowego we Flutter – krok po kroku

Radzenie sobie z problemem dotyczącym małych danych

Pierwszym krokiem w budowaniu modelu uczenia maszynowego jest zbieranie danych. Aby utworzyć treningowy zestaw danych, skorzystaliśmy z narzędzia Google Images Downloader, które pozwoliło nam pobrać obrazy roślin z wyszukiwarki Google, z prawami oznaczonymi do ponownego wykorzystania komercyjnego, z następującym krótkim skryptem:

 $ googleimagesdownload --keywords "Zamioculcas zamiifolia" --usage_rights z etykietą do ponownego wykorzystania

Nasz ostateczny zestaw danych składał się z około 70-170 obrazów na gatunek. Bardzo trudno byłoby przygotować od podstaw dobrze działający model klasyfikacji obrazów przy tak małej ilości danych.

Na szczęście istnieją publicznie dostępne potężne, wstępnie wytrenowane sztuczne sieci neuronowe, których można użyć do zbudowania bardzo dokładnego klasyfikatora obrazów, nawet jeśli zbiór danych składa się tylko z około stu przykładów dla każdej klasy. Ta technika używania i modyfikowania wstępnie wytrenowanego modelu do konkretnego przypadku użycia nazywana jest uczeniem transferu.

Rozszerzanie danych

Aby maksymalnie wykorzystać nasz zestaw danych, wykorzystaliśmy pakiet przetwarzania wstępnego ImageDataGenerator firmy Keras, który generuje partie obrazów tensorów, powiększając je w locie. Wykorzystaliśmy następujące przekształcenia:

  • Odwracanie wejść w poziomie: horizontal_flip = True
  • Ustawienie wartości przesunięcia jasności z zakresu: zakres_jasności = (0,75, 1,25)
  • Ścinanie z podaną intensywnością: zakres_ścinania = 15
  • Przeskalowanie poprzez pomnożenie przez określoną wartość: rescale=1./255
  • Powiększanie i pomniejszanie: zoom_range=0,4
  • Przesunięcie w dowolnym kierunku: zakres_przesunięć_szerokości = 0,1, zakres_przesunięć_wysokości = 0,15
 train_datagen_augment =

           ImageDataGenerator(zakres_obrotu = 30,

           horizontal_flip = Prawda,

           zakres_jasności = (0,75,1,25),

           zakres_ścinania = 15,

           przeskalowanie=1./255,

           zakres_powiększenia=0.4,

           zakres_przesunięć_szerokości = 0,1,

           zakres_przesunięcia_wysokości = 0,15)

Trening

Wykorzystaliśmy NASNet-Mobile, splotową sieć neuronową przeszkoloną na ponad milionie obrazów z zestawu danych ImageNet. Architektura NasNetMobile składa się z zestawu bloków zbudowanych z komórek sieci neuronowej.

Block to moduł operacyjny, który zawiera przekształcenia znane z obrazów klasyfikujących sieci neuronowe, w tym: sploty normalne, sploty rozłączne, max-pooling, średnie-pooling, mapowanie tożsamości itp. Sieć została przeszkolona do przypisywania do obrazu 1 z 1000 kategorii obejmujących zwierzęta, kwiaty i meble. W rezultacie sieć „nauczyła się” bogatych reprezentacji funkcji dla szerokiej gamy obrazów.

Nasz model stworzyliśmy wykonując następujące kroki:

  • Usuń ostatnią warstwę wstępnie wytrenowanej sieci
  • Dodaj model splotowy na końcu sieci
  • Zamroź wszystkie warstwy w połączonej sieci z wyjątkiem tych, które pochodzą z dodanego modelu
  • Trenuj model, aż dokładność przestanie się poprawiać
  • Odblokuj wszystkie warstwy w ostatnim zamrożonym bloku splotowym wstępnie wytrenowanego modelu
  • Trenuj model, aż dokładność przestanie się poprawiać
  • Powtórz punkty 5 i 6 pięć razy
  • Odblokuj cały model i trenuj go, aż dokładność przestanie się poprawiać

Ocena modelu

Model klasyfikacji Plantera próbuje przypisać typ rośliny do rośliny doniczkowej na podstawie jej zdjęcia. Model zwraca trzy typy, do których przypisał najwyższe prawdopodobieństwa, z których użytkownik może wybrać jeden. Podczas oceny modelu wykorzystaliśmy następujące dwie metryki:

  • categorical_accuracy,
  • top_k_categorical_accuracy (przy k=3).

Poniższy wykres przedstawia dokładność kategoryczną dla każdej epoki treningowej naszego modelu.

Dokładność kategoryczna dla każdej epoki treningowej

Ostateczna dokładność kategoryczna dla zbioru ewaluacyjnego wynosi 0,870, a trzy najwyższe dokładności kategoryczne to 0,916. Wyniki te były bardzo satysfakcjonujące, biorąc pod uwagę niewielki rozmiar użytego zestawu danych uczących.

Konwersja modelu

Jeśli chcemy, aby model Keras był używany w aplikacji mobilnej, należy go przekonwertować na obiekt TensorFlow Lite FlatBuffer. Można to zrobić za pomocą kodu pokazanego w poniższym przykładzie.

 zaimportuj tensorflow.lite jako lite

keras_model_path = "model/model_keras"

tflite_model_path = "model/model.tflite"

model.save(keras_model_path)

konwerter = lite.TFLiteConverter.from_keras_model_file(keras_model_path)

tflite_model = konwerter.convert()

open(tflite_model_path, "wb").write(tflite_model)

Teraz, gdy mamy zoptymalizowany model przechowywany w ścieżce model/model.tflite, możemy go łatwo używać w natywnych aplikacjach mobilnych, używając:

  • Core ML – dla aplikacji na iOS
  • Biblioteka obsługi systemu Android TensorFlow Lite — dla aplikacji na Androida

Teraz pokażę Wam, na podstawie naszych doświadczeń z Planterem, jak używać tego modelu z Flutterem.

Dlaczego trzepotać?

Flutter to zestaw narzędzi interfejsu użytkownika należący do Google. Został stworzony do budowania natywnie kompilowanych aplikacji na urządzenia mobilne, webowe i desktopowe z jednej bazy kodu. Jeśli zastanawiasz się, czy powinieneś używać Fluttera, polecam przeczytanie tego artykułu, który jest studium przypadku Topline autorstwa Abbey Road Studios opracowanym we Flutter przez Miquido.

Możemy wykorzystać nasz model z biblioteką tflite. Jest to wtyczka Flutter umożliwiająca dostęp do API TensorFlow Lite. Obsługuje klasyfikację obrazów, wykrywanie obiektów, Pix2Pix, Deeplab i PoseNet na platformach iOS i Android.

Ikona wieloplatformowych usług programistycznych

Ciekawi Cię rozwój Fluttera?

Ucz się więcej

W naszym procesie tworzenia aplikacji musieliśmy wykonać następujące kroki:

  • Dodaj tflite jako zależność w naszym pliku pubspec.yaml
  • Utwórz folder zasobów i umieść w nim plik etykiety oraz plik modelu.
  • W pubspec.yaml dodaj:
 majątek:

   - asset/labels.txt

   - zasoby/mobilenet_v1_1.0_224.tflite
  • Zaimportuj bibliotekę tflite:
 importuj „pakiet:tflite/tflite.dart”;
  • Załaduj model i etykiety:
 String res = czekaj na Tflite.loadModel(

  model: "assets/model.tflite",

  etykiety: "assets/labels.txt",

  numThreads: 1 // domyślnie 1

);
  • Uruchom model na obrazie (wykonaj prognozę):
 rozpoznania var = czekaj na Tflite.runModelOnImage(

        ścieżka: tfResizedImage.path, 

        imageStd: 255.0, 

        liczbaWyników: 3, 

        próg: 0,00001, 

        asynchroniczny: prawda    

 );

Dane wyjściowe prognozy mają format pokazany w następującym przykładzie:

 [{zaufanie: 0,03441339731216431, indeks: 46, etykieta: Vriesea splendens}, {zaufanie: 2.086162567138672e-7, indeks: 7, etykieta: Aphelandra squarrosa}, {zaufanie: 1.4901161193847656e-7, indeks: 19, etykieta: Paproć arum }]
  • Zwolnij zasoby:
 czekaj na Tflite.close();

Wyniki końcowe

Planter pozwala dodać roślinę z obrazem do biblioteki. Możesz uzyskać obraz, robiąc zdjęcie swojej rośliny lub wybierając jedno z galerii telefonu. Zawarty model klasyfikacji roślin domowych zwraca trzy gatunki rozpoznane z największym prawdopodobieństwem i przedstawia je na liście.

Kliknięcie na gatunek przeniesie Cię do widoku podsumowania roślin, który zawiera wstępnie wypełniony formularz z sugerowanymi harmonogramami nawadniania i nawożenia oraz kilka dodatkowych informacji o roślinie. W poniższym schemacie możesz zobaczyć przykład, w którym Zamioculcas zamiifolia jest rozpoznawany na zdjęciu zrobionym telefonem z aparatem.

Jak działa sadzarka
Sadzarka - system rozpoznawania
Jak dodać rośliny w Planter

Przenieś swoje uczenie maszynowe na urządzenia mobilne!

W tym artykule chciałem Cię przekonać, że dodanie atrakcyjnych dla użytkownika funkcji AI w Twojej aplikacji mobilnej może być proste i szybkie. Co więcej, przeniesienie wykonania modelu na urządzenia mobilne zapewnia użytkownikom wspaniałe wrażenia, usuwając opóźnienia w odpowiedziach API. Pomaga również zapewnić bezpieczeństwo danych, ponieważ wysyłanie danych do chmury nie jest wymagane.

Możesz wiele skorzystać z używania Fluttera i jego możliwości kompilowania kodu dla natywnych aplikacji na iOS i Androida w tym samym czasie. Przy niewielkim wysiłku możesz wyróżnić swoją aplikację na rynku i zmaksymalizować jej utrzymanie wśród odbiorców.

Gotowy na kolejny projekt? Nie wahaj się i skontaktuj się z nami!