Downloadlink, öffnet eine externe URL in einem neuen Fenster

Dieser Eintrag enthält eine Dokumentation der EML Object Detection Android-App. Es enthält eine schrittweise Anleitung zur Einrichtung einer TensorFlow-Umgebung zum Konvertieren von TensorFlow-Modellen in app-kompatible TensorFlow Lite-Modelle und zum Hosten dieser Modelle in der Cloud mit Google Firebase.

Zusammenfassung

Dieser Eintrag enthält eine Dokumentation zur EML Object Detection Android-App. Sie enthält eine schrittweise Anleitung zur Einrichtung einer TensorFlow-Umgebung auf Windows 10 für die Konvertierung von TensorFlow-Modellen in app-kompatible TensorFlow Lite-Modelle und deren Bereitstellung in der Cloud mit Google Firebase.

Die Anleitung ist für Windows 10 mit einer CUDA-fähigen GPU geschrieben. Falls Sie keine CUDA-Unterstützung haben, überspringen Sie einfach die CUDA- und cuDNN-Installation. Wenn Sie nur Modelle konvertieren möchten und kein Training durchführen, werden Sie wahrscheinlich keine spürbare Geschwindigkeitssteigerung durch die GPU-Unterstützung feststellen.

1. Einführung

Aufgrund der zunehmenden Rechenleistung von Mobilgeräten werden machine learning Anwendungen auf Mobilgeräten in den letzten Jahren immer häufiger eingesetzt. Google fördert diese Entwicklung intensiv mit Tensorflow Lite, Edge TPUs, Androids NN API etc.

Man findet viele Demonstrations-Apps für Objekterkennung (wie die offizielle aus dem TensorFlow-Repository) und viele Code-Stücke und Snippets. Es gibt auch viele gute Tutorials zur Konvertierung von Modellen in das .tflite-Format und zur Übertragung auf ein Android-Smartphone. Aber aufgrund der schnellen Entwicklung des TensorFlow-Ökosystems werden manchmal Befehle oder APIs veraltet oder ersetzt, Arbeitsabläufe ändern sich mit neueren Versionen der Tools und so weiter. Daher müss man oft auf mehreren Websites nach Antworten suchen.

Dieser Leitfaden soll als einzige Informationsquelle für alle Tools dienen, die zur Verwendung der App benötigt werden. Das Ziel ist es, ein detailliertes Verständnis dafür zu vermitteln, welche Schritte erforderlich sind, um ein vorhandenes Modell in die App zu integrieren, und wie die App strukturiert ist.

Überblick

Im Bild sehen Sie eine strukturierte Übersicht über die drei Hauptkomponenten dieses Projekts: die Modellkonvertierung, das Remote-Hosting des Modells und die App selbst.

Abbildung der App und des workflow

2. Umgebung einrichten

Anaconda installieren

Besuchen Sie zunächst die offizielle Anaconda-Website unter https://www.anaconda.com/, öffnet eine externe URL in einem neuen Fenster und laden Sie den Installer für die Windows x64-Edition der Individual Edition herunter. Führen Sie den Installer aus und belassen Sie alle Einstellungen auf den Standardeinstellungen.

Nach Abschluss des Vorgangs öffnen Sie die Anaconda-Eingabeaufforderung mit Administratorberechtigungen.

Aktualisieren Sie zunächst alle Conda-Pakete mit dem folgenden Befehl:

    conda update --all

Dann erstellen Sie eine virtuelle Umgebung mit dem Namen "tf" und wechseln Sie zu dieser Umgebung

    conda create -n tf pip python=3.8
    activate tf

Sorgen wir dafür, dass die neueste Version von pip verfügbar ist, mit:

    python -m pip install --upgrade pip

Fügen Sie den Conda-Forge-Paketkanal zur Konfiguration von Conda hinzu. Oft bietet er aktuellere Paketversionen als der standardmäßige Conda-Kanal.

    conda config --add channels conda-forge

Beachten Sie, dass wir spezifische Versionen von Tensorflow, Cuda und cudNN installieren. Die Liste der getesteten Build-Konfigurationen finden Sie hier, öffnet eine externe URL in einem neuen Fenster.

Installieren Sie Tensorflow mit GPU-Unterstützung mit dem folgenden Befehl:

    python -m pip install tf-nightly-gpu

Hinweis: Wenn Sie keine GPU-Unterstützung wünschen, ersetzen Sie tf-nightly-gpu durch tf-nightly.

Wenn Sie die GPU-Unterstützung wünschen, müssen Sie auch Cuda und cudNN installieren. Verwenden Sie dazu den folgenden Befehl:

    conda install cudatoolkit=11.2 cudnn=8.1

Der Model-Konverter erfordert die Installation der folgenden zusätzlichen Pakete:

    python -m pip install scipy matplotlib pyyaml tf_slim

und

    conda install -c anaconda protobuf

Android Studio installieren

Das Projekt ist für die Verwendung mit Android Studio konfiguriert. Daher ist es Empfehlenswert für die weitere Entwicklung. Besuchen Sie die Android Developer Website unter https://developer.android.com/studio, öffnet eine externe URL in einem neuen Fenster und laden Sie die neueste Version von Android Studio herunter.

Nach dem Download führen Sie den Installer aus und folgen den Anweisungen.

Modellkonverter einrichten

Um die Modelle in das richtige Format zu konvertieren, stellt dieses Repository ein Python-Skript zur Verfügung - das zusätzliche Einrichtungsschritte erfordert. Wenn Sie dies noch nicht getan haben, klonen Sie dieses Repo auf Ihre lokale Festplatte, z.B. C:/eml-object-detection-android-app.

Öffnen Sie Ihre Anaconda-Eingabeaufforderung mit Administratorberechtigungen und wechseln Sie zum Ordner model_converter in diesem Repo und führen Sie aus:

    activate tf
    make install

Falls Sie 'GNU make' installiert haben. Andernfalls können Sie einfach die Datei install.bat von der Anaconda-Eingabeaufforderung ausführen.

Der Installer cloned das TensorFlow/models-Repository in den Ordner model-converter und kompiliert eine Sammlung von Protobufs, die für den Konverter benötigt werden.

Als letzten Schritt müssen Sie die beiden folgenden Pfade zu Ihrer PYTHONPATH-Systempfadvariable hinzufügen:

    <LOCATION_OF_THE_REPO>/models/_TF_repo
    <LOCATION_OF_THE_REPO>/models/_TF_repo/research

3. Modell konvertieren

Mit den Einrichtungen kann ein gegebenes Modell konvertiert werden, um es in die App zu integrieren. Das Tool 'model_converter', das in diesem Repository enthalten ist, ist so konfiguriert, dass es ein TensorFlow-Modell, das als 'saved_model' gespeichert ist, in ein TensorFlow Lite (.tflite) Modell umwandelt. Das Tool befindet sich im Ordner 'model_converter'.

Was der Konverter grundlegend tut, ist die Umwandlung eines gegebenen 'saved_model' in ein Zwischenmodell, bei dem alle dynamischen Größen durch statische Größen ersetzt werden. Anschließend wird dieses Zwischenmodell in das .tflite-Flatbuffer-Format konvertiert und optional mit einem Datensatz nach der Trainingquantisierung versehen.

Zusätzlich zur Modelldatei schreibt der Konverter eine JSON-Datei für die Remote-Konfiguration für das Hosting des Remote-Modells.

Vorbereitung des vorhandenen Modells

Um den Konverter auszuführen, müssen Sie Ihr Modell vorbereiten und das Modellverzeichnis in einer bestimmten Struktur bereitstellen.

Model Name
|_checkpoint
|_dataset
        |_test
                |_img_001.jpg
                |_img_002.jpg
                | ...
|_saved_model
        |_saved_model.pb
|_labelmap.txt

|_pipeline.config

Das übergeordnete Verzeichnis sollte nach dem Modell benannt sein. Der Ordnername wird dann für die Benennung der Ausgabedateien verwendet.

Im Modellordner muss ein Ordner mit dem Namen "saved_model" vorhanden sein (der das Modell im .pb-Format enthält), und ein Ordner "checkpoint" mit den Kontrollpunkten. Auch die Datei "pipeline.config" ist erforderlich.

Wenn Sie eine Labelmap als "labelmap.txt"-Datei im folgenden Format bereitstellen, kann der Konverter die Labelmap in die JSON-Datei aufnehmen. Wenn Sie keine bereitstellen, können Sie die Labelmap später hinzufügen.

    Class Label 1
    Class Label 2
    Class Label 3
    ...
    Class Label N

Wenn Sie eine post training quantization durchführen möchten, müssen Sie einen Datensatzordner bereitstellen, der einen Testordner enthält, in dem sich Validierungsbilder im .jpg-Format befinden. Der Testordner sollte mindestens eine zweistellige Anzahl von Bildern enthalten.

Verwendung des Modellkonverter

Um eine Konvertierung durchzuführen, müssen Sie die Anaconda-Prompt starten und die zuvor erstellte Umgebung mit folgendem Befehl aktivieren:

    activate tf

Dann können Sie den Konverter im Ordner model_converter mit folgendem Befehl aufrufen:

    convert.py [-h] --model_dir MODEL_DIR --output_dir OUTPUT_DIR
    [--post_quantize POST_QUANTIZE --dataset_size DATASET_SIZE]

–model_dir MODEL_DIR
directory which must contain a saved_model in a folder “saved_model”

–output_dir OUTPUT_DIR
directory where the converted TFLite model should be saved”. In the Output folder there will be a TFLITE_OUTPUT folder generated.

–post_quantize POST_QUANTIZE
set to True, when a post training quantization should be performed. If true, you must also provide the dataset_size parameter.

–dataset_size DATASET_SIZE
input size of the model in pixel.

Die Konvertierung kann einige Minuten dauern. Nach Abschluss der Konvertierung sollte im Ausgabeordner OUTPUT_DIR ein Ordner mit dem Namen TFLITE_OUTPUT erstellt werden. In diesem Ordner befinden sich zwei Dateien. Eine ist die eigentliche .tflite-Modelldatei und die andere ist die JSON-Datei für die Konfiguration des Remote-Modells.

4. Remote-Modellhosting

Die App ist darauf ausgelegt, mit den auf Google Firebase gehosteten Objekterkennungsmodellen zu arbeiten. Der große Vorteil dieser Implementierung besteht darin, dass Sie die App nicht neu kompilieren müssen, wenn Sie ein Modell ändern möchten.

Hierfür verwendet die App 2 Google Firebase APIs: Machine Learning und Remote Config. Die Machine-Learning-API ist für das Herunterladen der Modelle aus der Google Cloud verantwortlich.

Die Remote Config API ist für das Herunterladen eines bestimmten key aus der Google Cloud verantwortlich. In diesem key speichern wir die Modell-Label, die verknüpfte Modell-Datei aus dem Machine Learning, die Modell-Eingabegröße und die Labelmap.

Die Kommunikation erfolgt folgendermaßen: Die App fordert die Remote-Konfiguration von Firebase an. Die Konfiguration enthält eine Liste aller verfügbaren Modelle in der Cloud mit ihren spezifischen Eigenschaften. Die App verwendet diese Informationen, um eine Liste der Modellnamen zu generieren und sie dem Benutzer zur Auswahl zu präsentieren. Wenn der Benutzer ein Modell ausgewählt hat, wird diese bestimmte Modell-Datei von Firebase angefordert.

Zusammenhang von google firebase und den APIs

Erstellen eins neuen Firebase-Projekt

Wenn Sie noch kein aktives Firebase-Projekt mit der App verbunden haben oder wenn Sie ein neues Firebase-Projekt mit einem anderen Google-Konto erstellen möchten, müssen Sie zuerst Google Firebase konfigurieren und ein neues Android-Projekt einrichten.

Folgen Sie dazu einfach den Schritten in der Google-Anleitung, öffnet eine externe URL in einem neuen Fenster. Wenn Sie nach dem Paketnamen der App gefragt werden, geben Sie diesen ein: 

    at.tuwien.ict.eml.odd

Klicken Sie sich durch den Rest des Dialogfelds. Wiederholen Sie nun den obigen Schritt mit dem anderen Paketnamen:

    at.tuwien.ict.eml.odd.debug

Am Ende speichern Sie die Datei google-services.json auf Ihrer lokalen Festplatte. Sie müssen diese Datei in den Android Studio-Ordner in den /app-Ordner kopieren, um die App mit diesem speziellen Firebase-Projekt zu verbinden.

Warum die zweite App-Konfiguration mit dem ".debug"-Paketnamen benötigt wird, liegt daran, dass das App-Projekt so konfiguriert ist, dass es die Beta- und Release-Versionen der App unter dem Paketnamen "at.tuwien.ict.eml.odd" erstellt und die Version, die für das Debuggen verwendet wird, unter "at.tuwien.ict.eml.odd.debug". Dies hat den Vorteil, dass die Debug-Version die installierte Release-Version auf Ihrem Telefon nicht überschreibt. Dies kann sehr nützlich sein, wenn Sie Ihre Debug-Version mit der neuesten Release-Version vergleichen möchten.

Erstellen / Bearbeiten der Remote-Konfiguration

 

Um eine neue ModelConfig zu erstellen, klicken Sie auf "Remote Config" im linken Navigationsbereich. Klicken Sie dort auf "Parameter hinzufügen". Geben Sie "modelConfig" als Parameter-Key ein. Für den Parameterwert kopieren Sie den Inhalt aus der .json-Datei, die im vorherigen Schritt vom Model Converter generiert wurde. Diese JSON-Daten enthalten beispielsweise folgende Informationen:

{
    "EML - SSD Mobilenet v2 Q": {
        "model": "modelFileName",
        "quantized": true,
        "size": 320,
        "labelmap": [
             "demonstrator",
             "cpu",
             "gpu",
             "npu",
             "person",
             "other"
        ]
    },
    // copy your other models in here
}

Danach klicken Sie auf “Update” und dann auf “Publish Changes”.

Modelldateien hinzufügen und ändern

Um ein Modell zu Google Firebase hinzuzufügen, klicken Sie auf "Machine Learning" im linken Navigationsbereich.

Dann klicken Sie auf den Tab "Custom". Dort klicken Sie auf "Modell hinzufügen" und laden Ihre .tflite-Datei hoch. Geben Sie als Namen den Wert des "model"-key in der generierten JSON-Datei ein.

Klicken Sie durch den Dialog. Ihre Firebase-Konfiguration ist nun bereit.

5. App Dokumentation

 

In diesem Abschnitt wird die App selbst beschrieben. Sie sollten ein Gefühl dafür bekommen, welcher Teil der App für welche Funktionalität verantwortlich ist. Detaillierte Beschreibungen der Methoden finden Sie im Quellcode.

Aktivitätsübersicht

Wie Sie im Diagramm sehen können, hat die App 3 Aktivitäten, wobei die sogenannte "modelChooser" Aktivität der Einstiegspunkt in die App ist. Wenn Sie die App starten, beginnen Sie in der Aktivität "modelChooser".

Hier sehen Sie ein Navigationsdiagramm der Aktivitäten und deren entsprechende Screenshots:

Flussdiagramm der App
Screenshots der App

ModelChooser activity

In der "modelChooser"-Aktivität geschieht zunächst Folgendes: Die App fordert die "modelConfig" von Ihrem erstellten Google Firebase-Projekt an. Die Remote-Konfiguration wird heruntergeladen und die App erstellt eine Liste aller verfügbaren Modelle. Diese Liste wird dann dem Benutzer angezeigt.

Der Benutzer wählt ein Modell aus und drückt die "Start"-Schaltfläche. Nachdem die Schaltfläche gedrückt wurde, wird die ausgewählte Modelldatei heruntergeladen. Wenn der Download abgeschlossen ist, werden die "modelConfig" als Zeichenfolge und die "modelFile" als Dateispeicherort-Zeichenfolge an die Hauptaktivität übergeben: die Kameraaktivität.

Camera activity

In der Kameraaktivität sehen Sie den Kamerabildschirm mit der laufenden Objekterkennung. Sie sehen eine Navigationsleiste, mit der Sie zwischen Modellen wechseln und zur Einstellungsaktivität navigieren können. Und unten auf dem Bildschirm sehen Sie auch ein Statistikfeld, das erweitert werden kann.

Im Standardzustand wird die Objekterkennung im "Continuous"-Modus durchgeführt. Das bedeutet, dass jedes Bild, das aus dem Kamerastrom kommt, verarbeitet wird und die Objekterkennung durchgeführt wird.

Sie können dieses Verhalten in den Einstellungen unter "OneShot-Modus" ändern. Mit diesem Modus wird die Objekterkennung nur durchgeführt, wenn die Aufnahmetaste gedrückt wird. Um den Datenfluss der Kamerastreams zu veranschaulichen, sehen Sie das folgende Bild.

Beachten Sie, dass der Tracker im "Continuous-Modus" (Analysestream) die Begrenzungsrahmen der erkannten Objekte auf die Tracking-Bildschirmüberlagerung zeichnet, während der "OneShot-Modus" die Rahmen auf das Bild selbst zeichnet und dieses Bild im Gerätespeicher speichert.

Der Vorschaustrom dient nur dazu, das aktuelle Kamerabild auf den Bildschirm zu zeichnen, damit Sie es sehen können. Diese Einrichtung mit diesen beiden Kamerastreams wird über CameraX realisiert.

Lassen Sie uns einen genaueren Blick auf das erweiterte Statistikfeld werfen.

Diese bietet Ihnen einen Überblick über die im gesamten App-Prozess durchgeführten Inferenzen. Sie können die letzte Inferenzzeit, die Inferenzen pro Sekunde (einschließlich des gesamten Verarbeitungspipelines) und auch einen Boxplot der letzten n Inferenzen sehen. Am unteren Rand sehen Sie grundlegende Informationen zum derzeit geladenen Modell.

Datenflow des Kamerastream
Statistic panel der App

Einstellungen

One Shot Mode

Wenn aktiviert, wird die Objekterkennung nur durchgeführt, wenn die Aufnahmetaste gedrückt wird. Das Bild mit den gezeichneten Begrenzungsrahmen wird dann angezeigt.

Crop Mode

Wenn "Cover" ausgewählt ist: Das gesamte sichtbare Bild wird auf die Modell-Eingabegröße zugeschnitten. Das Seitenverhältnis wird dabei nicht beibehalten. Wenn "Contain" ausgewählt ist: Ein Teil des Bildes in der Mitte wird mit einem Seitenverhältnis von 1:1 ausgeschnitten, und zwar so groß wie möglich. Dieser Ausschnitt wird durch die abgedunkelten Bereiche auf dem Bildschirm dargestellt.

Confidence Threshold

Minimum Konfidenz ab der die Bounding Boxen angezeigt werden

Bound Box Color Mode

Wenn "Classes" ausgewählt ist, erhält jede Klasse eine zufällig gewählte Farbe. Wenn "Confidence" ausgewählt ist, wird die Begrenzungsbox grüner, je höher die Konfidenz ist.

Display confidence in Bounding Box

Wenn diese Einstellung aktiviert ist werden die Konfidenz Werte in den Bounding Boxen angezeigt.

Number of Threads

Anzahl der verwendeten Threads. Der Effekt hängt von der verwendeten Hardware und der Modellgröße ab.

Enable NNAPI usage

Erlaubt der TensorFlow Lite API die Android Nerual Network API zu verwenden

Boxplot Sample Number

Änder die Buffergröße der infernece Werte, welche im Statistik Panel angezeigt werden.

 

GitHub Repository, öffnet eine externe URL in einem neuen Fenster

Download App, öffnet eine externe URL in einem neuen Fenster