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 wielofunkcyjna platforma do 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 tych ćwiczeniach z programowania użyjemy TensorFlow Lite do uruchomienia 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 niestandardowy 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 przez przeniesienie w 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 wczytaniu w tym wyskakującym okienku wybierz „Otwórz istniejący projekt”:

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 elementu flowerModel tym kodem: pobierz instancję listy zgodności GPU i zainicjuj GPU w zależności od tego, czy jest on jednym z wymienionych zgodnych procesorów 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: