Evaluación de pose humana
Hace unos meses me encontré con un interesante proyecto de código abierto en Internet: Openpose, cuyo objetivo es estimar una pose humana en tiempo real en una transmisión de video. Debido a mis actividades profesionales, estaba interesado en ejecutarlo en el último dispositivo iOS de Apple para verificar el rendimiento y determinar si es posible. También fue interesante ver cómo el rendimiento del marco de la red neuronal para iOS ha cambiado en los últimos años.
El proyecto Openpose original está escrito en C ++ y no utiliza CoreML, el marco de red neuronal en iOS. Por lo tanto, tuve que volver a escribir una parte central en Swift y usar CoreML para hacer el trabajo de inferir. Echemos un vistazo a la siguiente imagen sobre cómo se representa el cuerpo humano:

Puede encontrar más información sobre el modelo de pose humana aquí: MPI-pose
El resultado se muestra en la imagen a continuación:
Preparando el modelo
Para comenzar a usar el marco, se necesita crear un modelo Core ML. Este modelo se basa en uno del proyecto openpose . Para preparar un modelo, siga los siguientes pasos:
1) Instalar herramientas Python y CoreML
2) Ejecute models / getModels.sh desde Open Pose para obtener los modelos originales de propósito abierto
3) Copie models / pose / mpi / pose_deploy_linevec_faster_4_stages.prototxt a models / pose / mpi / pose_deploy_linevec_faster_4_stages_fixed_size.prototxt
4) Cambie lo siguiente en el archivo 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) Cree un enlace al directorio de modelos. Supongamos que el proyecto de marco de pose y el proyecto de propósito abierto están en el directorio de inicio, luego un comando para crear un enlace sería el siguiente:
ln -s ~/openpose/models ~/models
6) Vaya a ~ / pose / pose / CoreMLModels y ejecute el siguiente comando:
python convertModel.py
El script mencionado anteriormente contiene valores codificados para el archivo pose_deploy_linevec_faster_4_stages_fixed_size.prototxt y el archivo modelo pose_iter_160000.caffemodel.
Podrían cambiarse a otro modelo, pero no olvide cambiar el archivo .prototxt para tener un tamaño fijo de la imagen de entrada:
input_dim: XXX: corresponde con la entrada NN.
input_dim: XXX: corresponde a la altura de la entrada NN.
Además , no olvide cambiar la configuración del modelo PoseModelConfigurationMPI15.inputSize a un valor de entrada especificado y use esta configuración en lugar de una existente en el marco que establece 512x512 como tamaño de entrada.
Cualquier valor funcionará, pero los mejores resultados podrían lograrse si una relación de aspecto coincide con la que tiene una imagen original. Además, debe tenerse en cuenta que los valores más grandes afectarán significativamente el rendimiento, que se muestra en la sección Rendimiento.
Detalles de salida de red neuronal
Echemos un vistazo más de cerca a la salida de NN. La salida del modelo MPI15 es un grupo de matrices con dimensiones (input_image_width / 8, input_image_height / 8)
. Cada elemento en la matriz tiene tipo flotante. Asignación entre el índice de matriz en la salida y la parte del cuerpo:
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"} };
Dado que cada matriz tiene un tamaño fijo para acceder a una en particular, es una lectura trifial por operación de desplazamiento: [Fondo] = NNOutput [sizeOfTheMatrix * 15]
Mapas de calor y PAF
Hay dos tipos de matrices de salida en el modelo MPI15. Los que representan mapas de calor y los otros que representan PAF. Cada matriz de calor corresponde a una parte de la unión que es 15 en total. Las matrices PAF representan conexiones corporales. Para cada conexión del cuerpo, hay una matriz X e Y que es 28 en total (14 + 14). La cantidad total de matrices, incluida una de fondo, es 44.
Proyecto de demostración
El repositorio del proyecto también contiene un proyecto de demostración 'poseDemo' que demuestra el uso del marco. Las matrices de resultados NN para una imagen de entrada particular se muestran a continuación:
El proyecto objetivo sería inútil sin mediciones de desempeño. Se ve claramente en los resultados a continuación que Apple hizo un tremendo aumento del rendimiento del motor NN en los últimos modelos. Además, según las predicciones del analista, Apple fabricará hardware NN aún más rápido en el próximo iPhone. Los resultados de las mediciones de rendimiento se muestran a continuación:
Tiempo para procesar un cuadro (1-2 personas en la vista)
Vale la pena mencionar que todos los números que se muestran arriba podrían variar para cada ejecución particular. Supongo que eso está sucediendo debido a la optimización interna de CoreML.
Fuentes de código
El enlace al repositorio de GitHub: haga clic para verificarlo
Aplicaciones
Es importante tener en cuenta que todas las aplicaciones mencionadas a continuación salieron de la cabeza y no han sido confirmadas oficialmente por Apple o alguna autoridad.
Cuidado de la salud
1) Detección de anomalías en la columna vertebral humana en imágenes fijas:

2) Guía de salud y fitness.
1) Detectar si hay personas en casa y verificar si todo el equipo está apagado (plancha / horno).
2) Ubicar personas dentro de la sala de estar y automatizar (encender luces / música / televisión)
Complementos para las aplicaciones de estudio de arte
1) Mapeo 2D -> 3D e inferir pose para reconstruir una pose 3D basada en la fuente 2D
Mejoras y desarrollos posteriores
Se pueden realizar varias mejoras para aumentar el rendimiento del paso de postprocesamiento y hacerlo más preciso. Además, podría ser interesante combinarlo con mapeo 2D-> 3D para reconstruir la pose 3D. La lista de posibles mejoras se muestra a continuación:
1) Optimización NMS. Una implementación de GPU paralela utilizando METAL API.
2) Use una aproximación diferente para la conexión de las articulaciones que esté más cerca de los huesos del esqueleto de la vida real. Los huesos no son rectos.
3) Implemente un filtrado más robusto para la pose de salida para deshacerse de los artefactos.
4) Implemente una estimación de pose en una transmisión de video
5) 2D -> mapeo 3D
Para aquellos que estén interesados en los antecedentes de este proyecto y Openpose, pueden encontrar información útil a continuación:
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/
Algo divertido
Siempre es interesante ver cómo funcionará la aplicación de tecnología con aportes inusuales. Algunos resultados divertidos se muestran a continuación. Tenga en cuenta cómo el NN predijo el pie donde está oculto de hecho:
Conclusión
En este artículo, se describe la aplicación de iOS para inferir la pose humana. Según los resultados de rendimiento, se ve claramente que Apple dio un salto gigante en el rendimiento del motor de red neuronal. Además, los próximos modelos de iPhone probablemente permitirán inferir en tiempo real. ¡Combinar eso con la reconstrucción de pose 2D-> 3D abre la posibilidad de inferir pose humana 3D en tiempo real en una transmisión de video!