Zintegruj model niestandardowy z aplikacją

1. Zanim zaczniesz

W pierwszym ćwiczeniu z programowania z tej serii stworzyliśmy bardzo prostą aplikację, która za pomocą funkcji dodawania etykiet do obrazów analizuje zawartość obrazów. Zdjęcie stokrotki pokazało, że widziało m.in. płatek albo niebo. Następnie w ramach drugiego ćwiczenia w Codelabs przełączyłeś się na Pythona, aby wytrenować nowy, niestandardowy model rozpoznający 5 różnych rodzajów kwiatów.

W ramach tego ćwiczenia w Codelabs zaktualizujesz aplikację z pierwszego modułu, korzystając z modelu z drugiego.

Pełny kod źródłowy tego modułu dotyczącego kodu możesz uzyskać, sklonując to repozytorium. Zobaczysz podkatalogi na Androida i iOS. Kod z poprzedniego ćwiczenia w Codelabs jest dostępny jako ImageClassifierStep1, jeśli chcesz go kontynuować. Gotowy kod ćwiczenia z programowania jest dostępny w postaci ImageClassifierStep2.

Wymagania wstępne

  • Musisz ukończyć 2 pierwsze ćwiczenia z programowania w tej ścieżce szkoleniowej

Czego się nauczysz i czego się nauczysz

  • Zintegruj z aplikacją na Androida lub iOS model niestandardowy wytrenowany w poprzednim module

Czego potrzebujesz

  • Android Studio jest dostępny na stronie developer.android.com/studio, która jest dostępna w ramach modułu dotyczącego Androida.
  • Xcode, dostępny w Apple App Store, dla iOS w części modułu

2. Pobierz aplikację Starter

Najpierw pobierz aplikację z programu ćwiczeń z programowania na Androida lub iOS, którą znajdziesz w pierwszej aplikacji do rozpoznawania obrazów. Jeśli znasz już cały moduł, będzie on nosił nazwę ImageClassifierStep1. Jeśli nie chcesz przechodzić przez moduł, możesz skopiować gotową wersję z repozytorium.

Otwórz aplikację w Android Studio i wprowadź niezbędne aktualizacje, a gdy wszystko będzie gotowe, uruchom aplikację, aby sprawdzić, czy działa. Powinien pojawić się ekran podobny do tego:

f3703d45d1332d1d.png

Aplikacja jest dość prosta, ale zawiera kilka zaawansowanych funkcji, które można wyświetlić przy użyciu odrobiny kodu. Jeśli jednak chcesz, aby kwiat był rozpoznawany jako stokrotka, a nie tylko jako kwiat, musisz zaktualizować aplikację, aby używała modelu niestandardowego z sekcji „Tworzenie modelu niestandardowego” w ćwiczeniach z programowania klasyfikatorów obrazów.

3. Aktualizowanie pliku build.gradle, aby używać niestandardowych modeli ML Kit

  1. W Android Studio znajdź plik build.gradle na poziomie aplikacji. Najłatwiej to zrobić w eksploratorze projektów. Upewnij się, że u góry jest wybrana opcja Android. Zobaczysz na dole folder Skrypty Gradle.
  2. Otwórz moduł z nazwą swojej aplikacji i ciągiem „.app”. jak tutaj – (moduł: ImageClassifierStep1.app):

8fe1d04b40610047

  1. Na dole pliku znajdź ustawienie dependencies. Powinien tam być widoczny ten wiersz:
implementation 'com.google.mlkit:image-labeling:17.0.1'

Numer wersji może być inny. Najnowsza wersja wersji jest zawsze dostępna na stronie ML Kit na https://developers.google.com/ml-kit/vision/image-labeling/android.

  1. Zastąp go odwołaniem do biblioteki etykiet niestandardowych obrazów. Numer wersji znajdziesz na https://developers.google.com/ml-kit/vision/image-labeling/custom-models/android.
implementation 'com.google.mlkit:image-labeling-custom:16.3.1'
  1. Dodatkowo dodasz model .tflite utworzony w poprzednim module. Nie chcesz, by ten model był skompresowany podczas kompilowania aplikacji przez Android Studio, więc pamiętaj, by użyć tego ustawienia w sekcji Android tego samego pliku build.gradle:
aaptOptions{
    noCompress "tflite"
}

Upewnij się, że nie znajduje się on w żadnym innym ustawieniu. Powinien być umieszczony bezpośrednio w tagu android. Oto przykład:

62d546bff11d2a50.png

4. Dodaj model TFLite

W ramach poprzedniego ćwiczenia w Codelabs udało Ci się utworzyć model niestandardowy i pobrać go jako model.tflite.

Znajdź w projekcie folder assets, który obecnie zawiera flower1.jpg. Skopiuj model do tego folderu w ten sposób:

  1. W Android Studio kliknij prawym przyciskiem myszy folder Zasoby. W wyświetlonym menu wybierz Pokaż w Finderze. („Pokaż w Eksploratorze” w systemie Windows, a w systemie Linux – „Pokaż w Plikach”).

db30b47e419a326b.png

  1. Zostanie otwarty katalog w systemie plików. Skopiuj plik model.tflite do tego katalogu wraz z plikiem flower1.jpg.

36de0c51bec1c19e.png

Android Studio zaktualizuje się i wyświetli oba pliki w folderze zasobów:

e9f4e9f394d9b357.png

Możesz teraz zaktualizować kod.

5. Zaktualizuj swój kod dla modelu niestandardowego

Pierwszym krokiem będzie dodanie kodu, który pozwoli wczytać model niestandardowy.

  1. W pliku MainActivity dodaj w polu onCreate ten kod bezpośrednio pod wierszem setContentView(R.layout.activity_main).

Spowoduje to użycie modelu LocalModel do kompilacji na podstawie zasobu model.tflite. Jeśli Android Studio zgłasza skargi, włączając „LocalModel” czerwony, naciśnij ALT + Enter, aby zaimportować bibliotekę. Powinien dodać import do pliku com.google.mlkit.common.model.LocalModel.

val localModel = LocalModel.Builder()
        .setAssetFilePath("model.tflite")
        .build()

Wcześniej w module obsługi btn.setOnClickListener używany był model domyślny. Zostało ono skonfigurowane za pomocą tego kodu:

val labeler = ImageLabeling.getClient(ImageLabelerOptions.DEFAULT_OPTIONS)

Zastąpisz ją, aby używać modelu niestandardowego.

  1. Skonfiguruj obiekt opcji niestandardowych:
val options = CustomImageLabelerOptions.Builder(localModel)
        .setConfidenceThreshold(0.7f)
        .setMaxResultCount(5)
        .build()

Zastępują one opcje domyślne własnym zestawem. Próg ufności wyznacza poprzeczkę, gdy jakość prognoz jest zwracana. W przykładzie u góry tego ćwiczenia z programowania, w którym obraz przedstawiał stokrotkę, były 4 prognozy – każda z wartością obok siebie, np. „Niebo”. gdzie 0,7632.

Możesz skutecznie odfiltrować wyniki o niższej jakości, stosując wysoki próg ufności. Ustawienie wartości na przykład na 0,9 nie spowoduje zwrócenia żadnej etykiety o niższym priorytecie. Parametr setMaxResultCount() jest przydatny w modelach z wieloma klasami, ale ten model ma ich tylko 5, więc zostawisz 5.

Skoro masz dostępne opcje dla osoby oznaczającej etykietami, możesz zmienić jej wystąpienie na:

val labeler = ImageLabeling.getClient(options)

Pozostała część kodu będzie działać bez modyfikacji. Wypróbuj tę funkcję!

dd40c36c4edbb33.png

Tutaj widzimy, że ten kwiat został zidentyfikowany jako stokrotka z prawdopodobieństwem 0,959.

Załóżmy, że dodałeś(-aś) drugi obraz kwiatu i użyliśmy go ponownie:

8556a5fbea487842.png

Przedstawia je jako różę.

Być może zastanawiasz się, dlaczego zamiast słowa „róża” widzisz słowo róże. Dzieje się tak, ponieważ w zbiorze danych etykiety są oznaczane nazwami folderów i niestety są one nieco niespójne – czasami są to liczby pojedynczej (np. „daisy”), a czasem liczby mnogiej (np. „róże”). Nie myl tego z modelem próbującym policzyć elementy na zdjęciu – to znacznie bardziej prymitywny sposób, który potrafi rozpoznawać tylko rodzaje kwiatów.

6. Pobierz aplikację Start na iOS

  1. Na początek potrzebujesz aplikacji z pierwszego ćwiczenia z programowania. Jeśli znasz już cały moduł, będzie on nosił nazwę ImageClassifierStep1. Jeśli nie chcesz przechodzić przez moduł, możesz skopiować gotową wersję z repozytorium. W repozytorium nie ma podów ani plików .xcworkspace, więc zanim przejdziesz do następnego kroku, uruchom polecenie „pod install” w tym samym katalogu co .xcproject.
  2. Otwórz plik ImageClassifierStep1.xcworkspace w Xcode. Zwróć uwagę, że lepiej jest użyć pliku .xcworkspace, a nie .xcproject, ponieważ masz pakiet ML Kit z podami, które zostaną wczytane w obszarze roboczym.

Do końca tego modułu będę uruchamiać aplikację w symulatorze iPhone'a, który powinien obsługiwać cele kompilacji z ćwiczenia z programowania. Jeśli chcesz użyć własnego urządzenia, być może konieczna będzie zmiana celu kompilacji w ustawieniach projektu, tak aby pasował do wersji iOS.

Uruchom go, a zobaczysz coś takiego:

9e151ed18f99fb98.png

Zwróć uwagę na bardzo ogólne klasyfikacje – płatek, kwiat, niebo. Model utworzony w ramach poprzedniego ćwiczenia w Codelabs został wytrenowany tak, aby wykrywał 5 odmian kwiatów, w tym stokrotkę.

W pozostałej części tego ćwiczenia z programowania dowiesz się, co jest potrzebne do uaktualnienia aplikacji do modelu niestandardowego.

7. Używanie podów do tworzenia etykiet obrazów niestandardowych ML Kit

Pierwsza aplikacja użyła pliku poda, aby pobrać podstawowe biblioteki i model ML Kit Image Labeler. Musisz go zaktualizować, aby używać bibliotek niestandardowych etykiet obrazów.

  1. Znajdź w katalogu projektu plik o nazwie podfile. Jeśli go otworzysz, zobaczysz coś takiego:
platform :ios, '10.0'

target 'ImageClassifierStep1' do
        pod 'GoogleMLKit/ImageLabeling'
end
  1. Zmień deklarację poda z ImageLabeling na ImageLabelingCustom w ten sposób:
platform :ios, '10.0'

target 'ImageClassifierStep1' do
        pod 'GoogleMLKit/ImageLabelingCustom'
end
  1. Gdy skończysz, skorzystaj z terminala, by przejść do katalogu zawierającego plik podfile (oraz obszar .xcworkspace) i uruchomić pod install.

bb5d78eb7c7ab975.png

Po kilku chwilach biblioteki MLKitImageLabeling zostaną usunięte i dodane niestandardowe. Aby edytować kod, możesz teraz otworzyć obszar .xcworkspace.

8. Dodaj model TFLite do Xcode

W ramach poprzedniego ćwiczenia w Codelabs udało Ci się utworzyć model niestandardowy i pobrać go jako model.tflite. Jeśli nie masz tego pod ręką, wróć i uruchom ćwiczenia z programowania lub skorzystaj z kodu Colab tutaj. Jeśli nie masz dostępu do Google Colab, notatnik jest dostępny pod tym linkiem

  1. Po otwarciu obszaru roboczego w Xcode przeciągnij do projektu plik model.tflite. Powinien się znajdować w tym samym folderze co pozostałe pliki, np. ViewController.swift lub Main.storyboard.
  2. Pojawi się okno z opcjami dodawania pliku. Upewnij się, że wybrana jest opcja Dodaj do celów. W przeciwnym razie po wdrożeniu na urządzeniu model nie będzie połączony z aplikacją.

Należy pamiętać, że opcja „Dodaj do celów” będzie on zawierał ImageClassifierStep1, jeśli został przez Ciebie wykonany i kontynuowany krok po kroku w tym module, lub ImageClassifierStep2 (jak pokazano na ekranie), jeśli przeskoczysz do gotowego kodu.

5b6a7f40c73f0f1f.png

Zapewni to możliwość wczytania modelu. W następnym kroku dowiesz się, jak to zrobić.

9. Aktualizowanie kodu pod kątem modelu niestandardowego

  1. Otwórz plik ViewController.swift. Podczas importowania pliku z MLKitImageLabeling może wystąpić błąd znajdującą się w górnej części pliku. Dzieje się tak, ponieważ podczas aktualizowania pliku poda zostały usunięte ogólne biblioteki etykietowania obrazów. Możesz usunąć ten wiersz i uzupełnić go w następujący sposób:
import MLKitVision
import MLKit
import MLKitImageLabelingCommon
import MLKitImageLabelingCustom

Łatwo je odczytać i myśleć, że powtarzają ten sam kod. Ale jest „Powszechny” i „Niestandardowe” na końcu!

  1. Następnie wczytasz model niestandardowy dodany w poprzednim kroku. Znajdź funkcję getLabels(). Pod wierszem z napisem visionImage.orientation = image.imageOrientation dodaj te wiersze:
// Add this code to use a custom model
let localModelFilePath = Bundle.main.path(forResource: "model", ofType: "tflite")
let localModel = LocalModel(path: localModelFilePath!)
  1. Znajdź kod określający opcje ogólnego elementu ImageLabeler. Prawdopodobnie powoduje to błąd, ponieważ te biblioteki zostały usunięte:
let options = ImageLabelerOptions()

Zastąp go tym kodem, aby użyć parametru CustomImageLabelerOptions, który określa model lokalny:

let options = CustomImageLabelerOptions(localModel: localModel)

...i to wszystko! Spróbuj uruchomić aplikację teraz. Obraz powinien być dokładniej sklasyfikowany, a w rezultacie dać Ci znać, że patrzysz na stokrotki o wysokim prawdopodobieństwie.

238cd21748a97cf4.png

Załóżmy, że dodałeś(-aś) drugi obraz kwiatu i użyliśmy go ponownie:

75f3970a6b509bfe.png

Aplikacja wykryła, że ten obraz pasuje do etykiety „róże”.

10. Gratulacje!

Udało Ci się przejść od tworzenia aplikacji używającej ogólnego modelu do rozpoznawania zawartości obrazu do utworzenia własnego modelu ML do rozpoznawania określonych rzeczy, takich jak kwiaty, a następnie aktualizowania aplikacji, aby korzystała z modelu niestandardowego.

Powstała aplikacja będzie oczywiście bardzo ograniczona, ponieważ bazowała na pakietach komponentów z obrazem. Jednak część ML działa dobrze. Możesz na przykład użyć Aparatu AndroidX, aby zrobić klatki z transmisji na żywo i sklasyfikować je, aby zobaczyć, jakie kwiaty rozpoznaje telefon.

Możliwości są tu nieograniczone – a jeśli masz własne dane dotyczące czegoś innego niż kwiaty, musisz zadbać o to, aby stworzyć aplikację, która będzie je rozpoznawać za pomocą Komputerowego rozpoznawania obrazów. To tylko kilka pierwszych kroków do bogatszego świata. Mamy nadzieję, że Ci się spodobały.