人体姿势评估
几个月前,我在互联网上遇到了一个有趣的开源项目-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结果矩阵如下所示:
没有绩效评估,目标项目将毫无用处。 在下面的结果中可以清楚地看到,在最后的型号中,Apple的NN引擎的性能得到了极大的提高。 而且,根据分析师的预测,苹果将在即将面世的iPhone中制造更快的NN硬件。 性能测量结果如下所示:
处理一帧的时间(视图中为1-2人)
值得一提的是,上面显示的所有数字对于每个特定的运行都会有所不同。 我认为这是由于CoreML内部优化而发生的。
代码来源
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实际上是如何预测脚被隐藏的位置的:
结论
在本文中,介绍了用于推断人体姿势的iOS应用程序。 根据性能结果,可以清楚地看到Apple在神经网络引擎的性能方面有了巨大的飞跃。 而且,下一代iPhone机型很可能将允许进行实时推断。 将其与2D-> 3D姿态重建结合在一起,就可以在视频流上实时推断3D人的姿态!