人工智能之姿态估计OpenPose算法源码分析(vgg19,backbone,高斯热度图,单位向量叉乘,向量累加和后求平均,感受野,多个stage纠错)
一.数据集与路径配置解读
(1)
它的网络结构不算复杂,在训练时比较费劲(处理数据),因为我们关键要做好标签数据。在OpenPose算法中提到不仅需要知道关键点位置,还要进行高斯预测一下当前关键点是在那里,并且PAF中对于每一个点都要预测二个方向(x与y方向)的向量。所以本例中要先对18个关键点要做高斯标签。
上图中告诉我们有18个实际点的坐标位置,然后做高斯标注。在标签中标注出关键点后,我们还需要设计PAF来表示关键点之间的连接向量(这是GT),如果关键点是相交到一起时,连接这关键点时方向将如何进行?
(2)
标注数据一般用json格式
二.读取图像与标注信息
上图用的网络还是比较旧的,VGG19是由16层conv+3层FC组成。当然可以换成现在比较新并流程的网络来提特征等。
(1)__getitem__读取数据,主要包括读取图像与标注数据
三.关键点与躯干特征图初始化
筛选出标注信息后,继续往下就据标注得到GT:
上图方法是核心代码,它是由标注信息得到标签。直接进入这个方法中,如下图:
每个躯干到时候都要预测它的单位向量(即x与y二个方向),因为一个关键点(构成的特征图)没方向,那二个关键点(二张特征图)连接成的向量就有x与y方向了。所以上图中在LIMB_IDS值前面要乘以2变成38个了,也就是说到时候要预测38种躯干。
四.根据关键点位置设计关键点标签
(1)热度图(高斯)
channels_heat是19个,表示19个关键点。
paf是指躯干,2*19=38个特征图组成。
下面增加脖子:
结合有效标注信息对每个关键点生成热度图(高斯):
上图的accumulate_confid_map值是从下图中putGaussianMaps方法中的gaussian_map传入的,而gaussian_map又是前一次的heatmaps中得到,这就好像做递归一样:
五.准备构建PAF躯干标签
(1)遍历躯干列表
首先如果躯干有重叠的话,不是求和就行的,不像高斯关键点那种是累加就行,因为向量不是只累加就行,这里是要做平均,所以还要除以某个值,例如下图中两个手臂重合在一起,一个点是3.1,另一个点是2.9,那它的平均值就是(3.1+2.9)/2=3,如下图:
它本身是19个躯干的,但每种躯干都要构建2个方向的向量(x与y方向),所以就是19*2=38个躯干。
六.各位置点归属判断
现在进入putVecMaps方法中,
对差乘再做解释,其实它的平行四边形是要要求的,是要经过垂直于向量的垂线组成的四边形,如下图所示:
七.特征图各点累加向量计算
八.完成PAF特征图制作
上图中除法就是说原来计算出来的特征值加上当前关键点的特征值后做除法得到平均值,这就是躯干上点重合后的向量计算的关键之处。
至此(5)-----(8)就把躯干标签就做好了,(3)-----(4)是做关键点的高斯标签。这里代码主要就是做标签比较难,只要把标签做好后,就传入网络模型预测特征图,做回归任务就完了。
九.网络模型一阶段(stage1)输出
姿态估计中特征图感受野越大也许效果越好,它可不断纠错。
下面开始看一下网络结构模型,它是通过多个stage来不断优化关键点位置的,如下图:
out1就是上上图中的刚输入进来比较清晰的图像。
十.多阶段输出与预测
(1)多阶段输出
这时可以把经过多阶段(stage)的步骤后输出最终的结果,最后算它们的损失。
(2)预测
在linux环境中先执行make文件中的命令(window环境下可能有问题)进行编译,例如下图:
执行picture_demo.py文件做预测,最后就会输出一张新的图片,它就会把每个人的关键点,躯干动作连接起来,如下图:
在实际项目中肯定要用openpose编译好(有点难度)来预测。