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.
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).
TensorFlow installieren
Bevor Sie mit der Anleitung beginnen, müssen Sie verschiedene Softwarekomponenten installieren:
- Installieren Sie tensorflow Version 1.7.
- Installieren Sie PILLOW.
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:
Öffnen Sie Android Studio . Wählen Sie nach dem Laden die Option Open an existing Android Studio project (Vorhandenes Android Studio-Projekt öffnen) in diesem Pop-up-Fenster aus:
Wählen Sie in der Dateiauswahl
tensorflow-for-poets-2/android/tflite
aus Ihrem Arbeitsverzeichnis aus.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.
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 zugreifen. Wählen Sie auf der AVDM-Hauptseite die Option Create Virtual Device aus:
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:
Wenn die erweiterten Einstellungen angezeigt werden, können Sie beide Kameraquellen so einstellen, dass die Webcam des Hostcomputers verwendet wird:
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.
Wählen Sie nach der Gradle-Synchronisierung die Wiedergabeschaltfläche aus.
Nach Auswahl der Wiedergabeschaltfläche müssen Sie Ihr Gerät in diesem Pop-up-Fenster auswählen:
Nachdem Sie Ihr Gerät ausgewählt haben, müssen Sie der TensorFlow-Demo den Zugriff auf Ihre Kamera und Ihre Dateien erlauben:
Nachdem die App jetzt installiert ist, klicken Sie auf das 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:
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:
Wählen Sie nach der Gradle-Synchronisierung die Wiedergabeschaltfläche aus, um den Build- und Installationsprozess zu starten.
Die Ausgabe sollte ungefähr so aussehen:
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.
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.
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(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:
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:
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.
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.
- Weitere Informationen zu TFLite erhalten Sie in der offiziellen Dokumentation und im Code-Repository.
- Probieren Sie die quantisierte Version dieser Demo-App aus, um ein leistungsstärkeres Modell in einem kleineren Paket zu erhalten.
- Testen Sie andere TFLite-fähige Modelle, einschließlich einer Hot-Word-Erkennung für die Sprachausgabe und einer Version für intelligente Antworten auf dem Gerät.
- Allgemeine Informationen zu TensorFlow finden Sie in der Dokumentation zum Einstieg in TensorFlow.