训练数据集为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。
算法包含以下四个步骤: 1、神经网络预测,2、找到关节,3、找到肢体连接,4、拼装肢体构成人。
2.1神经网络预测:
图1:神经网络结构
网络结构如图所示,首先通过vgg-19进行特征提取,然后通过两分支的多阶段CNN,第一分支用来预测confidence map St,第二分之用来预测PAFs Lt。在每个阶段之后,来自两个分支的预测以及图像特征被连接用于下一阶段。
为了既增加感受野,同时局部不能模糊,原始图像以四个固定的scale缩放后进入神经网络,将四个预测值求平均。右膝盖与右小腿的在四个scale下的heatmap与paf如图所示:
图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拼装肢体构成人
在获得了所有肢体后,将拥有相同关节的肢体看作是同一个人的肢体
对该图像进行预测,图像的大小为( 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)
图3:输入图像
3.2找到关节:
输入:heatmap_avg(hight,weight,19)
输出:all_peaks
下图分别为右眼,右膝盖,所有关节。
图6:关节示意图
2.3找到肢体连接:
输入:all_peaks,paf_avg
输出:connection_all
![]() |
图7:右小腿paf图
2.4拼装肢体构成人
图9:一个人连接图
图10:多人连接图
下一篇文章中写了keras demo程序的详细解释,基本每句代码都注释了,方便理解。