Edge für Android bereitstellen – Anleitung

Umfang

In dieser Anleitung laden Sie ein exportiertes, benutzerdefiniertes TensorFlow Lite-Modell herunter, das mit AutoML Vision Edge erstellt wurde. Anschließend führen Sie eine vorab entwickelte Android-App aus, die anhand des Modells Bilder von Blumen erkennt.

Screenshot vom Endprodukt auf Mobilgerät
Bildnachweis: Felipe Venâncio, "from my mother's garden" (CC BY 2.0, in App angezeigtes Bild)

Ziele

In dieser umfassenden einführenden Schritt-für-Schritt-Anleitung verwenden Sie Code für folgende Aufgabe:

  • Vortrainiertes Modell mit dem TFLite-Interpreter in einer Android-App ausführen

Vorbereitung

Modell über AutoML Vision Edge trainieren

Bevor Sie ein Modell auf einem Edge-Gerät bereitstellen können, müssen Sie ein TF Lite-Modell über AutoML Vision Edge anhand der Kurzanleitung für Edge-Gerätemodelle trainieren und exportieren.

Nach Abschluss der Kurzanleitung sollten Sie exportierte, trainierte Modelldateien haben: eine TF Lite-Datei, eine Labeldatei und eine Metadatendatei (siehe unten).

TF Lite-Modelldateien in Cloud Storage

TensorFlow installieren

Bevor Sie mit der Anleitung beginnen, müssen Sie verschiedene Softwarekomponenten installieren:

Wenn Sie eine funktionierende Python-Installation haben, führen Sie die folgenden Befehle aus, um diese Software herunterzuladen:

pip install --upgrade  "tensorflow==1.7.*"
pip install PILLOW

Sehen Sie sich die offizielle TensorFlow-Dokumentation an, falls bei diesem Vorgang Probleme auftreten.

Git-Repository klonen

Mit dem folgenden Befehl können Sie das Git-Repository über die Befehlszeile klonen:

git clone https://github.com/googlecodelabs/tensorflow-for-poets-2

Rufen Sie das Verzeichnis des lokalen Klons des Repositorys (Verzeichnis tensorflow-for-poets-2) auf. Aus diesem Verzeichnis führen Sie alle folgenden Codebeispiele aus.

cd tensorflow-for-poets-2

Android-App einrichten ()

Android Studio installieren

Installieren Sie bei Bedarf lokal Android Studio 3.0 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 Android Studio-Startsymbol. Wählen Sie nach dem Laden die Option Android Studio-Symbol zum Öffnen von Projekten Open an existing Android Studio project (Vorhandenes Android Studio-Projekt öffnen) in diesem Pop-up-Fenster aus:

    Pop-up-Fenster zum Öffnen von Projekten in Android Studio

  2. Wählen Sie in der Dateiauswahl tensorflow-for-poets-2/android/tflite aus Ihrem Arbeitsverzeichnis aus.

  3. Beim erstmaligen Öffnen des Projekts wird das Pop-up-Fenster zur Gradle-Synchronisierung angezeigt, in dem Sie gefragt werden, ob Sie den Gradle-Wrapper verwenden möchten. Wählen Sie OK aus.

    Pop-up-Fenster zum Öffnen von Projekten in Android Studio

Test für die App ausführen

Die App kann entweder auf einem echten Android-Gerät oder im Android Studio-Emulator ausgeführt werden.

Android-Gerät einrichten

Sie können die App aus Android Studio nur dann auf Ihr Smartphone laden, wenn Sie "Entwicklermodus" und "USB-Debugging" aktivieren.

Folgen Sie dieser Anleitung, um diesen einmaligen Einrichtungsprozess auszuführen.

Emulator mit Kamerazugriff einrichten (optional)

Wenn Sie einen Emulator anstelle eines echten Android-Geräts verwenden möchten, können Sie diesen in Android Studio ganz einfach einrichten.

Da diese App auf die Kamera zugreift, muss die Kamera des Emulators zur Verwendung der Kamera des Computers anstelle des Standardtestmusters eingestellt werden.

Zum Einrichten der Kamera des Emulators müssen Sie ein neues Gerät im Android Virtual Device Manager (AVDM) erstellen. Auf diesen Dienst können Sie über die Schaltfläche Symbol für Virtual Device Manager zugreifen. Wählen Sie auf der AVDM-Hauptseite die Option Create Virtual Device aus:

Android Studio-Option zum Erstellen von virtuellen Geräten

Wählen Sie dann auf der Seite "Konfiguration prüfen" – der letzten Seite zur Einrichtung des virtuellen Geräts – die Option Erweiterte Einstellungen anzeigen aus:

Android Studio-Option zum Erstellen von virtuellen Geräten

Wenn die erweiterten Einstellungen angezeigt werden, können Sie beide Kameraquellen so einstellen, dass die Webcam des Hostcomputers verwendet wird:

Android Studio-Option zur Auswahl der Kameraquelle

Ursprüngliche App ausführen

Bevor Sie Änderungen an der App vornehmen, führen Sie die mit dem Repository gelieferte Version aus.

Führen Sie eine Gradle-Synchronisierung aus, um den Build- und Installationsprozess zu starten.

Symbol für die Gradle-Synchronisierung

Wählen Sie nach der Gradle-Synchronisierung die Wiedergabeschaltfläche Android Studio-Wiedergabesymbol aus.

Nach Auswahl der Wiedergabeschaltfläche müssen Sie Ihr Gerät in diesem Pop-up-Fenster auswählen:

Pop-up-Fenster zur Auswahl des Geräts

Nachdem Sie Ihr Gerät ausgewählt haben, müssen Sie der TensorFlow-Demo den Zugriff auf Ihre Kamera und Ihre Dateien erlauben:

Fenster zum Erlauben des Zugriffs auf die Kamera

Nachdem die App jetzt installiert ist, klicken Sie auf das App-Symbol Android Studio-App-Symbol, um sie zu starten. Diese Version der App verwendet das MobileNet-Standardmodell, das mithilfe von 1.000 ImageNet-Kategorien vortrainiert wurde.

Die Ausgabe sollte ungefähr so aussehen:

Test-App ausführen

Angepasste App ausführen

Bei der standardmäßigen App-Einrichtung werden Bilder mithilfe des MobileNet-Standardmodells ohne erneutes Training in eine der 1.000 ImageNet-Klassen eingeteilt.

Nehmen Sie nun Änderungen vor, damit die App ein Modell verwendet, das von AutoML Vision Edge für Ihre benutzerdefinierten Bildkategorien erstellt wurde.

Modelldateien zum Projekt hinzufügen

Das Demoprojekt ist so konfiguriert, dass im Verzeichnis android/tflite/app/src/main/assets/ nach den Dateien graph.lite und labels.txt gesucht wird.

Ersetzen Sie die beiden Originaldateien mit den folgenden Befehlen durch Ihre Versionen:

cp [Downloads]/model.tflite android/tflite/app/src/main/assets/graph.lite
cp [Downloads]/dict.txt  android/tflite/app/src/main/assets/labels.txt

App anpassen

Diese App verwendet ein Float-Modell, das von AutoML Vision Edge erstellte Modell ist jedoch ein quantisiertes Modell. Anschließend nehmen Sie die folgenden Codeänderungen vor, damit die App das Modell verwenden kann:

Ändern Sie in der Klassenmitgliedsdefinition und im ImageClassifier-Initialisierer den Datentyp labelProbArray und filterLabelProbArray von "float" in "byte".

private byte[][] labelProbArray = null;
private byte[][] filterLabelProbArray = null;

labelProbArray = new byte[1][labelList.size()];
filterLabelProbArray = new byte[FILTER_STAGES][labelList.size()];

Weisen Sie imgData anhand des Int8-Typs im ImageClassifier-Initialisierer zu.

    imgData =
        ByteBuffer.allocateDirect(
            DIM_BATCH_SIZE * DIM_IMG_SIZE_X * DIM_IMG_SIZE_Y * DIM_PIXEL_SIZE);

Wandeln Sie in printTopKLabels() den Datentyp labelProbArray von "int8" in "float" um:

  private String printTopKLabels() {
    for (int i = 0; i < labelList.size(); ++i) {
      sortedLabels.add(
          new AbstractMap.SimpleEntry<>(labelList.get(i), (float)labelProbArray[0][i]));
      if (sortedLabels.size() > RESULTS_TO_SHOW) {
        sortedLabels.poll();
      }
    }
    String textToShow = "";
    final int size = sortedLabels.size();
    for (int i = 0; i < size; ++i) {
      Map.Entry<String, Float> label = sortedLabels.poll();
      textToShow = String.format("\n%s: %4.2f",label.getKey(),label.getValue()) + textToShow;
    }
    return textToShow;
  }

App ausführen

Führen Sie in Android Studio eine Gradle-Synchronisierung aus, damit das Build-System Ihre Dateien finden kann:

Symbol für die Gradle-Synchronisierung

Wählen Sie nach der Gradle-Synchronisierung die Wiedergabeschaltfläche Android Studio-Wiedergabesymbol aus, um den Build- und Installationsprozess zu starten.

Die Ausgabe sollte ungefähr so aussehen:

Screenshot vom Endprodukt auf Mobilgerät
Bildnachweis: Felipe Venâncio, "from my mother's garden" (CC BY 2.0, in der App angezeigtes Bild)

Sie können die Ein/Aus-Taste und die Leisertaste gleichzeitig drücken, um einen Screenshot zu erstellen.

Richten Sie zum Testen der aktualisierten App die Kamera auf verschiedene Bilder von Blumen, um zu sehen, ob sie korrekt klassifiziert werden.

Funktionsweise

Nachdem die App jetzt ausgeführt wird, können Sie sich den TensorFlow Lite-spezifischen Code genauer ansehen.

TensorFlow AAR

Diese App verwendet ein vorkompiliertes TFLite-Android Archive (AAR). Dieses AAR wird auf jcenter gehostet.

Die folgenden Zeilen in der Datei build.gradle des Moduls enthalten die neueste Version des AAR aus dem TensorFlow-Bintray-Maven-Repository im Projekt.

build.gradle

repositories {
    maven {
        url 'https://google.bintray.com/tensorflow'
    }
}

dependencies {
    // ...
    compile 'org.tensorflow:tensorflow-lite:+'
}

Weisen Sie das Android Asset Packaging Tool mithilfe des folgenden Blocks an, .lite- oder .tflite-Assets nicht zu komprimieren. Dies ist wichtig, da die .lite-Datei im Arbeitsspeicher abgebildet wird und dies nicht funktioniert, wenn die Datei komprimiert ist.

build.gradle

android {
    aaptOptions {
        noCompress "tflite"
        noCompress "lite"
    }
}

TFLite Java API verwenden

Die Codeschnittstelle zu TFLite ist komplett in ImageClassifier.java enthalten.

Einrichtung

Der erste relevante Block ist der Konstruktor für ImageClassifier:

ImageClassifier.java

ImageClassifier(Activity activity) throws IOException {
    tflite = new Interpreter(loadModelFile(activity));
    labelList = loadLabelList(activity);
    imgData =
        ByteBuffer.allocateDirect(
            4 * DIM_BATCH_SIZE * DIM_IMG_SIZE_X * DIM_IMG_SIZE_Y * DIM_PIXEL_SIZE);
    imgData.order(ByteOrder.nativeOrder());
    labelProbArray = new float[1][labelList.size()];
    Log.d(TAG, "Created a Tensorflow Lite Image Classifier.");
}

Hier gibt es einige Zeilen, die besonders beachtenswert sind.

Die folgende Zeile erstellt den TFLite-Interpreter:

ImageClassifier.java

tflite = new Interpreter(loadModelFile(activity));

Diese Zeile instanziiert einen TFLite-Interpreter. Der Interpreter funktioniert für Entwickler, die auch mit TensorFlow außerhalb von TFLite vertraut sind, ähnlich wie tf.Session. Sie übergeben dem Interpreter einen MappedByteBuffer, der das Modell enthält. Die lokale Funktion loadModelFile erstellt einen MappedByteBuffer mit der Asset-Datei graph.lite der Aktivität.

Die folgenden Zeilen erstellen den Eingabedaten-Zwischenspeicher:

ImageClassifier.java

imgData = ByteBuffer.allocateDirect(
    4 * DIM_BATCH_SIZE * DIM_IMG_SIZE_X * DIM_IMG_SIZE_Y * DIM_PIXEL_SIZE);

Dieser Bytezwischenspeicher ist groß genug, um die Bilddaten nach dem Konvertieren in "Float" aufzunehmen. Der Interpreter kann Float-Arrays direkt als Eingabe annehmen. Der ByteBuffer ist jedoch effizienter, da zusätzliche Kopien im Interpreter vermieden werden.

Mit den folgenden Zeilen wird die Labelliste geladen und der Ausgabepuffer erstellt:

labelList = loadLabelList(activity);
//...
labelProbArray = new float[1][labelList.size()];

Der Ausgabezwischenspeicher ist ein Float-Array mit einem Element für jedes Label, in das das Modell die Ausgabewahrscheinlichkeiten schreibt.

Modell ausführen

Der zweite interessante Block ist die Methode classifyFrame. Diese Methode nimmt eine Bitmap als Eingabe an, führt das Modell aus und gibt den auszugebenden Text an die App zurück.

ImageClassifier.java

String classifyFrame(Bitmap bitmap) {
 // ...
 convertBitmapToByteBuffer(bitmap);
 // ...
 tflite.run(imgData, labelProbArray);
 // ...
 String textToShow = printTopKLabels();
 // ...
}

Diese Methode führt drei Vorgänge aus. Zuerst konvertiert und kopiert die Methode die Eingabe-Bitmap in den imgData-ByteBuffer zur Eingabe in das Modell. Anschließend ruft die Methode die Ausführungsmethode des Interpreters auf und übergibt den Eingabezwischenspeicher und das Ausgabearray als Argumente. Der Interpreter setzt die Werte im Ausgabearray auf die für jede Klasse berechnete Wahrscheinlichkeit. Die Eingabe- und Ausgabeknoten werden durch die Argumente für den toco-Konvertierungsschritt definiert, mit dem zuvor die .lite-Modelldatei erstellt wurde.

Weitere Informationen

Sie haben jetzt eine Schritt-für-Schritt-Anleitung für eine Android-App zur Klassifizierung von Blumen mithilfe eines Edge-Modells durchgearbeitet. Sie haben eine App zur Bildklassifizierung getestet, bevor Sie Änderungen daran vorgenommen und Beispielannotationen erhalten haben. Anschließend haben Sie TensorFlow Lite-spezifischen Code untersucht, um die zugrunde liegende Funktionalität nachzuvollziehen.