Rozpoznawanie kwiatów za pomocą TensorFlow Lite na Androidzie

1. Wprowadzenie

657431be3173fa86.png android.png

Uwaga: to ćwiczenie wymaga urządzenia fizycznego do testowania.

TensorFlow to uniwersalna platforma uczenia maszynowego. TensorFlow można używać w różnych sytuacjach – od trenowania ogromnych modeli w klastrach w chmurze po uruchamianie modeli lokalnie w systemie wbudowanym, takim jak telefon.

W tym ćwiczeniu używamy TensorFlow Lite do uruchamiania modelu rozpoznawania obrazów na urządzeniu z Androidem.

Instalowanie Androida Studio w wersji 4.1 lub nowszej

Jeśli nie masz jeszcze zainstalowanego środowiska Android Studio, pobierz i zainstaluj Androida Studio w wersji 4.1 lub nowszej podczas trenowania modelu TensorFlow Lite.

Czego się nauczysz

  • Jak wytrenować własny klasyfikator obrazów za pomocą TensorFlow Lite Model Maker.
  • Jak używać Androida Studio do importowania modelu TensorFlow Lite w celu zintegrowania modelu niestandardowego z aplikacją na Androida za pomocą CameraX.
  • Jak używać GPU na telefonie do przyspieszania działania modelu.

Co utworzysz

Prosta aplikacja do obsługi aparatu, która uruchamia program do rozpoznawania obrazów TensorFlow, aby identyfikować kwiaty.

f11c2821f2c8311d.png

Licencja: bezpłatna

2. Trenowanie rozpoznawania kwiatów za pomocą Colab

Zanim rozpoczniesz trenowanie modelu, pobierz i zainstaluj Androida Studio w wersji 4.1 lub nowszej.

Otwórz Colab, w którym pokazujemy, jak wytrenować klasyfikator za pomocą Keras do rozpoznawania kwiatów przy użyciu uczenia transferowego TensorFlow Lite.

3. Konfigurowanie katalogu roboczego

Klonowanie repozytorium Git

To polecenie sklonuje repozytorium Git zawierające pliki wymagane w tym ćwiczeniu:

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

Następnie przejdź do katalogu, do którego sklonowano repozytorium. W tym miejscu będziesz pracować przez resztę tego ćwiczenia:

cd TFLClassify

4. Konfigurowanie szkieletowej aplikacji na Androida

android.png

Instalowanie Androida Studio w wersji 4.1 lub nowszej

Jeśli nie masz jeszcze zainstalowanego środowiska, zainstaluj Androida Studio w wersji 4.1 lub nowszej.

Otwieranie projektu w Android Studio

Aby otworzyć projekt w Android Studio, wykonaj te czynności:

  1. Otwórz Android Studio 7f2480ded53a193b.png. Po załadowaniu wybierz „Otwórz istniejący projekt” w tym wyskakującym okienku:

f3b8bea7e3b39376.png

  1. W selektorze plików wybierz TFLClassify/build.gradle z katalogu roboczego.
  1. Gdy otworzysz projekt po raz pierwszy, pojawi się wyskakujące okienko „Gradle Sync” z pytaniem o użycie narzędzia Gradle Wrapper. Kliknij przycisk „OK”.

d68b4d7189e6c1e4.png

  1. Włącz tryb programisty i debugowanie USB na telefonie, jeśli nie zostały jeszcze włączone. Jest to jednorazowa konfiguracja. Postępuj zgodnie z tą instrukcją.
  2. Gdy projekt i telefon będą gotowe, możesz uruchomić go na prawdziwym urządzeniu, klikając TFL_Classify.start i przycisk uruchamiania 86934b7b01ad7565.png na pasku narzędzi:

60a77ef126c1373d.png

  1. Teraz zezwól wersji demonstracyjnej TensorFlow na dostęp do kamery:

b63cba02bb36b7e3.png

  1. Na telefonie zobaczysz ten ekran z losowymi liczbami zamiast rzeczywistych wyników.

82c603596afa35f1.png

5. Dodawanie TensorFlow Lite do aplikacji na Androida

  1. W eksploratorze projektu po lewej stronie wybierz moduł start:

cede7f2b8b23c1a7.png

  1. Kliknij prawym przyciskiem myszy moduł start lub kliknij File, a następnie NewOtherTensorFlow Lite Model.

bf243d9fdd27e20a.png

  1. Wybierz lokalizację modelu, w której wcześniej pobrano wytrenowany niestandardowo model FlowerModel.tflite.

cfee18cc6674a408.png

  1. Kliknij Finish.
  2. Na końcu zobaczysz te informacje. Plik FlowerModel.tflite został zaimportowany. Wyświetlają się informacje ogólne o modelu, w tym dane wejściowe i wyjściowe, a także przykładowy kod, który pomoże Ci zacząć.

82840065f0d59def.png

6. Opcjonalnie: sprawdzanie całej listy zadań

Lista zadań ułatwia przejście do dokładnej lokalizacji, w której musisz zaktualizować codelab. Możesz też użyć go w projekcie aplikacji na Androida, aby przypomnieć sobie o przyszłych zadaniach. Możesz dodawać elementy do zrobienia za pomocą komentarzy do kodu i wpisywać słowo kluczowe TODO. Aby uzyskać dostęp do listy zadań do wykonania:

  1. Aby dowiedzieć się, co zamierzamy zrobić, sprawdź listę zadań. Aby to zrobić, na pasku menu u góry kliknij ViewTool WindowsTODO.

5de29b413574f25c.png

  1. Domyślnie wyświetla wszystkie zadania we wszystkich modułach, co może być nieco mylące. Możemy posortować tylko początkowe zadania do wykonania, klikając przycisk grupowania z boku panelu zadań do wykonania i wybierając Modules.

5d8fe7b102340208.png

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

8d0f14a039995b20.png

7. Uruchamianie modelu niestandardowego za pomocą TensorFlow Lite

  1. Na liście zadań do wykonania kliknij TODO 1 lub otwórz plik MainActivity.kt i znajdź 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 w analizatorze CameraX musimy przekonwertować dane wejściowe z kamery ImageProxy na 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. Przetwórz obraz i wykonaj na wyniku te operacje:
  • Posortuj wyniki malejąco według prawdopodobieństwa w atrybucie score, zaczynając od najwyższego prawdopodobieństwa.
  • Wybierz k najlepszych wyników określonych przez stałą MAX_RESULT_DISPLAY. Możesz opcjonalnie zmieniać wartość tej zmiennej, aby 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. Przekształć posortowane i przefiltrowane wyniki w obiekty danychRecognition gotowe do wykorzystania przez RecyclerView za pomocą powią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. Zmień w komentarzu lub usuń te wiersze, które pomagają generować fałszywe wyniki widoczne 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, klikając TFL_Classify.start, a następnie naciśnij przycisk uruchamiania 86934b7b01ad7565.png na pasku narzędzi:

60a77ef126c1373d.png

  1. Na telefonie zobaczysz ten ekran z losowymi liczbami zamiast rzeczywistych wyników:

f11c2821f2c8311d.png

8. Opcjonalnie: przyspieszanie wnioskowania za pomocą delegata GPU

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

  1. Otwórz plik build.gradle w module start lub kliknij TODO 5 na liście TODO i dodaj to zależności:
// 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 TODO. Zastąp proste inicjowanie obiektu flowerModel tym kodem: pobierz instancję listy kompatybilności GPU i zainicjuj GPU w zależności od tego, czy jest on jednym z wymienionych kompatybilnych GPU. W innym przypadku uruchom 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. Aby zmienić inicjator modelu, dodaj 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, klikając TFL_Classify.start, a następnie naciśnij przycisk uruchamiania 86934b7b01ad7565.png na pasku narzędzi:

60a77ef126c1373d.png

9. Co dalej?

Więcej informacji znajdziesz w tych artykułach: