Neural Compute Stick: Objekterkennung mit neuronalen Netzen

Keine Kommentare

Convolutional Neural Networks eignen sich hervorragend, um Informationen aus visuellen Daten zu extrahieren und werden mittlerweile von vielen Tech-Firmen eingesetzt, z.B. von Google für die Bildersuche. Ziel ist es, ein Bild so verarbeiten zu können, wie ein Mensch das macht. Dazu wird ein Modell erstellt, indem man das System trainiert, bestimmte Eigenschaften eines Objektes zu erkennen. Im Fall eines Menschen sind das beispielsweise Körperteile wie Arme, Beine oder der Kopf.
Das Gute daran: Der Algorithmus erkennt nach und nach selbstständig die klassifizierenden Eigenschaften eines Objektes, man muss sie ihm nicht vorher aufzeigen. Er kann aber selbstverständlich nur die Objekte erkennen, auf die man ihn trainiert hat. Einen Nachteil hat der Deep-Learning-Ansatz aber: Man benötigt dazu mindestens eine schnelle Grafikkarte, um das Modell in annehmbarer Zeit trainieren und ausführen zu können.
In diesem Blogeintrag werden neuronale Netze (genauer: CNNs) für die Klassifizierung von Objekten aus einem Video-Stream auf einem handelsüblichen, günstigen PC ohne dedizierte Grafikkarte verwendet. Möglich gemacht wird das durch den kürzlich erschienenen Movidius Neural Compute Stick.

Movidius Neural Compute Stick

Der Neural Compute Stick (NCS) ist ein Mini-Rechner, der die Ausführung von neuronalen Netzen beschleunigt. Die gesamte Hardware steckt in einem USB-Stick und ist kompatibel mit einem USB 2.0-Port, sollte aber möglichst per USB 3.0 anschlossen werden.
Er verfügt über eine sogenannte Vision Processing Unit namens Myriad 2. Diese relativ junge Art von Mikroprozessoren ist speziell für den Bereich Machine Vision ausgelegt und sehr energieeffizient. Laut Hersteller Movidius liegt die typische Leistungsaufnahme der VPU bei etwa einem Watt. Der NCS kostet um die 80 US-Dollar, ist aber zur Zeit (September 2017) nur bei sehr wenigen Online-Versandhändlern erhältlich.

Der Movidius Neural Compute Stick ist keine Rundumlösung für Deep Learning. Er ist nicht dafür geeignet, ein Modell zu trainieren, sondern nur dafür, Input-Daten wie z.B. einen Video-Stream mit einem bereits erstellten Modell zu analysieren. Das Modell muss also vorher auf einem anderen Rechner trainiert worden sein, was je nach Hardware einige Zeit in Anspruch nehmen kann. Glücklicherweise gibt es von der Community schon einige trainierte Modelle, die frei zur Verfügung gestellt werden. Prinzipiell geeignet sind Modelle der Deep-Learning-Bibliothek Caffe (.caffemodel), man muss sie aber erst für den NCS konvertieren. Die Software dafür wird mitgeliefert.
Ein Modell für den Movidius darf momentan nur über eine Input-Variable verfügen.
Im folgenden Screenshot ist die Klassifizierung von Bilddaten eines Webcam-Videostreams zu sehen. Zum Einsatz kam dabei das GoogLeNet.

Klassifizierung von Bilddaten

Klassifikation der Bilder eines Webcam-Streams auf dem NCS mit dem GoogLeNet.

Vorbereitungen und Setup:

Die benötigte Software, um den Movidius Neural Compute Stick zu programmieren und am Zielgerät betreiben zu können, gibt es beim Hersteller zum Download. Darunter fallen auch einige Beispiel-Applikationen wie der Code für das oben abgebildete Beispiel. Auch einige trainierte Modelle kann man gleich herunter laden, darunter z.B. das AlexNet oder GoogLeNet.

Anforderungen an die Entwicklungsplattform:

  • x64-PC mit Ubuntu Linux nativ, virtuelle Maschine wird nicht unterstützt
  • Windows und macOS werden (momentan) nicht unterstützt
  • Die Linux-Distribution muss derzeit zwingend ein Ubuntu-Ableger in Version 16.04 LTS sein.
  • Auf Ubuntu muss Python in der Version 3.5.2 installiert sein

Für die Zielplattform müssen die oben genannten Anforderungen nicht erfüllt sein. Movidius weist explizit darauf hin, dass der NCS auch an einem Raspberry Pi funktioniert.

Anforderungen zum Ausführen des Beispielcodes zum NCS:

Toolkit und API installieren:

Bevor man mit dem Movidius Neural Compute Stick etwas anfangen kann, müssen die API und das Toolkit installiert werden. Mit dem Toolkit kann man auf der Entwicklungsplattform ein Modell für den NCS konvertieren und testen, die Movidius API erlaubt den Zugriff auf die Funktionalität des Neural Compute Sticks u.a. mit Python. Der Download ist hier zu finden: https://ncsforum.movidius.com/discussion/98/latest-version-movidius-neural-compute-sdk.
Die Installation erfolgt automatisch mit jeweils einem Bash-Skript im entpackten Toolkit-/API-Ordner, das nur ausgeführt werden muss:

$ ./setup.sh

Zu beachten ist, dass insbesondere die Installation des Toolkits sehr lange dauern kann (15-30 min) und eine stabile Internetverbindung erfordert.

Bevor man ein Modell mit dem Stick verwenden kann, muss man es erst für den NCS konvertieren. Das erledigt ein Skript aus dem Toolkit:

$ python3 ./mvNCCompile.pyc sample_network.prototxt -w sample_network.caffemodel -s 12 -o name_of_outputfile

Die generierte „graph“-Datei (Standardname, wenn nicht festgelegt) kann man jetzt in einer Anwendung für den NCS verwenden.

Objekterkennung mit Tiny YOLO

Für unsere Zwecke ist es vonnöten, diverse Objekte in der Szenerie ausfindig zu machen und grob zu erkennen, um was es sich dabei handelt. Die mitgelieferten Modelle sind zu diesem Zweck nicht geeignet. Mit ihnen kann man nur ein Objekt in einer Szene klassifizieren bzw. erkennen. Sie basieren sozusagen auf der Annahme, dass das Input-Bild nur ein relevantes Objekt in Großaufnahme zeigt. YOLO (You Only Look Once) dagegen ist ein neuronales Netzwerk zur Erkennung und Lokalisierung von diversen Objekten auf einem Bild. Ein weiterer Vorteil von YOLO ist, dass es Personen von Objekten in der Szenerie unterscheiden kann.
Tiny YOLO ist ein ressourcensparender Ableger davon, der das Modell auch auf schwacher Hardware lauffähig macht. Durch die Optimierung wird Objekterkennung auf dem NCS beinahe in Realtime (Durchlaufzeit ca. 0.2s pro Frame) möglich, die Fehlerrate steigt aber deutlich. Für unsere Zwecke ist die Erkennung trotzdem noch genau genug.
Einige Entwickler haben sich bereits der Aufgabe angenommen, Tiny YOLO für den NCS umzusetzen. Das Ergebnis ihrer Bemühungen kann man bei GitHub herunterladen: https://github.com/gudovskiy/yoloNCS.
Hier finden sich sowohl das Modell von Tiny YOLO als auch Python-Beispielcode zum Umgang mit dem Model.

Einrichtung von Tiny YOLO auf dem NCS

Um die Code-Beispiele für Tiny YOLO lauffähig zu machen, braucht es wieder einiges an Zusatzsoftware auf der Entwicklungsplattform. Ferner ist eine Webcam vonnöten, die unter Linux lauffähig ist. Man benötigt sowohl eine OpenCV-Installation „from source“ als auch eine ffmpeg-Installation „from source“.
Die simple Installation über den Python-Paketmanager pip reicht nicht aus, denn damit kann OpenCV in der Regel nicht auf eine Kamera zugreifen und einen Videostream starten.

