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 Multifunktions-Framework für maschinelles Lernen. TensorFlow kann überall verwendet werden – vom Trainieren riesiger Modelle über mehrere Cluster 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.

Installieren Sie Android Studio 4.1 oder höher.

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

Lerninhalte

  • Anleitung zum Trainieren eines eigenen benutzerdefinierten Bildklassifikators mit dem TensorFlow Lite Model Maker
  • Hier erfahren Sie, wie Sie mithilfe von Android Studio das TensorFlow Lite-Modell importieren, um das benutzerdefinierte Modell mithilfe von CameraX in eine Android-App zu integrieren.
  • Hier erfahren Sie, wie Sie die GPU auf Ihrem Smartphone verwenden, 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

Laden Sie vor Beginn des Modelltrainings Android Studio 4.1 oder höher herunter und installieren Sie es.

Öffnen Sie Colab. Darin wird gezeigt, wie Sie einen Klassifikator mit Keras trainieren, um Blumen mit TensorFlow Lite-Lerntransfer 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 zu dem Verzeichnis, in das Sie das Repository gerade geklont haben. Im weiteren Verlauf dieses Codelabs arbeiten Sie an dieser Stelle:

cd TFLClassify

4. Android-App für das grundlegende Profil einrichten

android.png

Installieren Sie Android Studio 4.1 oder höher.

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

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 „Vorhandenes Projekt öffnen“ aus. aus diesem Pop-up-Fenster aus:

f3b8bea7e3b39376.png

  1. Wählen Sie in der Dateiauswahl TFLClassify/build.gradle aus Ihrem Arbeitsverzeichnis aus.
  1. Die Meldung „Gradle Sync“ Pop-up, wenn Sie das Projekt zum ersten Mal öffnen und nach der Verwendung des Gradle-Wrappers fragen. Klicke auf "OK".

d68b4d7189e6c1e4.png

  1. Aktiviere das Entwicklermodell und USB-Debugging auf deinem Smartphone, falls noch nicht geschehen. Diese Einrichtung ist einmalig. Folgen Sie dieser Anleitung.
  2. Sobald Ihr Projekt und Ihr Smartphone bereit sind, können Sie es auf einem echten Gerät ausführen. Wählen Sie dazu TFL_Classify.start aus und klicken Sie in der Symbolleiste auf die Schaltfläche „Ausführen“ 86934b7b01ad7565.png:

60a77ef126c1373d.png

  1. Erlauben Sie nun der Tensorflow-Demo den Zugriff auf Ihre Kamera:

b63cba02bb36b7e3.png

  1. Auf dem Smartphone wird der folgende Bildschirm mit Zufallszahlen angezeigt, die anstelle der tatsächlichen Ergebnisse angezeigt werden.

82c603596afa35f1.png

5. TensorFlow Lite zur Android-App hinzufügen

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

cede7f2b8b23c1a7.png

  1. Klicke mit der rechten Maustaste auf das Modul start oder klicke auf File und dann auf New > Other > TensorFlow Lite Model

bf243d9fdd27e20a.png

  1. Wählen Sie den Modellspeicherort aus, an dem Sie das benutzerdefiniert trainierte FlowerModel.tflite-Objekt zuvor heruntergeladen haben.

cfee18cc6674a408.png

  1. Klicken Sie auf Finish.
  2. Am Ende wird Folgendes angezeigt. FlowerModel.tflite wurde erfolgreich importiert und zeigt die allgemeinen Informationen zum Modell, einschließlich der Eingabe / Ausgabe sowie Beispielcode für den Einstieg.

82840065f0d59def.png

6. Optional: Alle To-do-Listen ansehen

Mit der ToDo-Liste kannst du ganz einfach zu dem Ort wechseln, an dem du das Codelab aktualisieren musst. Sie können es auch in Ihrem Android-Projekt verwenden, um sich zukünftige Arbeiten in Erinnerung zu rufen. Sie können Aufgaben mithilfe von Codekommentaren hinzufügen und das Stichwort TODO eingeben. So kannst du auf die Liste der TODOs zugreifen:

  1. Eine gute Möglichkeit, um zu sehen, was wir tun werden, ist ein Blick auf die ToDo-Liste. Wähle dazu oben in der Menüleiste View > Tool Windows > TODO

5de29b413574f25c.png

  1. Standardmäßig werden alle TODOs in allen Modulen aufgelistet, was es etwas verwirrend macht. Wir können nur die Start-TODOs sortieren, indem wir auf die Schaltfläche „Gruppieren nach“ an 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 folgende 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 Analysemethode für das CameraX Analyzer müssen wir die Kameraeingabe ImageProxy in ein Bitmap umwandeln 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 für das Ergebnis folgende Vorgänge aus:
  • Sortieren Sie die Ergebnisse absteigend nach Wahrscheinlichkeit unter dem Attribut score, mit der höchsten Wahrscheinlichkeit zuerst.
  • Nehmen Sie die besten k-Ergebnisse gemäß der Konstante MAX_RESULT_DISPLAY. Sie können den Wert dieser Variablen ä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, Recognitionbereits von RecyclerView über die Datenbindung verarbeitet 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 oder löschen Sie die folgenden Zeilen, um die vorgetäuschten Ergebnisse zu erhalten:
// 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 dem Smartphone wird der folgende Bildschirm mit Zufallszahlen angezeigt, die anstelle der tatsächlichen Ergebnisse angezeigt werden:

f11c2821f2c8311d.png

8. Optional: Inferenz mit GPU-Delegierung beschleunigen

TensorFlow Lite unterstützt mehrere Hardwarebeschleuniger, um die Inferenz auf Ihrem Mobilgerät zu beschleunigen. GPU ist einer der Beschleuniger, die TensorFlow Lite über einen Delegatmechanismus nutzen kann, und ist ziemlich einfach zu verwenden.

  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. Gehen Sie zurück zur Datei MainActivity.kt oder klicken Sie in der ToDo-Liste auf TODO 6. Ersetzen Sie die einfache Initiierung von „flowerModel“ durch Folgendes: Rufen Sie eine Instanz der GPU-Kompatibilitätsliste ab und initialisieren Sie die GPU, je nachdem, ob es sich um eine der aufgeführten kompatiblen GPUs handelt. Initiieren Sie andernfalls 4 CPU-Threads, um das Modell auszuführen:
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 den Modellinitialisierer so, dass dieser verwendet wird, indem Sie options zur Methodeneingabe 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

Unter den folgenden Links finden Sie weitere Informationen: