Gestenerkennung mit dem Coral Dev Board Mini

Die bisherigen KI-Projekte haben sich mit Bilderkennung und Spracherkennung beschäftigt. Jetzt lernst du mit der Gestenerkennung ein weiteres cooles Projekt kennen.

Die Gestenerkennung ist eine Computer-Vision-Technik, die menschliche Formen in Bildern und Videos erkennt und feststellen kann, wo sich etwa die Ellbogen, die Schultern oder die Hände einer Person befinden. Streng genommen handelt es sich somit um eine Posenerkennung. Das entsprechend trainierte Modell nennt sich PoseNet. Es ist dafür optimiert, auf der Edge TPU deines Dev Board Mini zu laufen. 

PoseNet erkennt natürlich nicht, wer sich auf einem Bild befindet, sondern schätzt lediglich ab, an welchen Stellen sich die wichtigsten Körpergelenke aufhalten.

In diesem Blog erscheint nach und nach eine Serie von Artikeln, die sich mit dem Coral Dev Board Mini beschäftigen und dir zeigen, wie du damit umgehst und was du alles damit machen kannst.

Teil 1: Coral Dev Board Mini: Künstliche Intelligenz für den Hobbykeller

Teil 2: Das Coral AI Dev Board Mini im Überblick

Teil 3: Das Coral Dev Board Mini anschließen und loslegen

Teil 4: Mendel Linux: Das Betriebssystem des Coral AI Dev Board Mini

Teil 5: Kamera an das Coral AI Dev Board Mini anschließen

Teil 6: Die Erweiterungsleiste des Coral Dev Board Mini

Teil 7: Programmieren mit dem Coral AI Dev Board Mini

Teil 8: Bilderkennung mit dem Dev Board Mini und der Coral Camera

Teil 9: Spracherkennung mit dem Coral Dev Board Mini

Teil 10: Gestenerkennung mit dem Coral Dev Board Mini

Teil 11: KI-Modelle für das Coral AI Dev Board Mini erweitern

Extra: Mit dem Edge TPU-Compiler Modelle für das Coral Dev Board Mini erstellen

 

Pakete und Bibliotheken überprüfen

Wenn du diese Serie von Anfang an gelesen und alle darin beschriebenen Schritte durchgeführt hast, dann erfüllst du bereits sämtliche Software-Voraussetzungen und kannst sofort loslegen. Du kannst es auch zunächst nochmals überprüfen und bei fehlenden Komponenten diese nachinstallieren. Zunächst erstellst du dafür eine Liste aller in Mendel Linux installierten Pakete mit dem Befehl
dpkg -l > pakete.txt

Dann zeigst du die Liste seitenweise an mit
less pakete.txt

Schaue nach, ob die Pakete „python3-pycoral“, „libedgetpu1-std“ und „python3-tflite-runtime“ vorhanden sind. Andernfalls installierst du sie, indem du den oder die passenden Befehle ausführst:
sudo apt install python3-pycoral
sudo apt install python3-tflite-runtime
sudo apt install libedgetpu1-std


Modell und Dateien herunterladen und installieren

Das Modell für die Erkennung und die übrigen benötigten Dateien befinden sich auf in einem Repository auf Github. Um die Ordnung zu bewahren, installierst du alles in einen separaten Ordner, den du mit
mkdir gesten && cd gesten

erstellst und sogleich dorthin wechselst. Dann klonst du das Github-Repository auf dein Dev Board Mini. Dazu führst du den folgenden Befehl aus:
git clone https://github.com/google-coral/project-posenet.git

Abschließend installierst du noch einige Python-Libraries. Wechsle dazu in das Unterverzeichnis „project-posenet“. Das Bash-Skript, das die Arbeit für dich erledigt, führst du aus mit
sh install_requirements.sh


Nach wenigen Sekunden ist es geschafft. Jetzt hast du auf der Softwareseite alles beisammen, was du für die Gestenerkennung mit deinem Dev Board Mini benötigst.


Posen und Gesten erkennen

An dieser Stelle verbindest du das Dev Board über den microHDMI-Anschluss mit einem Monitor. Um das Dev Board bedienen zu können, verbindest du eine Tastatur mit Touchpad mit dem USB-OTG-Anschluss. Das ist der rechte der beiden USB-C-Anschlüsse. Eventuell ist dafür ein Adapter notwendig.
Das erste Beispiel ist sehr einfach. Es lädt ein Bild herunter und gibt die entsprechenden Keypoints aus. Was das genau ist, erläutert der Kasten am Ende des Beitrags. Starte das Beispielmit
python3 simple_pose.py
Das Skript lädt zunächst das Bild eines indischen Paares herunter und speist es in das Modell ein. Als Ergebnis erhältst du eine Liste mit den Namen der Gelenke, den Koordinaten und den Konfidenzwerten. Diese Werte reichen von 0, nicht erkannt, bis 1, sehr zuverlässig erkannt. Du siehst, wie das Modell die unterschiedlichen Körperteile der beiden Personen auf dem Foto unterschiedlich gut erkennt. Es wirft für alle erkannten Punkte die Variablen label.name, keypoint.point[0], keypoint.point[1] und keypoint.score aus.

Das Ausgangsbild für das PoseNet-Modell

Das ist das Ausgangsbild für die Erkennung mit dem PoseNet-Modell.

 

Das Ergebnis gibt Namen und Position der erkannten Körperteile an sowie den KonfidenzwertDas Ergebnis erscheint in Textform und gibt den Namen und die Position der erkannten Körperteile an sowie einen Konfidenzwert.

Erkennung im Stream

Ein weiteres Beispiel setzt die Coral Camera ein. Es übergibt den Stream der Kamera an PoseNet und zeichnet die Pose in ein Overlay ein. Damit siehst du, wie das Modell arbeitet und wie sich seine Ausgaben darstellen lassen. Stelle sicher, dass du dich im Verzeichnis „project-posenet“ befindest, und führe das Python-Programm aus mit
python3 pose_camera.py
Du siehst in einem Overlay den Stream der Kamera. Das Programm analysiert fortlaufend das Bild, markiert die erkannten Keypoints und verbindet sie. Diese Erkennung funktioniert ziemlich gut. Wenn du dich bewegst, dann bewegt sich dein Gegenpart im Overlay analog. Die Erkennung läuft im Beispiel mit 12 FPS. Optional kannst du das Flag --mirror hinzufügen, um das Bild zu spiegeln:
python3 pose_camera.py --mirror

 

Das Modell analysiert den Stream und zeichnet die erkannten Keypoints ein

Das Modell analysiert fortlaufend den Stream der Kamera und zeichnet die erkannten Keypoints in einem Overlay ein.


Im Unterverzeichnis „models“ findest du drei PoseNet-Modelldateien für verschiedene Auflösungen. Größere Auflösungen sind natürlich langsamer, aber sie ermöglichen ein größeres Sichtfeld, und somit lassen sich weiter entfernte Posen korrekt verarbeiten. Die Standardauflösung beträgt 640 x 480 Pixel. Um die größtmögliche Auflösung zu verwenden, fügst du einen entsprechenden Parameter an den Befehl an:
python3 pose_camera.py --res 1280x720
Es wäre interessant zu sehen, ob das Modell auch Puppen erkennt oder Schwarz-Weiß-Fotos. Du kannst auch ausprobieren, ob es dich noch erkennt, wenn du eine Maske an hast oder eine Mütze trägst.

 

Daten anonymisieren

Das nächste Beispiel zeigt, wie sich das Dev Board und PoseNet einsetzen lassen, um menschliche Verhaltensweisen auf anonyme und datenschutzfreundliche Weise zu analysieren. PoseNet wandelt dabei das Bild eines Menschen in eine Art Skelett um und erfasst seine Position und Bewegung über die Zeit. Das Programm verwirft alle identifizierenden Merkmale und das ursprüngliche Kamerabild. Das Dev Board führt die gesamte Bildanalyse lokal durch., Fremde Dritte, zum Beispiel Cloud Anbieter, bekommen die Daten daher nicht zu sehen, die Anonymität bleibt gewahrt. Starte die App mit
python3 anonymizer.py
Zunächst sieht alles so aus wie bei dem vorherigen Beispiel. Jetzt gehst du aus dem Bild heraus. Das Programm wartet, bis sich niemand mehr im Bild befindet, und speichert dann das Hintergrundbild. Tritt nun wieder in das Bild ein. Du siehst deine aktuelle Pose über einem statischen Bild des Hintergrunds. Sämtliche Merkmale, die dich identifizieren könnten, sind entfernt.

 

Um eine anonyme Auswertung zu ermöglichen, sind hier nur die Keypoints vor einem statischen Hintergrund zu sehen

Um eine anonyme Auswertung zu ermöglichen, sind hier nur die Keypoints vor einem statischen Hintergrund zu sehen.


Mögliche Anwendungen: Ein Ladenbesitzer möchte das Verhalten der Kunden beim Durchqueren des Ladens untersuchen, um den Warenfluss zu optimieren und die Platzierung der Produkte zu verbessern. Oder ein Museum will verfolgen, welche Bereiche zu welchen Zeiten am stärksten frequentiert sind, um zu erfahren welche Exponate in einer Ausstellung besonders gut beim Publikum ankommen. Mit dem Dev Board ist dies möglich, ohne das Bild einer Person direkt aufzunehmen oder Daten an einen Cloud-Dienst zu streamen.
 

Steuern mit Gesten

Grundsätzlich lassen sich mit Gesten auch Dinge steuern, ähnlich wie bei der Spracherkennung. Die Umsetzung einer Steuerung ist hier aber komplizierter. Denkbar ist etwa ein Musik-Synthesizer, den du mit den Händen steuern kannst. Je nach Haltung der Hände ändern sich Tonhöhe und Lautstärke. Ein solcher Software-Synthesizer ist Fluidsynth. Er lässt sich wie folgt installieren:
sudo apt install fluidsynth fluid-soundfont-gm
pip3 install pyfluidsynth

Jedem der 17 Keypoints die PoseNet erkennt ist eine X- und eine Y-Koordinate zugeordnet. Zwischen dem Ellbogen und der Hand lässt sich somit eine Linie ziehen, und die Lage dieser Linie bestimmt dann die Werte, die an den Synthesizer übergeben werden.
Unter den Dateien, die du für das Projekt heruntergeladen hast, befindet sich auch das Python-Skript „synthesizer.py“, das genau das ermöglichen soll. Wegen eines Fehlers im Skript funktioniert es derzeit nicht und gibt keinen Sound aus, zeigt aber die Herangehensweise für eine Steuerung per Geste.
 

So funktioniert die Erkennung

Das PoseNet-Modell basiert auf einer zweistufigen Architektur, die ein spezielles neuronales Netzwerk (mit dem Namen “Convolutional Neural Network”, kurz CNN) und einen Dekodierungsalgorithmus umfasst. Bei einem CNN handelt es sich um eine Sonderform eines neuronalen Netzes, das sich besonders gut für die Verarbeitung von Bild- und Audiodaten eignet.
Die Gestenerkennung läuft in zwei Phasen ab: Ein RGB-Eingabebild wird durch das neuronale Netzwerk geleitet. Es ist darauf trainiert, sogenannte Heatmaps zu erzeugen, die die Position aller Schlüsselpunkte, also der Körperteile, in einem Bild vorhersagen. Außerdem erzeugt es Vektoren, die helfen, die Punkte zu verbinden. Dieser Teil läuft auf der Edge-TPU. Die Ergebnisse werden dann in den nächsten Schritt eingespeist.
Ein spezieller Algorithmus kommt zur Dekodierung von Posen zum Einsatz. Er ermittelt die Posen, die Positionen der Keypoints und die Konfidenzwerte. Der Dekodierungsalgorithmus verwendet die vom CNN erzeugten Heatmaps und Vektoren und stellt die Verbindung zwischen Körperteilen und Personeninstanzen her.
Ein Modell zu erweitern, ergibt hier anders als etwa bei der Bild- und Spracherkennung wenig Sinn. Die Auflösung für zusätzliche Keypoints wie etwa die Finger ist zu ungenau. Wie dort das sogenannte Transfer Learning in der Praxis funktioniert, das liest du im nächsten Beitrag.

 

Das KI-Modell PoseNet  kann 17 Elemente erkennen
Hier sind alle 17 Elemente zu sehen, die das KI-Modell PoseNet erkennen kann.

 

Wichtige Begriffe der Gestenerkennung


Pose: Auf der höchsten Ebene gibt PoseNet ein Pose-Objekt zurück, das eine Liste von Keypoints und einen Konfidenzwert auf Instanz-Ebene für jede erkannte Person enthält.
Keypoint: Der Keypoint ist ein Teil der Pose einer Person wie etwa die Nase, das linke Ohr oder das rechte Knie. Er enthält sowohl eine Position als auch einen Konfidenzwert. PoseNet erkennt derzeit 17 verschiedene Keypoints.
Keypoint Confidence Score: Der Score gibt wieder, wie das Programm die Zuverlässigkeit einschätzt, dass eine ermittelte Keypoint-Position korrekt ist. Er liegt zwischen 0,0 und 1,0 und lässt sich auch heranziehen, um Keypoints auszublenden, die als nicht genau genug erachtet werden.
Keypoint Position: Das sind die zweidimensionalen X- und Y-Koordinaten, an denen ein Keypoint erkannt wurde. Prinzipiell ist auch eine dreidimensionale Erkennung möglich. Dazu bräuchte man aber ein anderes Modell.

 

 

Leave a comment

All comments are moderated before being published