Beurteilung der menschlichen Pose
Vor einigen Monaten bin ich auf ein interessantes Open-Source-Projekt im Internet gestoßen - Openpose, dessen Ziel es ist, eine menschliche Pose in Echtzeit in einem Videostream zu schätzen. Aufgrund meiner beruflichen Aktivitäten war ich daran interessiert, es auf dem neuesten iOS-Gerät von Apple auszuführen, um die Leistung zu überprüfen und herauszufinden, ob dies überhaupt möglich ist. Es war auch interessant zu sehen, wie sich die Leistung des neuronalen Netzwerk-Frameworks für iOS in den letzten Jahren geändert hat.
Das ursprüngliche Openpose-Projekt ist in C ++ geschrieben und verwendet nicht das CoreML - das neuronale Netzwerk-Framework unter iOS. Daher musste ich einen Kernteil in Swift neu schreiben und CoreML verwenden, um den abschließenden Job zu erledigen. Schauen wir uns das folgende Bild an, wie der menschliche Körper dargestellt wird:

Weitere Informationen zum menschlichen Posenmodell finden Sie hier: MPI-Pose
Das Ergebnis ist im Bild unten dargestellt:
Modell vorbereiten
Um das Framework verwenden zu können, muss ein Core ML-Modell erstellt werden. Dieses Modell basiert auf einem Modell aus dem Openpose-Projekt . Führen Sie die folgenden Schritte aus, um ein Modell vorzubereiten:
1) Installieren Sie Python- und CoreML-Tools
2) Führen Sie models / getModels.sh von Open Pose aus , um die ursprünglichen Openpose-Modelle zu erhalten
3) Kopieren Sie models /pose / mpi /pose_deploy_linevec_faster_4_stages.prototxt in models /pose / mpi /pose_deploy_linevec_faster_4_stages_fixed_size.prototxt
4) Ändern Sie Folgendes in der Dateipose_deploy_linevec_faster_4_stages_fixed_size.prototxt:
input_dim: 1 # This value will be defined at runtime -> input_dim: 512 input_dim: 1 # This value will be defined at runtime -> input_dim: 512
5) Erstellen Sie einen Link zum Modellverzeichnis. Nehmen wir an, dass sich das Pose Framework-Projekt und das Openpose-Projekt im Ausgangsverzeichnis befinden. Ein Befehl zum Erstellen eines Links lautet dann wie folgt:
ln -s ~/openpose/models ~/models
6) Gehen Sie zu ~ /pose /pose / CoreMLModels und führen Sie den folgenden Befehl aus:
python convertModel.py
Das oben genannte Skript enthält fest codierte Werte für die Dateipose_deploy_linevec_faster_4_stages_fixed_size.prototxt und die Modelldateipose_iter_160000.caffemodel.
Sie könnten in ein anderes Modell geändert werden. Vergessen Sie jedoch nicht, die .prototxt-Datei so zu ändern, dass das Eingabebild eine feste Größe hat:
input_dim: XXX - entspricht dem with des NN-Eingangs.
input_dim: XXX - entspricht der Höhe des NN-Eingangs.
Vergessen Sie auch nicht, die Modellkonfiguration PoseModelConfigurationMPI15.inputSize auf einen angegebenen Eingabewert zu ändern und diese Konfiguration anstelle einer vorhandenen im Framework zu verwenden, die 512 x 512 als Eingabegröße festlegt.
Alle Werte funktionieren, aber die besten Ergebnisse können erzielt werden, wenn ein Seitenverhältnis mit dem eines Originalbilds übereinstimmt. Es sollte auch berücksichtigt werden, dass größere Werte die Leistung erheblich beeinflussen, was im Abschnitt Leistung gezeigt wird.
Details zur Ausgabe des neuronalen Netzwerks
Schauen wir uns die Ausgabe des NN genauer an. Die Ausgabe des MPI15-Modells ist eine Gruppe von Matrizen mit Dimensionen (input_image_width / 8, input_image_height / 8)
. Jedes Element in der Matrix hat den Float-Typ. Zuordnung zwischen dem Matrixindex in der Ausgabe und dem Körperteil:
POSE_MPI_BODY_PARTS { {0, "Head"}, {1, "Neck"}, {2, "RShoulder"}, {3, "RElbow"}, {4, "RWrist"}, {5, "LShoulder"}, {6, "LElbow"}, {7, "LWrist"}, {8, "RHip"}, {9, "RKnee"}, {10, "RAnkle"}, {11, "LHip"}, {12, "LKnee"}, {13, "LAnkle"}, {14, "Chest"}, {15, "Background"} };
Da jede Matrix eine feste Größe hat, die auf eine bestimmte zugreift, handelt es sich um eine Trifial-Read-by-Offset-Operation: [Background] = NNOutput [sizeOfTheMatrix * 15]
Heatmaps und PAFs
Im MPI15-Modell gibt es zwei Arten von Ausgabematrizen. Diejenigen, die Heatmaps darstellen, und die anderen, die PAFs darstellen. Jede Wärmematrix entspricht einem Verbindungsteil, das insgesamt 15 beträgt. Die PAF-Matrizen repräsentieren Körperverbindungen. Für jede Körperverbindung gibt es eine X- und Y-Matrix, die insgesamt 28 beträgt (14 + 14). Die Gesamtzahl der Matrizen einschließlich einer Hintergrundmatrize beträgt 44.
Demo-Projekt
Das Repository des Projekts enthält auch ein Demo-Projekt'poseDemo ', das die Verwendung des Frameworks demonstriert. Die NN-Ergebnismatrizen für ein bestimmtes Eingabebild sind nachstehend aufgeführt:
Das Zielprojekt wäre ohne Leistungsmessungen nutzlos. Aus den nachstehenden Ergebnissen geht deutlich hervor, dass Apple bei den letzten Modellen eine enorme Leistungssteigerung des NN-Motors erzielt hat. Darüber hinaus wird Apple nach den Prognosen des Analysten im kommenden iPhone noch schnellere NN-Hardware herstellen. Die Ergebnisse der Leistungsmessungen sind nachstehend aufgeführt:
Zeit für die Bearbeitung eines Frames (1-2 Personen in der Ansicht)
Es ist erwähnenswert, dass alle oben gezeigten Zahlen für jeden einzelnen Lauf variieren können. Ich gehe davon aus, dass dies aufgrund der internen CoreML-Optimierung geschieht.
Codequellen
Der Link zum GitHub-Repository: Klicken Sie hier, um ihn zu überprüfen
Anwendungen
Es ist wichtig zu beachten, dass alle unten genannten Anwendungen aus dem Kopf kamen und nicht offiziell von Apple oder einer Behörde bestätigt wurden.
Gesundheitswesen
1) Erkennen von Anomalien in der menschlichen Wirbelsäule auf Standbildern:

2) Gesundheits- und Fitnessführer.
1) Erkennen, ob Personen zu Hause sind, und prüfen, ob alle Geräte ausgeschaltet sind (Bügeleisen / Owen).
2) Personen im Wohnbereich lokalisieren und automatisieren (Licht / Musik / Fernseher einschalten)
Plugins für die Art Studio-Anwendungen
1) 2D -> 3D-Mapping und Pose-Inferenz zur Rekonstruktion einer 3D-Pose basierend auf der 2D-Quelle
Verbesserungen und Weiterentwicklungen
Es könnten verschiedene Verbesserungen vorgenommen werden, um die Leistung des Nachbearbeitungsschritts zu erhöhen und ihn präziser zu gestalten. Es könnte auch interessant sein, es mit 2D-> 3D-Mapping zu kombinieren, um die 3D-Pose zu rekonstruieren. Die Liste möglicher Verbesserungen ist unten aufgeführt:
1) NMS-Optimierung. Eine parallele GPU-Implementierung mit METAL API.
2) Verwenden Sie eine andere Näherung für die Verbindung der Gelenke, die näher an den realen Skelettknochen liegt. Knochen sind nicht gerade.
3) Implementieren Sie eine robustere Filterung für die Ausgabe-Pose, um Artefakte zu entfernen.
4) Implementieren Sie eine Posenschätzung in einem Videostream
5) 2D -> 3D Mapping
Für diejenigen, die sich für den Hintergrund dieses Projekts und Openpose interessieren, finden Sie unten nützliche Informationen:
1) http://posefs1.perception.cs.cmu.edu/Users/ZheCao/Multi-person%20pose%20estimation-CMU.pdf
2) https://www.ri.cmu.edu/wp-content/uploads/2017/04/thesis.pdf
3) https://pose.mpi-inf.mpg.de/
Ein bisschen Spaß
Es ist immer wieder interessant zu sehen, wie die Anwendung von Technologie mit ungewöhnlichen Eingaben funktioniert. Einige lustige Ergebnisse sind unten gezeigt. Bitte beachten Sie, wie der NN den Fuß vorhergesagt hat, wo er tatsächlich versteckt ist:
Fazit
In diesem Artikel wird die iOS-Anwendung zum Ableiten der menschlichen Pose beschrieben. Aus den Leistungsergebnissen geht eindeutig hervor, dass Apple einen großen Leistungssprung bei der neuronalen Netzwerk-Engine erzielt hat. Darüber hinaus werden die nächsten iPhone-Modelle höchstwahrscheinlich Rückschlüsse in Echtzeit ermöglichen. Die Kombination mit der 2D-> 3D-Posenrekonstruktion eröffnet die Möglichkeit, die 3D-Pose des Menschen in Echtzeit in einem Videostream abzuleiten!