针对iOS图像的人体姿势评估

人体姿势评估


几个月前,我在互联网上遇到了一个有趣的开源项目-Openpose,其目的是实时估计视频流上的人体姿势。 由于我的专业活动,我很想在Apple的最新iOS设备上运行它,以检查性能并确定是否可能。 有趣的是,过去几年来,iOS的神经网络框架的性能发生了怎样的变化。


原始的Openpose项目是用C ++编写的,并且不使用CoreML(iOS上的神经网络框架)。 因此,我不得不重新编写Swift的核心部分,并使用CoreML进行推断。 让我们看一下下图,以如何表示人体:



有关人体姿势模型的更多信息,请参见: MPI-pose


结果如下图所示:


为了演示的目的,我自己拍摄了照片)在原始图像上得出的人体姿势估计值

准备模型


要开始使用该框架,需要创建Core ML模型。 该模型基于openpose项目中的一个模型。 要准备模型,请执行以下步骤:
1)安装Python和CoreML工具
2)从Open Pose中运行models / getModels.sh以获取原始的openpose模型
3)将模型/pose/mpi/pose_deploy_linevec_faster_4_stages.prototxt复制到模型/pose/mpi/pose_deploy_linevec_faster_4_stages_fixed_size.prototxt
4)在文件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)创建一个指向models目录的链接。 假设pose框架项目和openpose项目位于主目录中,那么用于创建链接的命令将如下所示:


ln -s ~/openpose/models ~/models


6)转到〜/ pose / pose / CoreMLModels并运行以下命令:


python convertModel.py


上面提到的脚本包含对文件pose_deploy_linevec_faster_4_stages_fixed_size.prototxt和模型文件pose_iter_160000.caffemodel的硬编码值。
可以将它们更改为其他模型,但是请不要忘记将.prototxt文件更改为具有固定大小的输入图像:
input_dim:XXX-对应于NN输入的with。
input_dim:XXX-对应于NN输入的高度。
同样不要忘记将模型配置PoseModelConfigurationMPI15.inputSize更改为指定的输入值,并使用此配置,而不是将512x512设置为输入大小的框架中的现有配置。


任何值都可以使用,但是如果宽高比与原始图像的宽高比匹配,则可以获得最佳结果。 此外,应考虑到较大的值将显着影响性能,如“性能”部分所示。


神经网络输出详细信息


让我们仔细看看NN的输出。 MPI15模型的输出是一组矩阵,其尺寸为(input_image_width / 8, input_image_height / 8) 。 矩阵中的每个元素都有浮点类型。 输出中的矩阵索引与主体部分之间的映射:


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

由于每个矩阵都有固定的大小,因此访问特定的矩阵是通过偏移量运算读取的小事:[Background] = NNOutput [sizeOfTheMatrix * 15]


热图和PAF


MPI15模型中有两种类型的输出矩阵。 一个代表热图,另一个代表PAF。 每个热矩阵对应一个关节部分,共15个。 PAF矩阵表示身体连接。 对于每个身体连接,都有X和Y矩阵,它们总共为28(14 + 14)。 包括背景在内的矩阵总数为44。


示范项目


该项目的存储库还包含一个演示项目'poseDemo',用于演示框架的用法。 特定输入图像的NN结果矩阵如下所示:


样例图片
人体姿势结果:热图合并为一张图像。 每个关节都有自己的颜色:
PAF合并为一张图像:所有候选热图。 每个候选者都有自己的置信度,它定义了图像的不透明度:
仔细查看对应于头部的候选热图:仔细查看对应于颈部的候选热图:
对应于头颈部连接候选者的PAF矩阵。 图像上还显示了头部,颈部的热图关节:对应于LShoulder,LElbow连接候选者的PAF矩阵。 图中还显示了LShoulder-LElbow热图接头。

性能表现


没有绩效评估,目标项目将毫无用处。 在下面的结果中可以清楚地看到,在最后的型号中,Apple的NN引擎的性能得到了极大的提高。 而且,根据分析师的预测,苹果将在即将面世的iPhone中制造更快的NN硬件。 性能测量结果如下所示:


处理一帧的时间(视图中为1-2人)


Nn输入大小iPhone XR(毫秒)iPhone 8(毫秒)iPhone 5S(毫秒)
核心语言
512 x 512190367020801
256 x 2567010397162
后处理
512 x 5121967100
256 x 256535
合计
512 x 512219373720901
256 x 2567510747200

值得一提的是,上面显示的所有数字对于每个特定的运行都会有所不同。 我认为这是由于CoreML内部优化而发生的。


最终的姿势取决于NN输入大小(越小越快,结果的准确性越差)


512 x 512256 x 256

代码来源


GitHub存储库的链接: 单击以进行检查


应用领域


重要的是要注意,下面提到的所有应用程序都是凭空提出的,并且未得到Apple或某些权威机构的正式确认。


医疗保健


1)在静止图像上检测人的脊柱异常:

2)健康健身指南。



1)检测家里是否有人,并检查所有设备是否都已关闭(熨斗/电)。
2)在居住区域内安置人员并进行自动化(打开灯光/音乐/电视)


Art Studio应用程序的插件


1)2D-> 3D映射和姿势推断可基于2D源重建3D姿势


改进和进一步发展


可以进行一些改进以提高后处理步骤的性能并使其更加精确。 同样,将其与2D-> 3D映射结合以重建3D姿态可能会很有趣。 可能的改进列表如下所示:
1)NMS优化。 使用METAL API的并行GPU实现。
2)对关节连接使用不同的近似值,使其更接近真实的骨骼骨骼。 骨头不直。
3)对输出姿势实施更强大的过滤,以消除伪影。
4)在视频流上实现姿势估计
5)2D-> 3D映射


深入的信息


对于那些对本项目的背景和Openpose感兴趣的人,可以在下面找到有用的信息:
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/


一些乐趣


看到技术应用如何在异常输入下工作总是很有趣的。 一些有趣的结果如下所示。 请注意,NN实际上是如何预测脚被隐藏的位置的:


图片取自Magic Poser

结论


在本文中,介绍了用于推断人体姿势的iOS应用程序。 根据性能结果,可以清楚地看到Apple在神经网络引擎的性能方面有了巨大的飞跃。 而且,下一代iPhone机型很可能将允许进行实时推断。 将其与2D-> 3D姿态重建结合在一起,就可以在视频流上实时推断3D人的姿态!

Source: https://habr.com/ru/post/zh-CN458000/


All Articles