Zur Installation von ffmpeg unter Linux ist den Anweisungen im offiziellen Guide zu folgen: https://trac.ffmpeg.org/wiki/CompilationGuide/Ubuntu.

Nach der Installation von ffmpeg kann man mit folgendem Befehl im Terminal überprüfen, ob ffmpeg eine Kamera erkennt und nutzen kann. Dabei ist /dev/video0 mit der gewünschten Video-Quelle zu ersetzen:

$ ffmpeg -f v4l2 -list_formats all -i /dev/video0

Der Output sollte in etwa so aussehen:

[video4linux2,v4l2 @ 0x2753960] Raw : yuyv422 : YUYV 4:2:2 : 640x480 352x288 320x240 176x144 160x120 1280x720 640x480
[video4linux2,v4l2 @ 0x2753960] Compressed: mjpeg : Motion-JPEG : 640x480 352x288 320x240 176x144 160x120 1280x720 640x480

Damit ist die Installation von ffmpeg abgeschlossen. Es fehlt noch OpenCV: http://docs.opencv.org/2.4/doc/tutorials/introduction/linux_install/linux_install.html.
Um grob zu überprüfen, ob die OpenCV-Installation erfolgreich verlaufen ist, kann man eines der Samples im OpenCV-Installationsordner unter /bin ausführen.

Wie in der Einführung zum Movidius-Stick beschrieben, muss das Caffemodel von TinyYolo mit einem von Movidius bereitgestellten Skript erst einmal in ein geeignetes Format für den NCS gebracht werden. Das geschieht hier konkret mit folgendem Befehl:

$ python3 ./mvNCCompile.pyc your_path/yolo_tiny_deploy.prototxt -s 12

Voraussetzung dafür ist, dass man vorher das Caffemodel und die passende Prototxt-Datei in denselben Ordner verschoben hat. Beide Dateien müssen denselben Namen (aber natürlich unterschiedliche Dateiendungen) haben! Anderenfalls erhält man ein fehlerhaftes Modell, es erscheint aber trotzdem keine Fehlermeldung.

Tiny YOLO auf dem NCS

Um die Beispiele zu TinyYolo ausführen zu können, kopiert man den py_examples-Ordner aus dem yoloNCS-Repo in den ncapi-Ordner der NCS-API oder erstellt einen symlink.
Es gibt zwei mitgelieferte Beispiele:

  • yolo_example: Erkennt Objekte mit dem TinyYolo-Modell auf einem bestimmten .jpg-Bild und markiert die gefundenen Objekte im Bild.
  • yolo_object_detection_app: Erkennt Objekte in einem Videostream, der von der Webcam aufgenommen wird und markiert die Objekte im Video.

Hat soweit alles geklappt, sieht man beim Ausführen mit Python 3 den Video-Stream der Webcam, in dem Objekte markiert werden, die Tiny YOLO gelernt hat. Die Zahlen geben an, inwieweit das erkannte Objekt dem antrainierten Template ähnelt.
Ab welcher Ähnlichkeit ein Objekt als „erkannt“ gilt, ist konfigurierbar. Man hat also entweder mehr false-positives (falsch klassifizierte Objekte) oder false-negatives (nicht erkannte Objekte). Der folgende Screenshot und das Video am Textanfang demonstrieren die Objekterkennung mit Tiny YOLO in einem Webcam-Stream.

Objekterkennung mit Tiny YOLO

Objekterkennung in einem Webcam-Stream auf dem NCS mit dem Tiny YOLO-Modell

Das Modell, wie es momentan trainiert ist, erkennt 20 verschiedene Dinge, darunter Personen sowie eine Handvoll Tierarten. Die Erkennung von Menschen funktioniert am besten, bei „leblosen“ Gegenständen wie Flaschen arbeitet sie aber eher unzuverlässig.

Kommentieren

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.