Echtzeit-Objekterkennung auf Android-Geräten

Februar 2022
November 2020

Lesen Sie auch über Explainable Object Detection

Automatische Objekterkennung basierend auf Deep Learning besitzt enormes Potenzial. Dadurch kann es zukünftig in Bereichen wie der Überwachung von industriellen Fertigungsprozessen, Fahrerassistenzsystemen oder zur Unterstützung in der Diagnostik im Gesundheitswesen einen erheblichen Beitrag leisten. Um den großflächigen industriellen Einsatz zu ermöglichen, ist es allerdings notwendig, diese Verfahren auf ressourcenbeschränkten Geräten anwenden zu können. Einen möglichen Einsatz zeigen wir mit der beschriebenen Anwendung. Dieser ermöglicht bereits Echtzeit-Objekterkennung mit guter Qualität auf Android-Geräten.

Der Fortschritt im Machine Learning und der künstlichen Intelligenz ermöglicht revolutionäre Methoden in der Computer Vision und Textanalyse. Der neue Trend des Deep Learning verwendet Methoden mit zahlreichen Lagen zwischen Eingabe- und Ausgabeschicht. Damit lernt das Machine Learning-Modell, komplexere Muster in Daten zu erkennen. Darüber hinaus wird in diesem Zusammenhang der Begriff künstliche neuronale Netze (KNN) eingeführt. Ein mögliches Anwendungsfeld stellt die Bildklassifizierung dar. Infolgedessen besteht sogar die Möglichkeit, mehrere Objekte innerhalb eines Bildes zu erkennen. Die jüngste Weiterentwicklung ermöglicht die Ausführung von Deep-Learning-Algorithmen auf mobilen Android-Geräten und damit die Objekterkennung in Echtzeit. Deshalb geben wir in den folgenden Absätzen einen kurzen Überblick darüber, wie wir einen mobilen Echtzeit-Objektdetektor auf einem Android-Gerät bereitstellen.

Objekterkennung in Android - Einrichten der Entwicklungsumgebung

Für die Erstellung der Android-Anwendung verwenden wir Docker, da Containerisierung die Möglichkeit bietet, alle erforderlichen Abhängigkeiten schnell und einfach zu installieren, ohne mögliche Probleme auf Ihrem Host-Computer zu verursachen. Dazu müssen wir eine bereitgestellte Docker-Datei aus dem TensorFlow Git-Repository anpassen. Die Docker-Datei basiert auf dem offiziellen TensorFlow-Docker-Image und bietet Abhängigkeiten und Konfigurationen, die zum Erstellen des Java-basierten Android-Pakets (APK) nötig sind. Zudem kann man Code aus der Docker-Datei entfernen. Wenn Sie beispielsweise kein Modell in der Google Cloud trainieren wollen oder ein vorab trainiertes Modell in das TensorFlow Lite-Format konvertieren möchten.

Objekterkennung in Android - Auswahl des richtigen KI-Modells

Damit wir eine Echtzeit-Objekterkennung in Android durchführen können, benötigen wir zunächst ein geeignetes Modell. Für unsere Android-Anwendung nutzen wird daher ein MobileNet-Modell, welches auf den COCO-Datensatz trainiert wurde. Eine Vielzahl vortrainierter, eingefrorener MobileNet-Modelle ist im TensorFlow Git-Repository erhältlich. Darüber hinaus können verschiedene vortrainierte Modelle, wie SSD MobileNetv1, SSD MobileNetv2 oder Faster R-CNN, vom TensorFlow Hub oder dem TensorFlow Guide heruntergeladen werden. Bei den MobileNet-Modellen handelt es sich um Modelle mit niedriger Latenzzeit und niedrigem Stromverbrauch. Damit sind sie optimal für ressourcenbeschränkte Mobilgeräte geeignet. Wenn Sie Ihr eigenes Modell verwenden möchten, müssen Sie den eingefrorenen TensorFlow-Graphen in das TensorFlow Lite-Format konvertieren. Damit gewährleisten wir eine optimale Verwendung auf Ihrem mobilen Gerät. TensorFlow bietet einen Konverter an, mit dem ein TensorFlow-Protokollpufferdiagramm (.pb) in eine TensorFlow Lite FlatBuffer Datei (*.tflite) umgewandelt werden kann.

Aufbau der APK

Um das Modell für eine Echtzeit-Objekterkennung auszuführen, müssen Sie es zunächst in eine APK für ein mobiles Android-Gerät integrieren. Die Docker-Datei enthält das Android-NDK (zur Unterstützung von C und C++) und das SDK, welche für den Erstellungsprozess erforderlich sind. Bitte beachten Sie, dass derzeit in der Docker-Datei die Version 14b festgelegt ist. Außerdem müssen neuere NDK-Versionen kompatibel mit Bazel sein. Als Nächstes integrieren wir das Modell in die Android-Demo-App TensorFlow Lite. Für diese sind Build-Tools mit API-Level ≥23 erforderlich. Ebenso sind die SDK-Tools und -Konfigurationen in der Docker-Datei enthalten. API-Ebene 23 entspricht Android 6.0 Marshmallow. Die Android-Demo ist jedoch bereits mit Geräten mit API-Level ≥21 kompatibel. Sie wollen eine neuere Version verwenden, um beispielsweise die Neural Networks-API (API-Ebene 27, Android 8.1) zu aktivieren? Dann können Sie die Docker-Datei entsprechend anpassen.

Eine Liste der API-Levels und der entsprechenden Android-Versionen finden Sie hier.

Erstellung der APK

Um die APK mit dem von Ihnen gewählten Modell zu erstellen, benennen Sie die konvertierte Tflite-Datei in detect.tflite um. Anschließend verschieben Sie die Datei in den Ordner tensorflow/contrib/lite/examples/android/app/src/main/assets im laufenden Container. Darüber hinaus muss die zugehörige labels.txt im selben Verzeichnis abgelegt werden. Diese enthält die Namen der Objektklassen.

Wenn Sie eine andere Benennung verwenden, müssen Sie die Bazel-BUILD-Datei alternativ auf das neue Modell verweisen, um sie in die APK-Assets aufzunehmen. Die BUILD-Datei befindet sich in tensorflow/contrib/lite/beispiele/android/. Ersetzen Sie einfach die Verweise auf detect.tflite und coco_labels_list.txt durch Ihre Modell- und Labellistennamen. Außerdem wird eine Aktualisierung mit den neuen Namen für die Definitionen von TF_OD_API_MODEL_FILE und TF_OD_API_LABELS_FILE in tensorflow/contrib/lite/examples/android/app/src/main/java/org/tensorflow/demo/DetectorActivity.java nötig. Außerdem besteht die Möglichkeit, in dieser Java-Datei zusätzliche Parameter, wie den Schwellenwert der minimalen Erkennungssicherheit, Ausgabetextgröße usw. anzupassen.

Abhängig vom gewählten Modell muss der Konfigurationswert TF_OD_API_INPUT_SIZTF_OD_API_INPUT_SIZE an die Tensordimensionen Ihres Modells angepasst werden. Das vorverpackte SSD MobileNet-Modell ist beispielsweise für Tensoren mit den Dimensionen in der Eingabeschicht 1,300,300,3 konfiguriert. Dies entspricht Bildern mit 300 x 300 Pixeln und dreidimensionalem Farbraum. Die Android-Demo-App transformiert jedes Kamerabild in TF_OD_API_INPUT_SIZTF_OD_API_INPUT_SIZE × TF_OD_API_INPUT_SIZTF_OD_API_INPUT_SIZE Pixel.

Um das APK zu erstellen, verwenden wir das Build-Tool Bazel. Der Erstellungsprozess für die 64-Bit-Architektur von ARMv7-A wird mit folgendem Befehl aus dem Verzeichnis tensorflow im Container ausgeführt:

    
    $ bazel build -c opt --config=android_arm{,64} --cxxopt='--std=c++11'// tensorflow/lite/examples/android:tflite_demo
    

Wenn wir jedoch das APK für eine andere CPU-Architektur wie beispielsweise die x86_64-Plattform erstellen möchten, führen wir folgenden Befehl aus:

    
    $ bazel build -c opt --fat_apk_cpu=x86_64 --cxxopt='--std=c++11'// tensorflow/lite/examples/android:tflite_demo
    

Die APK-Datei wird im Verzeichnis bazel-bin/tensorflow/lite/examples/android/directory erstellt. Anschließend können wir den APK mit einem Android-Emulator testen.

Ausführung des APK zur Objekterkennung auf Android-Geräten

Nach dem erfolgreichen Erstellungsprozess der APK ist sie für die Installation auf einem Android-Gerät bereit. Um die APK-Datei auf Ihrem eigenen Gerät zu installieren, müssen Sie zunächst in den Systemeinstellungen die Entwickleroptionen aktivieren. Anschließend kann der Installationsvorgang auf Ihrem über USB verbundenen Telefon mit der Android-Debugging-Bridge (ADB) gestartet werden. Diese ist bereits in den Android-Plattform-Tools enthalten. Der ADB-Befehl zum Installieren des Pakets lautet:

    
    adb install tflite_demo.apk
    

Jetzt können Sie eine Echtzeit-Objekterkennung auf Ihrem Android-Gerät starten. Mit Hilfe der App TFL Detect ist es möglich, Objekte im COCO-Dataset zu erkennen.

Sie möchten mehr erfahren? Lesen Sie mehr über Objekterkennung in unserem Blog: Explainable Object Detection

Wollen Sie mehr sehen?

Ausgewählte Beiträge

Mehr erfahren
Kein Spam, versprochen
Erhalten Sie wertvolle Insights von unserem Expertenteam.