Echtzeit-Objekterkennung

Deep Learning

Echtzeit-Objekterkennung

Automatische Objekterkennung basierend auf Deep Learning hat das Potenzial, zukünftig in Bereichen wie der Überwachung von industriellen Fertigungsprozessen, Fahrerassistenzsystemen oder zur Unterstützung in der Diagnostik im Gesundheitswesen einen erheblichen Beitrag zu 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, die bereits Echtzeit-Objekterkennung mit ausgezeichneter Qualität auf Android-Geräten ermöglicht.

Der Fortschritt des maschinellen Lernens und der künstlichen Intelligenz brachte revolutionäre Methoden in der Computer Vision und Textanalyse mit sich. Einer der neueren Trends ist Deep Learning, bei dem Methoden mit zahlreichen Lagen zwischen Eingabeschicht und Ausgabeschicht verwendet werden, mit denen das Machine Learning-Modell komplexere Muster in Daten erlernen kann. Ein Begriff, der häufig in diesem Zusammenhang erwähnt wird, sind künstliche neuronale Netze (KNN). Diese künstlichen neuronalen Netze können unter anderem zur Bildklassifizierung verwendet werden und sogar mehrere Objekte innerhalb eines Bildes erkennen. Die jüngste Weiterentwicklung ermöglicht die Ausführung von Deep-Learning-Algorithmen auf mobilen Geräten und damit die Echtzeit-Objekterkennung. In den folgenden Absätzen geben wir einen kurzen Überblick darüber, wie ein mobiler Echtzeit-Objektdetektor auf einem Android-Telefon bereitgestellt wird.

Einrichten der Entwicklungsumgebung

Für die Erstellung der Android-Anwendung verwenden wir Docker, da Containerisierung die Möglichkeit bietet, alle erforderlichen Abhängigkeiten 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) erforderlich sind. Wenn Sie kein Modell in der Google Cloud trainieren wollen oder ein vorab trainiertes Modell in das TensorFlow Lite-Format konvertieren möchten, können Sie den zugehörigen Code aus der Docker-Datei entfernen.

Modell

Wir nutzen für unsere Android-Anwendung ein MobileNet-Modell, welches auf den COCO-Datensatz trainiert wurde. Eine Vielzahl vorgefertigter, eingefrorener MobileNet-Modelle ist im TensorFlow Git-Repository erhältlich. Darüber hinaus können verschiedene vorgelernte Modellarchitekturen und Frameworks wie SSD MobileNetv1, SSD MobileNetv2 oder Faster R-CNN vom TensorFlow Detection Model Zoo 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 trainieren möchten, müssen Sie den trainierten eingefrorenen TensorFlow-Graphen in das TensorFlow Lite-Format konvertieren, um ihn auf einem mobilen Gerät optimal verwenden zu können. 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 auf einem mobilen Android-Gerät auszuführen, müssen Sie es zunächst in eine APK 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 eine mit Bazel kompatible NDK-Version ausgewählt werden muss, wenn Sie eine neuere Version als 14b verwenden möchten, die derzeit in der Docker-Datei festgelegt ist. Als Nächstes integrieren wir das Modell in die Android-Demo-App TensorFlow Lite, für die Build-Tools mit API-Level ≥23 erforderlich sind. 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. Wenn Sie eine neuere Version verwenden wollen, um beispielsweise die Neural Networks-API (API-Ebene 27, Android 8.1) zu aktivieren, können Sie die Docker-Datei entsprechend anpassen. Eine Liste der API-Levels und der entsprechenden Android-Versionen finden Sie hier.

Um die APK mit dem von Ihnen gewählten Modell zu erstellen, können Sie die konvertierte *.tflite-Datei in detect.tflite umbenennen und sie in den Ordner tensorflow/contrib/lite/examples/android/app/src/main/assets im laufenden Container verschieben. Darüber hinaus muss die zugehörige labels.txt, die die Labels der Objektklassen enthält, im selben Verzeichnis abgelegt werden. 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 müssen 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 mit den neuen Namen aktualisiert werden. Darüber hinaus können in dieser *.java-Datei zusätzliche Parameter wie der Schwellenwert der minimalen Erkennungssicherheit, Ausgabetextgröße usw. angepasst werden. 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, was Bildern mit 300 x 300 Pixeln und dreidimensionalem Farbraum entspricht. 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, können wir das Build-Tool Bazel verwenden. Der Erstellungsprozess für die 64-Bit-Architektur von ARMv7-A kann mit folgendem Befehl aus dem Verzeichnis tensorflow im Container ausgeführt werden:

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

Um das APK für eine andere CPU-Architektur wie zum Beispiel die x86_64-Plattform zu erstellen und den APK mit einem Android-Emulator zu testen, können wir verwenden:

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.

Object detection

APK ausführen

Nach dem erfolgreichen Erstellungsprozess der APK kann sie auf einem Android-Mobiltelefon installiert werden. 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, die mit den Android-Plattform-Tools bereitgestellt wird. Der ADB-Befehl zum Installieren des Pakets lautet:

adb install tflite_demo.apk

Jetzt können Sie die App TFL Detect ausführen, um Objekte zu erkennen, die im COCO-Dataset definiert sind.

2019-04-23T08:37:31+01:0018. April 2019|#steadystories|