01项目背景介绍1.1为啥要做人体姿势相似度识别
还是惯例讲下为啥要学习人体姿势相似度识别的背景,一方面让大家了解下我做这件事的原因,另一方面对于想借鉴该项目的小伙伴会有所帮助。因为年底了部门想搞一个活动,就是提前准备一些夸张搞笑的表情和姿势,然后大家来进行模仿,根据模仿的相似度来打分,分数越高对应的礼物越好,主要作用是增加活动的可玩性,带动更多的小伙伴参与进来。下面是表情和姿势的模仿效果图:
人体姿势相似度识别项目的目标其实非常简单,就是输入两张人体姿势的图片,输出姿势相似度的得分。经过调研,发现TensorFlow开源的PoseNet模型可以很好的满足我们的需求。下面是我们项目完成之后的效果图:
我们提供一张标准的瑜伽姿势图,也就是上图中蓝色衣服的图片。然后分别提供一张模仿的比较像(灰色衣服)和不像的(白色衣服)两张图片进行对比,灰色衣服是模仿的比较像的,所以相似度得分比较高在0.95以上,而白色衣服是模仿的不像的,所以相似度得分比较低仅在0.7左右。这就是项目目标和效果图说明。2.2项目整体流程
项目整体流程分成两步,第一步是基于Tensorflow的PoseNet模型识别出人体姿势,第二步就是计算两个人体姿势的相似度得分。下面会对两个步骤进行详细说明。2.3基于PoseNet算法识别人体姿势
2.3.1算法原理
只要你的电脑上安装了摄像头就可体验Tensorflow官方提供的PoseNet算法,下面是PoseNet算法的demo,有兴趣的小伙伴可以感受下,支持单目标姿势和多目标姿势,下面是体验demo的链接和体验效果图:
2.3.2人体姿势识别流程
人体姿势识别流程整体分成两步,第一步是将图片作为特征输入到CNN卷积神经网络中;第二步就是利用单姿势或多姿势解码算法输出姿势、姿势置信度得分、关键点位置以及关键点置信度得分。下面是PoseNet模型的姿势检测流程:
姿势、姿势置信度得分、关键点位置以及关键点置信度得分是PoseNet刻画人体姿势的重点,下面通过一张示例图进行详细说明:
模型输入主要包括以下四部分:
2.3.4模型输出
模型输出主要包括两大块,第一块是代表整体的姿势以及姿势的置信度得分,第二块则是代表部分的每个姿势的17个关键点位置以及对应的关键点置信度得分。下面是一个输出示例图:
通过上图输出示例可以看出这个姿势的整体置信度为0.6694,这个姿势包含17个关键点,每个关键点会有对应的名称、二维坐标位置以及关键点对应的置信度得分。比如第一个关键点是鼻子(nose),对应的置信度得分是0.8434,并且还会返回鼻子对应的二维坐标。2.4计算姿势相似度
上面是通过PoseNet模型如何得到人体姿势以及姿势包含的17个关键点流程。通过整体的姿势和局部的17个关键点我们就能很好的刻画人体的姿势。通过PoseNet算法我们可以分别拿到两张图片中人的姿势数据,接下来就是如何计算两个姿势的相似度问题。下面通过一个实际的例子进行说明。第一步先拿到两张图片对应的姿势pose1和pose2:
需要说明的是基于PoseNet算法对于图片中的每个人会返回17个关键点,这里为了简单说明仅选用其中三个关键点;第二步将姿势数据打平,得到每个姿势的坐标以及置信度得分:
因为有三个关键点,每个关键点包含二维坐标和置信度得分,将坐标位置向量打平就得到了6维向量vectorPose1XY,而置信度得分向量vectorPose1Scores是4维,其中前三维是三个关键点对应的置信度得分,最后一维是关键点打分的总和,比如2.5=0.9+0.9+0.7;第三步进行标准化操作:
标准化操作分成两阶段,第一阶段会分别对每个关键点的横坐标X和纵坐标Y进行如下操作,比如第一个姿势的第一个关键点对应的横坐标x1变成了(x1-x_min)/xy_max;第二个阶段则会进行L2规范化操作;最后一步就是根据得到的向量计算两张图片中姿势的相似度得分,主要是利用余弦相似度公式计算,姿势越相似,那么得分越高,最高分为1。03项目实战3.1借鉴开源项目
3.2开源项目存在的问题及解决策略
上述源码存在两个重要的问题,经过一番折腾,下面是解决的策略: