Rozpoznawanie kwiatów za pomocą TensorFlow Lite na Androidzie

1. Wprowadzenie

657431be3173fa86.png android.png

Uwaga: to ćwiczenie w Codelabs wymaga fizycznego urządzenia

TensorFlow to wielofunkcyjna platforma systemów uczących się. TensorFlow można używać w każdym miejscu: od trenowania ogromnych modeli w klastrach w chmurze po uruchamianie modeli lokalnie w umieszczonym systemie takim jak telefon.

W ramach tych ćwiczeń w Codelabs wykorzystano TensorFlow Lite do uruchomienia modelu rozpoznawania obrazów na urządzeniu z Androidem.

Zainstaluj Androida Studio 4.1 lub nowszego

Jeśli nie masz jeszcze zainstalowanej aplikacji, pobierz i zainstaluj AndroidStudio 4.1 lub nowszą podczas trenowania modelu TensorFlow Lite.

Czego się nauczysz

  • Jak wytrenować własny klasyfikator obrazów za pomocą TensorFlow Lite Model Maker.
  • Jak za pomocą Android Studio zaimportować model TensorFlow Lite i zintegrować go z aplikacją na Androida za pomocą CameraX.
  • Jak używać GPU w telefonie, aby przyspieszyć model.

Co utworzysz

Prosta aplikacja aparatu, która rozpoznaje kwiaty przy użyciu programu do rozpoznawania obrazów TensorFlow.

f11c2821f2c8311d.png

Licencja: do użytku bezpłatnie

2. Wytrenuj rozpoznawanie kwiatów za pomocą Colab

Zanim zaczniesz trenowanie modelu, zacznij pobierać i instalować Android Studio 4.1 lub nowszą wersję.

Otwórz Colab, w którym pokazujemy, jak wytrenować klasyfikator za pomocą Keras do rozpoznawania kwiatów za pomocą transferu danych TensorFlow Lite.

3. Skonfiguruj katalog roboczy

Klonowanie repozytorium Git

Następujące polecenie sklonuje repozytorium Git zawierające pliki wymagane do wykonania tego ćwiczenia z programowania:

git clone https://github.com/hoitab/TFLClassify.git

Następnie przejdź do katalogu, w którym właśnie sklonowano repozytorium. W tym miejscu będziesz pracować do końca tego ćwiczenia z programowania:

cd TFLClassify

4. Konfigurowanie aplikacji szkieletowej na Androida

android.png

Zainstaluj Androida Studio 4.1 lub nowszego

Jeśli nie masz jeszcze aplikacji, zainstaluj AndroidStudio 4.1 lub nowszą.

Otwieranie projektu w Android Studio

Otwórz projekt w Android Studio, wykonując te czynności:

  1. Otwórz Android Studio 7f2480ded53a193b.png. Po jego wczytaniu wybierz „Otwórz istniejący projekt”. z tego wyskakującego okienka:

f3b8bea7e3b39376.png

  1. W selektorze plików wybierz w katalogu roboczym TFLClassify/build.gradle.
  1. Otrzymasz „synchronizację Gradle” przy pierwszym otwarciu projektu z pytaniem o użycie otoki Gradle. Kliknij przycisk „OK”.

d68b4d7189e6c1e4.png

  1. Włącz na telefonie model programisty i debugowanie USB. Jest to konfiguracja jednorazowa. Wykonaj te instrukcje.
  2. Gdy projekt i telefon będą gotowe, możesz go uruchomić na prawdziwym urządzeniu. Aby to zrobić, wybierz TFL_Classify.start i naciśnij przycisk uruchamiania 86934b7b01ad7565.png na pasku narzędzi:

60a77ef126c1373d.png

  1. Teraz zezwól wersji demonstracyjnej Tensorflow na dostęp do aparatu:

b63cba02bb36b7e3.png

  1. Pojawi się na telefonie ekran z losowymi liczbami zamiast rzeczywistych wyników.

82c603596afa35f1.png

5. Dodawanie TensorFlow Lite do aplikacji na Androida

  1. W eksploratorze projektów po lewej stronie wybierz moduł start:

cede7f2b8b23c1a7.png

  1. Kliknij prawym przyciskiem myszy moduł start lub kliknij File, a następnie New > Other TensorFlow Lite Model

bf243d9fdd27e20a.png

  1. Wybierz lokalizację modelu, do której został pobrany wcześniej wytrenowany niestandardowo FlowerModel.tflite.

cfee18cc6674a408.png

  1. Kliknij Finish.
  2. Na końcu zobaczysz następujące elementy. Plik FlowerModel.tflite został zaimportowany i wyświetla ogólne informacje o modelu, w tym dane wejściowe / wyjściowe, a także przykładowy kod ułatwiający rozpoczęcie pracy.

82840065f0d59def.png

6. Opcjonalnie: sprawdzanie wszystkich zadań do wykonania

Lista zadań pozwala łatwo przejść do dokładnego miejsca, w którym chcesz zaktualizować ćwiczenia. Możesz ich też użyć w projekcie na Androida, aby przypominać Ci o przyszłej pracy. Możesz dodawać pozycje do wykonania, używając komentarzy w kodzie i wpisując słowo kluczowe TODO. Aby wyświetlić listę zadań do wykonania, możesz:

  1. Doskonałym sposobem na przekonanie się, co zamierzamy zrobić, jest sprawdzenie listy zadań do wykonania. Aby to zrobić, na górnym pasku menu kliknij View > Tool Windows TODO

5de29b413574f25c.png

  1. Domyślnie wszystkie moduły znajdują się na liście zadań do wykonania, co może utrudniać zorientowanie się w tym temacie. Możemy posortować tylko początkowe zadania do wykonania, klikając przycisk „grupuj według” z boku panelu DO ZROBIENIA i wybierając Modules.

5d8fe7b102340208.png

  1. Rozwiń wszystkie elementy w ramach modułów początkowych:

8d0f14a039995b20.png

7. Uruchamianie modelu niestandardowego za pomocą TensorFlow Lite

  1. Kliknij ZADANIE 1 na liście zadań do wykonania lub otwórz plik MainActivity.kt i znajdź pozycję TODO 1, zainicjuj model, dodając ten wiersz:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {

  ...
  // TODO 1: Add class variable TensorFlow Lite Model
  private val flowerModel = FlowerModel.newInstance(ctx)

  ...
}
  1. W metodzie analizy przeznaczonej do Analizatora CameraX musimy przekonwertować dane wejściowe z kamery ImageProxy na obiekt Bitmap i utworzyć obiekt TensorImage na potrzeby procesu wnioskowania.
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 2: Convert Image to Bitmap then to TensorImage
  val tfImage = TensorImage.fromBitmap(toBitmap(imageProxy))
  ...
}
  1. Przetwarzanie obrazu i wykonywanie na wyniku następujących operacji:
  • Sortuj wyniki malejąco według prawdopodobieństwa w atrybucie score o najwyższym prawdopodobieństwie.
  • Wybierz pierwsze k wyników zgodnie z definicją stałej MAX_RESULT_DISPLAY. Opcjonalnie możesz zmieniać wartość tej zmiennej, by uzyskać więcej lub mniej wyników.
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 3: Process the image using the trained model, sort and pick out the top results
  val outputs = flowerModel.process(tfImage)
      .probabilityAsCategoryList.apply {
          sortByDescending { it.score } // Sort with highest confidence first
      }.take(MAX_RESULT_DISPLAY) // take the top results

  ...
}
  1. Przekonwertuj posortowane i przefiltrowane wyniki na obiekty danych Recognition gotowe do wykorzystania przez funkcję RecyclerView za pomocą funkcji wiązania danych:
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 4: Converting the top probability items into a list of recognitions
  for (output in outputs) {
      items.add(Recognition(output.label, output.score))
  }
  ...
}
  1. Skomentuj lub usuń następujące wiersze, które pomagają generować fałszywe wyniki, które widzimy wcześniej:
// START - Placeholder code at the start of the codelab. Comment this block of code out.
for (i in 0..MAX_RESULT_DISPLAY-1){
    items.add(Recognition("Fake label $i", Random.nextFloat()))
}
// END - Placeholder code at the start of the codelab. Comment this block of code out.
  1. Uruchom aplikację na prawdziwym urządzeniu, wybierając TFL_Classify.start i naciskając przycisk uruchamiania 86934b7b01ad7565.png na pasku narzędzi:

60a77ef126c1373d.png

  1. Zobaczysz na telefonie następujący ekran z losowymi liczbami, w miejscu których będą wyświetlane prawdziwe wyniki:

f11c2821f2c8311d.png

8. Opcjonalnie: przyspiesz wnioskowanie za pomocą funkcji delegowania GPU

TensorFlow Lite obsługuje kilka akceleratorów sprzętowych, aby przyspieszyć wnioskowanie na urządzeniu mobilnym. GPU to jeden z akceleratorów, z których TensorFlow Lite może korzystać za pomocą mechanizmu delegowania. Jest on dość łatwy w użyciu.

  1. Otwórz plik build.gradle w module start lub kliknij pozycję TODO 5 na liście zadań do wykonania i dodaj tę zależność:
// TODO 5: Optional GPU Delegates    
implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
  1. Wróć do pliku MainActivity.kt lub kliknij TODO 6 na liście zadań. Zastąp prostą inicjację obiektu FlowerModel następującym: pobierz instancję listy zgodności GPU i zainicjuj GPU w zależności od tego, czy jest to jeden z wymienionych zgodnych GPU. W przeciwnym razie zainicjuj 4 wątki procesora, aby uruchomić model:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {
  ...

  // TODO 1: Add class variable TensorFlow Lite Model
  // Initializing the flowerModel by lazy so that it runs in the same thread when the process
  // method is called.
  private val flowerModel: FlowerModel by lazy{

    // TODO 6. Optional GPU acceleration
    val compatList = CompatibilityList()

    val options = if(compatList.isDelegateSupportedOnThisDevice){
        Log.d(TAG, "This device is GPU Compatible ")
        Model.Options.Builder().setDevice(Model.Device.GPU).build()
    } else {
        Log.d(TAG, "This device is GPU Incompatible ")
        Model.Options.Builder().setNumThreads(4).build()
    }

  ...
}
  1. Zmień inicjator modelu, aby używać go, dodając options do danych wejściowych metody:
private class ImageAnalyzer(ctx: Context, private val listener: RecognitionListener) :
        ImageAnalysis.Analyzer {

  private val flowerModel: FlowerModel by lazy{

    ...

    // Initialize the Flower Model
    FlowerModel.newInstance(ctx, options)
  }
}
  1. Uruchom aplikację na prawdziwym urządzeniu, wybierając TFL_Classify.start i naciskając przycisk uruchamiania 86934b7b01ad7565.png na pasku narzędzi:

60a77ef126c1373d.png

9. Co dalej?

Oto kilka linków do dodatkowych informacji: