{"id":81,"date":"2018-08-24T10:19:08","date_gmt":"2018-08-24T10:19:08","guid":{"rendered":"http:\/\/symotiv.de\/?p=81"},"modified":"2019-04-24T14:13:00","modified_gmt":"2019-04-24T14:13:00","slug":"tracking-von-bewegenden-personen-innerhalb-videos","status":"publish","type":"post","link":"https:\/\/symotiv.de\/tracking-von-bewegenden-personen-innerhalb-videos","title":{"rendered":"03 – Tracking von bewegenden Personen innerhalb Videos"},"content":{"rendered":"

Aufgrund der finanziellen Grundlage des Projekts haben wir uns dazu entschieden mit Machine Learning f\u00fcr das Tracking weiterzuarbeiten. Motiontrackinganz\u00fcge oder \u00e4hnliche Technologien zu nutzen, w\u00e4re in der Skalierung f\u00fcr ein ganzes Orchester viel zu hoch angesetzt. Der finanzielle Aufwand f\u00fcr diese Vielzahl an Material und Technik w\u00e4re immens. Au\u00dferdem war noch gar nicht wirklich klar, wie die Musiker damit umgehen und wie diese solchen Arbeitsaufwand aufnehmen.<\/p>\n

Die Grundlage f\u00fcr ein Tracking durch eine Videoaufnahme geschieht erst einmal zweidimensional. Dem MachineLearning Model wird also ein Video als Input gegeben, welches dann statistisch abgleicht wie viele Personen und Gelenke im Bild sind und wo diese sich befinden. Gearbeitet wurde mit der Openpose Library<\/p>\n

https:\/\/github.com\/CMU-Perceptual-Computing-Lab\/openpose<\/a><\/p>\n

Das Bild oder Video, welches als Input festgelegt wird, erstellt einen statistischen Abgleich anhand des CMU Panoptic Datensatzes (http:\/\/domedb.perception.cs.cmu.edu\/) mit Struktur des COCO Models, das wie folgt aussieht.<\/p>\n

\"\"<\/p>\n

Es werden also die Gelenke\/Keypoints erkannt und zu einem humanoiden Skelett zusammengef\u00fcgt. Der Output is dann selbst definierbar. Man kann das Video mit einem Overlay der erkannten Skelette ausgeben lassen(auf dem Input Video und auf schwarz) und zudem f\u00fcr jeden Frame des Videos eine .json datei in der die x,y und c Werte eines jeden Gelenks notiert werden. Der c-Wert steht f\u00fcr confidence - d.h. wie sicher gibt die Library an, diesen Wert richtig bestimmt zu haben. Die .json Dateien sind also der erste Schritt f\u00fcr eine digitalisierte Bewegung. Anhand des folgenden Bildes ist zu erkennen wie der Output aussieht.<\/p>\n

\"\"<\/p>\n

Hier sieht man die Grobstruktur einer .json Datei, die f\u00fcr jeden Frame erstellt wird.<\/p>\n

\"\"<\/p>\n

Da eine lokale Installation von Openpose aufwendig ist und die Funktion stark von kleineren Libraries und der Systemkonfiguration abh\u00e4ngt, wurde mit einem Docker Container gearbeitet, in dem man \u00fcber die Shell aus Linux angesteuert mit der Library arbeiten kann.<\/p>\n

Wir haben hier mit dem diesem Docker Image gearbeitet:<\/p>\n

https:\/\/hub.docker.com\/r\/wenwu449\/openpose<\/a><\/p>\n

Hier eine kurze Erl\u00e4uterung der Vorbereitungen, Herangehensweise und der Befehle<\/p>\n

Man ben\u00f6tigt:
\nInstalliertes Linux OS (Ubuntu o. \u00e4.)
\n
https:\/\/www.ubuntu.com\/download\/desktop<\/a><\/p>\n

Installiertes Docker per Shell
\n
https:\/\/docs.docker.com\/install\/linux\/docker-ce\/ubuntu\/#install-docker-ce-1<\/a>
\nInstalliertes nVidia Docker
\n
https:\/\/github.com\/NVIDIA\/nvidia-docker\/wiki\/Installation-(version-2.0)<\/a><\/p>\n

Hier sollten die Treiber und die Grafikkarte nicht zu neu sein, denn nvidia docker h\u00e4ngt zusammen mit der cuda version, welche die Grafikkarte vorgibt.<\/p>\n

Genaueres nachzulesen gibt es hier:
\n
https:\/\/github.com\/NVIDIA\/nvidia-docker\/wiki\/CUDA#requirements<\/a><\/p>\n

Wenn die Installationen fertig sind k\u00f6nnen wir damit arbeiten.<\/p>\n

\n

sudo nvidia-docker run -v \/path\/to\/directory:\/data -it wenwu449\/openpose:latest bash<\/p>\n<\/blockquote>\n

Jetzt sind wir innerhalb der Library.<\/p>\n

\n

\/path\/to\/directory:\/data<\/p>\n<\/blockquote>\n

Mit diesem Pfad definieren wir einen lokalen Ordner aus dem Openpose seine Daten zieht. \/data wird sp\u00e4ter zum abgreifen des Pfades.<\/p>\n

Der Basisbefehl um ein Video als Input zu definieren und als Output ein Overlay Video mit .json Daten zu generieren lautet:<\/p>\n

\n

.\/build\/examples\/openpose\/openpose.bin --video \/data\/video.mp4 --display 0 --write_video \/data\/newvideo.avi --write_keypoint_json \/data\/<\/p>\n<\/blockquote>\n

--video legt fest welches video interpretiert werden soll.
\n--display 0 blendet den Prozess der Erkennung aus
\n--write_video gibt einen pfad f\u00fcr das Ausgabevideo
\n--number_people_max 1 sagt maximale Personen zu erkennen auf 1 setzen
\n--camera_fps 59.94 legt fest mit wie viel fps das ausgabevideo exportiert wird (falls das Inputvideo mehr als 30 fps hat)<\/p>\n

\nNachdem der Umgang der Library umg\u00e4nglicher wurde, sind mit selbst erstellten Testvideos die Genauigkeit und die Grenzen erprobt worden.<\/p>\n

Was passiert bei einer Verdrehung des K\u00f6rpers? Wie geht die Library mit verdeckten Gelenken um? Stimmt bei mehreren Personen die Zuordnung der Werte\/Koordinaten? Wie wirkt sich Lage der Person und die Position der Kamera auf das Tracking und die Daten aus?<\/p>\n

Anhand dieser Tests, konnte recht gut abgesch\u00e4tzt werden, welche Situation f\u00fcr die Aufnahmen mit den Musikern geschaffen werden sollte. Es wird auch durchaus knifflig alle erstellten Videos der Musiker in einem Stapel mit der Library zu verarbeiten.<\/p>\n

Im n\u00e4chsten Post geht es um die Weiterverarbeitung der 2D Daten.<\/p>\n","protected":false},"excerpt":{"rendered":"

Aufgrund der finanziellen Grundlage des Projekts haben wir uns dazu entschieden mit Machine Learning f\u00fcr das Tracking weiterzuarbeiten. Motiontrackinganz\u00fcge oder \u00e4hnliche Technologien zu nutzen, w\u00e4re in der Skalierung f\u00fcr ein ganzes Orchester viel zu hoch angesetzt. Der finanzielle Aufwand f\u00fcr diese Vielzahl an Material und Technik w\u00e4re immens. Au\u00dferdem war noch gar nicht wirklich klar, […]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/symotiv.de\/wp-json\/wp\/v2\/posts\/81"}],"collection":[{"href":"https:\/\/symotiv.de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/symotiv.de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/symotiv.de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/symotiv.de\/wp-json\/wp\/v2\/comments?post=81"}],"version-history":[{"count":6,"href":"https:\/\/symotiv.de\/wp-json\/wp\/v2\/posts\/81\/revisions"}],"predecessor-version":[{"id":110,"href":"https:\/\/symotiv.de\/wp-json\/wp\/v2\/posts\/81\/revisions\/110"}],"wp:attachment":[{"href":"https:\/\/symotiv.de\/wp-json\/wp\/v2\/media?parent=81"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/symotiv.de\/wp-json\/wp\/v2\/categories?post=81"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/symotiv.de\/wp-json\/wp\/v2\/tags?post=81"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}