Évaluation de la pose humaine sur des images pour iOS

Évaluation de la pose humaine


Il y a quelques mois, je suis tombé sur un projet open source intéressant sur Internet - Openpose dont le but est d'estimer une pose humaine en temps réel sur un flux vidéo. En raison de mes activités professionnelles, j'étais intéressé à l'exécuter sur le dernier appareil iOS d'Apple pour vérifier les performances et déterminer si cela était possible. Il était également intéressant de voir comment les performances du cadre de réseau de neurones pour iOS ont changé au cours des dernières années.


Le projet Openpose d'origine est écrit en C ++ et n'utilise pas le CoreML - le framework de réseau neuronal sur iOS. J'ai donc dû réécrire une partie centrale dans Swift et utiliser CoreML pour faire le travail d'inférence. Jetons un coup d'œil à l'image suivante sur la façon dont le corps humain est représenté:



Vous trouverez plus d'informations sur le modèle de pose humaine ici: MPI-pose


Le résultat est montré dans l'image ci-dessous:


Aux fins de démonstration, j'ai pris des images avec moi-même)L'estimation de la pose humaine résultante dessinée sur l'image d'origine

Préparer le modèle


Pour commencer à utiliser le framework, un modèle Core ML doit être créé. Ce modèle est basé sur celui du projet openpose . Pour préparer un modèle, procédez comme suit:
1) Installer les outils Python et CoreML
2) Exécutez models / getModels.sh à partir d' Open Pose pour obtenir les modèles openpose d'origine
3) Copiez models / pose / mpi / pose_deploy_linevec_faster_4_stages.prototxt dans models / pose / mpi / pose_deploy_linevec_faster_4_stages_fixed_size.prototxt
4) Modifiez les éléments suivants dans le fichier pose_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) Créez un lien vers le répertoire des modèles. Supposons que le projet de framework de pose et le projet openpose se trouvent dans le répertoire de base, alors une commande pour créer un lien serait la suivante:


ln -s ~/openpose/models ~/models


6) Allez dans ~ / pose / pose / CoreMLModels et exécutez la commande suivante:


python convertModel.py


Le script mentionné ci-dessus contient des valeurs codées en dur dans le fichier pose_deploy_linevec_faster_4_stages_fixed_size.prototxt et le fichier modèle pose_iter_160000.caffemodel.
Ils peuvent être modifiés pour un autre modèle mais n'oubliez pas de changer le fichier .prototxt pour avoir une taille fixe de l'image d'entrée:
input_dim: XXX - correspond au avec de l'entrée NN.
input_dim: XXX - correspond à la hauteur de l'entrée NN.
N'oubliez pas non plus de modifier la configuration du modèle PoseModelConfigurationMPI15.inputSize en une valeur d'entrée spécifiée et d'utiliser cette configuration au lieu d'une configuration existante dans le cadre qui définit 512x512 comme taille d'entrée.


Toutes les valeurs fonctionneront, mais les meilleurs résultats pourraient être obtenus si un rapport d'aspect correspond à celui d'une image d'origine. En outre, il convient de tenir compte du fait que des valeurs plus importantes affecteront considérablement les performances, comme indiqué dans la section Performances.


Détails de sortie du réseau neuronal


Examinons de plus près la sortie du NN. La sortie du modèle MPI15 est un groupe de matrices aux dimensions (input_image_width / 8, input_image_height / 8) . Chaque élément de la matrice a un type flottant. Mappage entre l'indice de matrice dans la sortie et la partie du corps:


 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"} }; 

Étant donné que chaque matrice a une taille fixe, l'accès à une particulière est une lecture trificielle par opération de décalage: [Background] = NNOutput [sizeOfTheMatrix * 15]


Cartes thermiques et PAF


Il existe deux types de matrices de sortie dans le modèle MPI15. Ceux qui représentent les cartes thermiques et les autres qui représentent les PAF. Chaque matrice thermique correspond à une partie de joint qui est de 15 au total. Les matrices PAF représentent les connexions corporelles. Pour chaque connexion de corps, il existe une matrice X et Y qui est au total de 28 (14 + 14). Le nombre total de matrices, y compris une matrice, est de 44.


Projet de démonstration


Le référentiel du projet contient également un projet de démonstration «poseDemo» qui montre l'utilisation du framework. Les matrices de résultats NN pour une image d'entrée particulière sont présentées ci-dessous:


ÉchantillonLes images
Résultat de la pose humaine:Cartes thermiques combinées en une seule image. Chaque joint a sa propre couleur:
PAF combinés en une seule image:Tous les candidats de la carte thermique. Chaque candidat a sa propre confiance qui définit son opacité sur l'image:
Regardons de plus près les candidats de la carte thermique correspondant à une tête:Examinez de plus près les candidats de la carte thermique correspondant à un cou:
Matrice PAF qui correspond à un candidat de connexion tête-cou. Les articulations de la carte thermique de la tête et du cou sont également représentées sur l'image:Matrice PAF qui correspond à un candidat de connexion LShoulder, LElbow. Les joints de la carte thermique LShoulder-LElbow sont également représentés sur l'image:

Performances


Le projet objectif serait inutile sans mesures de performance. On voit clairement dans les résultats ci-dessous qu'Apple a fait une énorme augmentation des performances du moteur NN dans les derniers modèles. De plus, selon les prévisions de l'analyste, Apple rendra le matériel NN encore plus rapide dans le prochain iPhone. Les résultats des mesures de performances sont présentés ci-dessous:


Temps de traitement d'une image (1-2 personnes dans la vue)


Taille d'entrée NniPhone XR (ms)iPhone 8 (ms)iPhone 5S (ms)
CoreML
512 x 512190367020801
256 x 2567010397162
Post-traitement
512 x 5121967100
256 x 256535
Total
512 x 512219373720901
256 x 2567510747200

Il convient de mentionner que tous les nombres indiqués ci-dessus peuvent varier pour chaque série particulière. Je suppose que cela se produit en raison de l'optimisation interne de CoreML.


La pose résultante en fonction de la taille d'entrée NN (le plus petit et le plus rapide le moins précis est le résultat)


512 x 512256 x 256

Sources de code


Le lien vers le référentiel GitHub: cliquez pour le vérifier


Les applications


Il est important de noter que toutes les applications mentionnées ci-dessous sont sorties de la tête et ne sont pas officiellement confirmées par Apple ou une autorité.


Santé


1) Détection d'anomalies de la colonne vertébrale humaine sur des images fixes:

2) Guide de santé et de remise en forme.



1) Détecter si des personnes à la maison et vérifier si tout l'équipement est éteint (fer / table).
2) Localiser les personnes à l'intérieur du salon et faire de l'automatisation (allumer les lumières / la musique / la télévision)


Plugins pour les applications de studio d'art


1) 2D -> Cartographie 3D et inférence de pose pour reconstruire une pose 3D basée sur la source 2D


Améliorations et développements ultérieurs


Plusieurs améliorations pourraient être apportées pour augmenter les performances de l'étape de post-traitement et pour la rendre plus précise. En outre, il pourrait être intéressant de le combiner avec une cartographie 2D-> 3D pour reconstruire la pose 3D. La liste des améliorations possibles est présentée ci-dessous:
1) Optimisation NMS. Une implémentation GPU parallèle utilisant l'API METAL.
2) Utilisez une approximation différente pour la connexion des articulations qui est plus proche des os squelettiques réels. Les os ne sont pas droits.
3) Implémentez un filtrage plus robuste pour la pose de sortie pour vous débarrasser des artefacts.
4) Implémenter une estimation de pose sur un flux vidéo
5) Cartographie 2D -> 3D


Informations approfondies


Pour ceux qui sont intéressés par le contexte de ce projet et Openpose peuvent trouver des informations utiles ci-dessous:
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/


Du plaisir


Il est toujours intéressant de voir comment l'application de la technologie fonctionnera avec une entrée inhabituelle. Certains résultats amusants sont présentés ci-dessous. Veuillez noter comment le NN a prédit le pied où il est caché en fait:


L'image a été prise de Magic Poser

Conclusion


Dans cet article, l'application iOS pour déduire la pose humaine est décrite. Selon les résultats de performance, il est clairement constaté qu'Apple a fait un bond de géant dans les performances du moteur de réseau neuronal. De plus, les prochains modèles d'iPhone permettront très probablement de déduire en temps réel. Combiner cela avec la reconstruction de pose 2D-> 3D ouvre la possibilité d'inférer la pose humaine 3D en temps réel sur un flux vidéo!

Source: https://habr.com/ru/post/fr458000/


All Articles