Wenn man an Ganzkörper-Motion-Tracking denkt, denkt man zumeist erst an Systeme aus der Film- oder Videospiel-Produktion, die mit farbigen Referenzpunkten auf dem zu analysierenden Körper oder sogar Ganzkörper-Anzügen die Bewegungen sehr genau entnehmen. In diesem Forschungsprojekt musste jedoch ein bestimmter Rahmen an Kosten und Aufwand für das Orchester eingehalten werden, der es nicht erlaubt hat, derartige Systeme zu benutzen. Daher war es eine umso größere Herausforderung, eine ähnliches Tracking nur mit Kameras und Machine-Learning Frameworks zu erreichen. Um die gewonnenen Daten aus der 2D-Pose-Estimation in der gewollten Virtual Reality Umgebung darstellen zu können, musste der Schritt in die dritte Dimension noch getan werden. Da das Ergebnis des Openpose Trackings 2D-Pixeldaten sind, die abhängig vom analysierten Video entstehen, musste eine weitere Pose-Estimation Komponente angewandt werden, um auch die 3-dimensionale Position der einzelnen getrackten Gelenkpunkte zu ermitteln.
Hierzu ließen sich im Internet viele kleine Experimente und Ansätze finden, die allesamt sehr spezifisch in ihrer eigenen Funktion waren:
https://github.com/chanyn/3Dpose_ssl
Hier wird versucht, die menschliche Bewegung volumetrisch anhand des sichtbaren Körpers herauszufinden.
https://github.com/ildoonet/tf-pose-estimation
Dieses Framework spezialisiert sich auf die live-Erfassung von Bewegungen
http://gvv.mpi-inf.mpg.de/projects/VNect/content/VNect_SIGGRAPH2017.pdf
Hier wird eine weitere Option zur Echtzeiterfassung geboten.
3D-pose-baseline, das Framework für das wir uns entschieden haben, versucht anhand eines Datensatzes eine räumlich realistische 3D-Bewegung aus einem Video zu entnehmen, auf Basis des Open-Source Machine Learning Frameworks tensorflow und der Skriptsprache Python. Arash Hosseini, ein Mitarbeiter am Openpose-Projekt hat diese Methodik auf den Datensatz angepasst, der aus einer Video-Analyse von Openpose entsteht. So können wir direkt an unseren bisherigen Datensatz anknüpfen:
https://github.com/ArashHosseini/3d-pose-baseline
Man gibt hier die Ordnerstruktur an, die von Openpose ausgegeben wurde und das Ergebnis ist eine .TXT-Datei, die die Information für die gesamte Bewegung enthält. Das Ergebnis-Datenformat wurde allerdings auf .CSV umgestellt, der Inhalt bleibt der gleiche (siehe unten).
Um 3d-pose-baseline zu verwenden, muss eine funktionierende Tesorflow Environment eingerichtet werden. Während dem Forschungsprojekt wurde für Machine-Learning Ubuntu 18.04 verwendet, für das alle folgenden Installationen gedacht sind:
https://docs.anaconda.com/anaconda/install/linux/
https://github.com/markjay4k/Install-Tensorflow-on-Ubuntu-17.10-/blob/master/Tensorflow%20Install%20instructions.ipynb
Sobald die Tensorflow-Environment installiert und initialisiert ist, können die Python-Befehle ausgeführt werden, die wie folgend aussehen:
python src/openpose_3dpose_sandbox_out.py --camera_frame --residual --batch_norm --dropout
0.5 --max_norm --evaluateActionWise --use_sh --epochs 200 --load 4874200 --openpose
trackingdata/mid_coco_op/ --people 0 --out test
Dabei sind folgende Komponenten wichtig zu kennen:
src/openpose_3dpose_sandbox_out.py
Beschreibt das Skript, das mit dem Befehl ausgeführt wird. Hier muss man den Pfad angeben, wo sich die .py-Datei befindet
--openpose trackingdata/mid_coco_op/
Hier wird der Ordner angegeben, der den Openpose-Datensatz enthält.
--people 0 --out test
Das sind Flags, die zugeschrieben wurden; „people“ beschreibt per ID die Person, von der das Ergebnis erstellt werden soll und das Wort nach „out“ gibt an wie die auszugebene .CSV-Datei heißen wird. Hier ist die veränderte Datei:
Link mit erneuertem Python Modul folgt.
Die .CSV-Datei die durch diese Rechnungen erstellt wird, bezieht ihre Größe aus der Anzahl Videoframes, die berechnet wurden. Wenn man die Datei in Excel/Calc öffnet ergibt sich folgende
Datenstruktur: Zeilen in der Tabelle stehen für die einzelnen Frames der Bewegung. Spalten bezeichnen die einzelnen Koordinaten, die die Bewegung zusammenstellen in der X-, Y-, und Z-Position. So sind zum Beispiel die Spalten 1, 2, 3 für die x, y, z Position des Joints Hüfte-Mitte zuständig, 4, 5, 6 für Hüfte-Rechts, 7, 8, 9 für Knie-Rechts und so weiter.
Die aus 3d-baseline exportierte .CSV hat immer 96 Spalten, von denen allerdings viele überflüssig sind und daher aus dem benutzbaren Datenset herausfallen. Übrig bleiben 51 Spalten, die für 17 mal 3 Koordinaten, also 17 Gelenke stehen. Das folgende Array zeigt die Gelenke aus der .CSV, die benutzt werden und lässt unbenutzte Werte einfach weg:
int[] relevant = { 0, // Hüfte Mitte 0 1, // Hüfte Links 1 2, // Knie Links 2 3, // Fuß Links 3 /*4,5,*/ 6, // Hüfte Rechts 4 7, // Knie Rechts 5 8, // Fuß Rechts 6 /*9,10,11,*/ 12, // Torso 7 13, // Nacken 8 14, // Hals 9 15, // Kopf 10 /*,16*/ 17, // Schulter Rechts 11 18, // Ellbogen Rechts 12 19, // Hand Rechts 13 /*20,21, 22, 23, 24,*/ 25, // Schulter Links 14 26, // Ellbogen links 15 27 // Hand Links 16 /*,28*/ };
Für den späteren Gebrauch haben wir das Array lückenlos gelassen, da wir aus den Tabellen die überflüssigen Werte streichen und die CSV wirklich nur aus 51 Spalten besteht. Die Gelenke sind folgendermaßen zuzuordnen.