Mit TensorFlow Lite auf Android Blumen erkennen

1. Einführung

657431be3173fa86.png android.png

Hinweis: Für dieses Codelab ist ein physisches Gerät zum Testen erforderlich.

TensorFlow ist ein universelles Framework für maschinelles Lernen. TensorFlow kann überall verwendet werden. Die Einsatzmöglichkeiten gehen vom Trainieren riesiger Modelle auf mehreren Clustern in der Cloud bis hin zum lokalen Ausführen von Modellen auf einem eingebetteten System wie einem Smartphone.

In diesem Codelab wird TensorFlow Lite verwendet, um ein Bilderkennungsmodell auf einem Android-Gerät auszuführen.

Android Studio 4.1 oder höher installieren

Wenn Sie Android Studio noch nicht installiert haben, laden Sie Android Studio 4.1 oder höher herunter und installieren Sie es, während Sie Ihr TensorFlow Lite-Modell trainieren.

Lerninhalte

  • So trainieren Sie einen benutzerdefinierten Bildklassifikator mit TensorFlow Lite Model Maker.
  • So importieren Sie das TensorFlow Lite-Modell mit Android Studio, um das benutzerdefinierte Modell mit CameraX in eine Android-App einzubinden.
  • So verwenden Sie die GPU Ihres Smartphones, um Ihr Modell zu beschleunigen.

Umfang

Eine einfache Kamera-App, die ein TensorFlow-Bilderkennungsprogramm zur Identifizierung von Blumen ausführt.

f11c2821f2c8311d.png

Lizenz: Kostenlos nutzbar

2. Blumenerkennung mit Colab trainieren

Bevor Sie mit dem Trainieren des Modells beginnen, laden Sie Android Studio 4.1 oder höher herunter und installieren Sie es.

Öffnen Sie das Colab, in dem gezeigt wird, wie Sie einen Klassifikator mit Keras trainieren, um Blumen mithilfe von TensorFlow Lite-Transfer Learning zu erkennen.

3. Arbeitsverzeichnis einrichten

Git-Repository klonen

Mit dem folgenden Befehl wird das Git-Repository geklont, das die für dieses Codelab erforderlichen Dateien enthält:

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

Wechseln Sie als Nächstes in das Verzeichnis, in das Sie das Repository gerade geklont haben. Hier werden Sie im weiteren Verlauf dieses Codelabs arbeiten:

cd TFLClassify

4. Android-Skelett-App einrichten

android.png

Android Studio 4.1 oder höher installieren

Wenn Sie Android Studio noch nicht installiert haben, installieren Sie Android Studio 4.1 oder höher.

Projekt mit Android Studio öffnen

Öffnen Sie ein Projekt mit Android Studio. Führen Sie dazu die folgenden Schritte aus:

  1. Öffnen Sie Android Studio 7f2480ded53a193b.png. Wählen Sie nach dem Laden die Option „Open an Existing project“ (Vorhandenes Projekt öffnen) in diesem Pop-up-Fenster aus:

f3b8bea7e3b39376.png

  1. Wählen Sie in der Dateiauswahl TFLClassify/build.gradle aus Ihrem Arbeitsverzeichnis aus.
  1. Beim erstmaligen Öffnen des Projekts wird das Pop-up-Fenster „Gradle Sync“ (Gradle-Synchronisierung) angezeigt, in dem Sie gefragt werden, ob Sie den Gradle-Wrapper verwenden möchten. Klicke auf "OK".

d68b4d7189e6c1e4.png

  1. Aktivieren Sie den Entwicklermodus und das USB‑Debugging auf Ihrem Smartphone, falls Sie das noch nicht getan haben. Das ist eine einmalige Einrichtung. Folgen Sie dieser Anleitung.
  2. Wenn sowohl Ihr Projekt als auch Ihr Smartphone bereit sind, können Sie es auf einem echten Gerät ausführen. Wählen Sie dazu TFL_Classify.start aus und drücken Sie in der Symbolleiste auf die Schaltfläche „Ausführen“ 86934b7b01ad7565.png:

60a77ef126c1373d.png

  1. Erlauben Sie der TensorFlow-Demo jetzt den Zugriff auf Ihre Kamera:

b63cba02bb36b7e3.png

  1. Auf Ihrem Smartphone wird der folgende Bildschirm angezeigt. Anstelle der tatsächlichen Ergebnisse werden zufällige Zahlen eingeblendet.

82c603596afa35f1.png

5. TensorFlow Lite zur Android-App hinzufügen

  1. Wählen Sie im Projektexplorer auf der linken Seite das start-Modul aus:

cede7f2b8b23c1a7.png

  1. Klicken Sie mit der rechten Maustaste auf das start-Modul oder klicken Sie auf File, dann auf New > Other > TensorFlow Lite Model.

bf243d9fdd27e20a.png

  1. Wählen Sie den Speicherort des Modells aus, an dem Sie das benutzerdefinierte trainierte FlowerModel.tflite zuvor heruntergeladen haben.

cfee18cc6674a408.png

  1. Klicken Sie auf Finish.
  2. Am Ende wird Folgendes angezeigt. Die Datei „FlowerModel.tflite“ wurde erfolgreich importiert. Es werden allgemeine Informationen zum Modell angezeigt, einschließlich der Ein- und Ausgabe sowie einiger Beispielcodes für den Einstieg.

82840065f0d59def.png

6. Optional: Alle Aufgabenlisten ansehen

Über die Aufgabenliste können Sie ganz einfach zu der Stelle navigieren, an der Sie das Codelab aktualisieren müssen. Sie können sie auch in Ihrem Android-Projekt verwenden, um sich an zukünftige Aufgaben zu erinnern. Sie können To-do-Elemente mit Codekommentaren hinzufügen und das Keyword TODO eingeben. So greifen Sie auf die Liste der Aufgaben zu:

  1. Eine gute Möglichkeit, um zu sehen, was wir als Nächstes tun werden, ist, sich die TODO-Liste anzusehen. Wählen Sie dazu in der oberen Menüleiste View > Tool Windows > TODO aus.

5de29b413574f25c.png

  1. Standardmäßig werden alle TODOs in allen Modulen aufgelistet, was etwas verwirrend ist. Wir können nur die Start-TODOs sortieren, indem wir auf die Schaltfläche „Gruppieren nach“ auf der Seite des TODO-Bereichs klicken und Modules auswählen.

5d8fe7b102340208.png

  1. Maximieren Sie alle Elemente unter den Startmodulen:

8d0f14a039995b20.png

7. Benutzerdefiniertes Modell mit TensorFlow Lite ausführen

  1. Klicken Sie in der TODO-Liste auf TODO 1 oder öffnen Sie die Datei MainActivity.kt und suchen Sie nach TODO 1. Initialisieren Sie das Modell, indem Sie diese Zeile hinzufügen:
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. In der Methode „analyze“ für den CameraX Analyzer müssen wir die Kameraeingabe ImageProxy in ein Bitmap konvertieren und ein TensorImage-Objekt für den Inferenzprozess erstellen.
override fun analyze(imageProxy: ImageProxy) {
  ...
  // TODO 2: Convert Image to Bitmap then to TensorImage
  val tfImage = TensorImage.fromBitmap(toBitmap(imageProxy))
  ...
}

  1. Verarbeiten Sie das Bild und führen Sie die folgenden Vorgänge für das Ergebnis aus:
  • Sortieren Sie die Ergebnisse absteigend nach der Wahrscheinlichkeit unter dem Attribut score, wobei die höchste Wahrscheinlichkeit zuerst angezeigt wird.
  • Verwenden Sie die k besten Ergebnisse, die durch die Konstante MAX_RESULT_DISPLAY definiert werden. Sie können den Wert dieser Variablen optional ändern, um mehr oder weniger Ergebnisse zu erhalten.
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. Konvertieren Sie die sortierten und gefilterten Ergebnisse in Datenobjekte Recognition, die von RecyclerView über Data Binding verwendet werden können:
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. Kommentieren Sie die folgenden Zeilen aus oder löschen Sie sie, um die gefälschten Ergebnisse zu entfernen, die wir zuvor gesehen haben:
// 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. Führen Sie die App auf einem echten Gerät aus, indem Sie TFL_Classify.start auswählen und in der Symbolleiste auf die Schaltfläche „Ausführen“ 86934b7b01ad7565.png klicken:

60a77ef126c1373d.png

  1. Auf Ihrem Smartphone wird der folgende Bildschirm angezeigt. Anstelle der tatsächlichen Ergebnisse werden zufällige Zahlen eingeblendet:

f11c2821f2c8311d.png

8. Optional: Inferenz mit GPU-Delegaten beschleunigen

TensorFlow Lite unterstützt mehrere Hardwarebeschleuniger, um die Inferenz auf Ihrem Mobilgerät zu beschleunigen. Die GPU ist einer der Beschleuniger, die TensorFlow Lite über einen Delegatenmechanismus nutzen kann. Die Verwendung ist relativ einfach.

  1. Öffnen Sie build.gradle im Modul start oder klicken Sie in der TODO-Liste auf TODO 5 und fügen Sie die folgende Abhängigkeit hinzu:
// TODO 5: Optional GPU Delegates    
implementation 'org.tensorflow:tensorflow-lite-gpu:2.3.0'
  1. Kehren Sie zur Datei MainActivity.kt zurück oder klicken Sie in der TODO-Liste auf TODO 6. Ersetzen Sie die einfache Initialisierung von „flowerModel“ durch Folgendes: Rufen Sie eine Instanz der GPU-Kompatibilitätsliste ab und initialisieren Sie die GPU, je nachdem, ob sie eine der aufgeführten kompatiblen GPUs ist. Andernfalls werden vier CPU-Threads zum Ausführen des Modells gestartet:
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. Ändern Sie die Modellinitialisierung, um dies zu verwenden, indem Sie options zur Methodeingabe hinzufügen:
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. Führen Sie die App auf einem echten Gerät aus, indem Sie TFL_Classify.start auswählen und in der Symbolleiste auf die Schaltfläche „Ausführen“ 86934b7b01ad7565.png klicken:

60a77ef126c1373d.png

9. Weitere Informationen

Hier finden Sie einige Links mit weiteren Informationen: