Erkennen Sie Blumen mit TensorFlow Lite auf Android

657431be3173fa86.pngandroid.png

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

TensorFlow ist ein Mehrzweck-Framework für maschinelles Lernen. TensorFlow kann überall verwendet werden, von der Schulung großer Modelle über Cluster in der Cloud bis hin zur lokalen Ausführung von Modellen auf einem eingebetteten System wie Ihrem Telefon.

Dieses Codelab verwendet TensorFlow Lite , 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.

Was du lernen wirst

  • So trainieren Sie Ihren eigenen benutzerdefinierten Bildklassifizierer mit TensorFlow Lite Model Maker .
  • So importieren Sie mit Android Studio das TensorFlow Lite-Modell, um das benutzerdefinierte Modell mit CameraX in eine Android-App zu integrieren.
  • So verwenden Sie die GPU Ihres Telefons, um Ihr Modell zu beschleunigen.

Was du bauen wirst

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

f11c2821f2c8311d.png

Lizenz: Kostenlos zu benutzen

Beginnen Sie vor dem Start des Modelltrainings mit dem Herunterladen und Installieren von Android Studio 4.1 oder höher .

Öffnen Sie dasColab, in dem gezeigt wird, wie Sie mit Keras einen Klassifikator trainieren, um Blumen mithilfe des TensorFlow Lite-Transferlernens zu erkennen.

Klonen Sie das Git-Repository

Der folgende Befehl klont das Git-Repository mit den für dieses Codelab erforderlichen Dateien:

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

Wechseln Sie als Nächstes zu dem Verzeichnis, in das Sie gerade das Repository geklont haben. Hier werden Sie für den Rest dieses Codelabs arbeiten:

cd TFLClassify

android.png

Installieren Sie Android Studio 4.1 oder höher

Wenn Sie es noch nicht installiert haben, installieren Sie AndroidStudio 4.1 oder höher .

Öffnen Sie das Projekt mit Android Studio

Öffnen Sie ein Projekt mit Android Studio, indem Sie die folgenden Schritte ausführen:

  1. Öffnen Sie Android Studio 7f2480ded53a193b.png . Wählen Sie nach dem Laden in diesem Popup "Vorhandenes Projekt öffnen" aus:

f3b8bea7e3b39376.png

  1. Wählen TFLClassify/build.gradle in der Dateiauswahl TFLClassify/build.gradle aus Ihrem Arbeitsverzeichnis.
  1. Beim ersten Öffnen des Projekts wird ein Popup-Fenster "Gradle Sync" angezeigt, in dem Sie nach der Verwendung des Gradle-Wrappers gefragt werden. OK klicken".

d68b4d7189e6c1e4.png

  1. Aktivieren Sie das Entwicklermodell und das USB-Debugging auf Ihrem Telefon, falls Sie dies noch nicht getan haben. Dies ist eine einmalige Einrichtung. Befolgen Sie diese Anweisungen .
  2. Sobald sowohl Ihr Projekt als auch Ihr Telefon bereit sind, können Sie es auf einem realen Gerät TFL_Classify.start , indem Sie TFL_Classify.start auswählen und die Schaltfläche Ausführen drücken 86934b7b01ad7565.png auf der Symbolleiste:

60a77ef126c1373d.png

  1. Ermöglichen Sie nun der Tensorflow-Demo den Zugriff auf Ihre Kamera:

b63cba02bb36b7e3.png

  1. Auf Ihrem Telefon wird der folgende Bildschirm mit Zufallszahlen angezeigt, an deren Stelle echte Ergebnisse angezeigt werden.

82c603596afa35f1.png

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

cede7f2b8b23c1a7.png

  1. Rechts-Klick auf das start oder klicken Sie auf File , dann New > Other > TensorFlow Lite Model

bf243d9fdd27e20a.png

  1. Wählen Sie den Modellspeicherort aus, an den Sie zuvor das speziell geschulte FlowerModel.tflite heruntergeladen haben.

cfee18cc6674a408.png

  1. Klicken Sie auf Finish .
  2. Am Ende sehen Sie Folgendes. Das FlowerModel.tflite wurde erfolgreich importiert und zeigt die allgemeinen Informationen zum Modell einschließlich der Eingabe / Ausgabe sowie einige Beispielcodes an, um Ihnen den Einstieg zu erleichtern.

82840065f0d59def.png

Mit der TODO-Liste können Sie ganz einfach zu dem genauen Ort navigieren, an dem Sie das Codelab aktualisieren müssen. Sie können es auch in Ihrem Android-Projekt verwenden, um sich an zukünftige Arbeiten zu erinnern. Sie können Aufgabenelemente mithilfe von TODO hinzufügen und das Schlüsselwort TODO eingeben. Um auf die Liste der TODOs zuzugreifen, können Sie:

  1. Eine gute Möglichkeit, um zu sehen, was wir tun werden, ist die TODO-Liste. Wählen Sie dazu in der oberen 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 neben dem TODO-Bedienfeld klicken und Modules auswählen

5d8fe7b102340208.png

  1. Erweitern Sie alle Elemente unter den Startmodulen:

8d0f14a039995b20.png

  1. Klicken Sie in der TODO-Liste auf TODO 1 oder öffnen Sie die Datei MainActivity.kt, suchen Sie TODO 1 und 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. Innerhalb der Analysemethode für den CameraX Analyzer müssen wir den Kameraeingang ImageProxy in eine 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:
  • Absteigend sortiert die Ergebnisse nach Wahrscheinlichkeit unter dem Attribute score mit der höchsten Wahrscheinlichkeit zuerst.
  • Nehmen Sie die Top-k-Ergebnisse, wie sie durch die Konstante MAX_RESULT_DISPLAY . Sie können den Wert dieser Variablen optional variieren, 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 sortiert und gefiltert Ergebnisse in Datenobjekte Recognition bereit , durch verbraucht werden RecyclerView über Datenbindung :
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 zuvor angezeigten falschen Ergebnisse zu erzielen:
// 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 realen Gerät aus, indem Sie TFL_Classify.start auswählen und die Schaltfläche Ausführen drücken 86934b7b01ad7565.png auf der Symbolleiste:

60a77ef126c1373d.png

  1. Auf Ihrem Telefon wird der folgende Bildschirm mit Zufallszahlen angezeigt, an deren Stelle echte Ergebnisse angezeigt werden:

f11c2821f2c8311d.png

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 Delegierungsmechanismus nutzen kann, und sie ist recht einfach zu verwenden.

  1. Öffnen build.gradle unter dem start oder Sie können 5 unter der ToDo - Liste auf TODO klicken und 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 Initiierung des 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. Andernfalls initiieren Sie 4 CPU-Threads, um stattdessen 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, um dies zu verwenden, indem Sie der Methodeneingabe options 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 realen Gerät aus, indem Sie TFL_Classify.start auswählen und die Schaltfläche Ausführen drücken 86934b7b01ad7565.png auf der Symbolleiste:

60a77ef126c1373d.png

Hier sind einige Links für weitere Informationen: