openpose tensorflow版本 原理+项目代码详解

1、训练数据 (很关键用于理解paf)

      训练数据集为coco,该数据集中包含了人体keypoint的坐标、类型信息。根据keypoint信息来生成part和paf的训练样本。

     part的训练样本:令S*j,k为person k的第j part的confidence map。xj,k为第k个人的第j个part的groundtruth坐标信息。对于S*j,k 位置p的value,如下定义:


     sigma是用来控制分布的参数,最终用于训练part的groundtruth confidence map是对各人的confidence map进行求最大操作。


     这样的话,如果有两个不同的人的相同关节比较靠近,它们的最大值也不会受到影响(因为最终是用非最大抑制(NMS)算法来获得峰值作为关节位置)。这样我们最终得到的groundtruth confidence map S* ∈Rw*h*19作为part的训练样本。其中包含18个part和1个背景。

     paf的训练样本:一共定义了19个连接,对于每一个连接,都包含了x方向和y方向的信息。令L*c,k∈Rw*h*2为person k的第c limb的groundtruth paf。该limb对应于part j1和part j2,对于L*c,k上位置p,如果p在limb c上,如下定义:

        L*c,k[xp,yp,2*c]=  (x2- x1)/ [ (x2- x1)2+ (y2- y1)2]1/2

           L*c,k[xp,yp,2*c+1]=  (y2- y1)/ [ (x2- x1)2+ (y2- y1)2]1/2

     如果p不在limb c上:

  L*c,k[xp,yp,2*c]= 0

     L*c,k[xp,yp,2*c+1]= 0

     最终用于训练paf的groundtruth paf是对各人的paf求平均。

      这样的话,如果有两个不同的人的相同limb重叠,在重叠部分求平均,可以兼顾遮挡limb和被遮挡limb的信息。最终获得的groundtruth paf L*c,k∈Rw*h*38作为paf 的训练样本。

     使用上述训练样本训练神经网络,最终网络输出结果的维度为w*h*57,包含了part heatmap和paf。

 

 

2、算法

算法包含以下四个步骤: 1、神经网络预测,2、找到关节,3、找到肢体连接,4、拼装肢体构成人。

     2.1神经网络预测:

openpose tensorflow版本 原理+项目代码详解_第1张图片

     图1:神经网络结构

     网络结构如图所示,首先通过vgg-19进行特征提取,然后通过两分支的多阶段CNN,第一分支用来预测confidence map St,第二分之用来预测PAFs Lt。在每个阶段之后,来自两个分支的预测以及图像特征被连接用于下一阶段。

     为了既增加感受野,同时局部不能模糊,原始图像以四个固定的scale缩放后进入神经网络,将四个预测值求平均。右膝盖与右小腿的在四个scale下的heatmap与paf如图所示:

openpose tensorflow版本 原理+项目代码详解_第2张图片

图2:右膝盖与右小腿的在四个scale下的heatmap与paf图

     这样,我们输入的是image∈R w*h*3,输出为heatmap_avg∈Rw*h*19 与paf_avg ∈Rw*h*38。

2.2找到关节:

     通过第一步,我们获得了关节的heatmap。这一步,要从heatmap提取关节的具体位置。应用非最大抑制(NMS)算法来获得heatmap中的峰值,值为置信度作为该part的score。输出为:

 all_peaks=[ [((h0, w0, s0,0),(h1, w1, s1,1),....]\  第一个part的所有值

              [((hi, wi, si,i),(hi+1, wi+1, si+1,i+1),....]\第二个part的所有值

               ..…

                   ]

2.3找到肢体连接:

     通过第二步,我们获得了关节的信息(位置,分数),这一步,用关节信息和paf来获得肢体连接。模型包含19个肢体,确定每一肢体所对应的两个part和paf,将两个part之间的paf信息进行积分所得结果作为该肢体的置信度。

     例如,要寻找所有的左上臂,已经有左肩和左肘part信息,以及左上臂的paf信息。将左肩中的所有part与左肘的所有part进行匹配,计算两个part间的paf信息的积分,作为该part相连的score。最后将所有score排序,来确定part之间是否相连。

     这样我们就获得了所有的连接信息,每一个连接都可以看作是一个肢体。

     2.4拼装肢体构成人

     在获得了所有肢体后,将拥有相同关节的肢体看作是同一个人的肢体

3、算法流程演示

     对该图像进行预测,图像的大小为(    427,640,3),运行时间:9.20s,其中,神经网络预测时间:4.55s,寻找关节:0.33s,寻找肢体连接:0.33s,拼装肢体:0.0027s。在coco验证集上运行模型,平均每张图像耗时1.47s。

3.1神经网络预测

           输入:image(hight,weitht,3)

           输出:heatmap_avg(hight,weight,19);paf_avg(hight,weight,38)

openpose tensorflow版本 原理+项目代码详解_第3张图片

图3:输入图像

3.2找到关节:

     输入:heatmap_avg(hight,weight,19)

     输出:all_peaks

     下图分别为右眼,右膝盖,所有关节。

openpose tensorflow版本 原理+项目代码详解_第4张图片openpose tensorflow版本 原理+项目代码详解_第5张图片
图5:右眼,右膝盖关节示意图

openpose tensorflow版本 原理+项目代码详解_第6张图片

图6:关节示意图

2.3找到肢体连接:

     输入:all_peaks,paf_avg

     输出:connection_all

 

 
  openpose tensorflow版本 原理+项目代码详解_第7张图片


       图7:右小腿paf图

openpose tensorflow版本 原理+项目代码详解_第8张图片
图8:右小腿连接图

2.4拼装肢体构成人

 

 

openpose tensorflow版本 原理+项目代码详解_第9张图片

图9:一个人连接图

 

openpose tensorflow版本 原理+项目代码详解_第10张图片

 

图10:多人连接图

 

下一篇文章中写了keras demo程序的详细解释,基本每句代码都注释了,方便理解。

你可能感兴趣的:(人体姿态估计,姿态估计)