openpose的细节处理

来源:互联网 发布:蒙特卡洛算法 编辑:程序博客网 时间:2024/05/24 01:50

最近使用openpose,但是有一些细节论文中没有给出,还有一些不太重要但也挺关键的细节需要搞清楚,这篇文章就把用到的这些细节一并及下来。

1 VGG基础网络的输入输出
论文中说vgg基础网络用到了前10层,但是看源码的话,他是用了12层的。
相关的输入输出维度如下:
vgg_cfg = [64, 64, ‘M’, 128, 128, ‘M’, 256, 256, 256, 256, ‘M’, 512, 512, 256,128]
12层的vgg输出维度为128

2 后面stage中分支结构的输入输出
首先,论文中很明确的将地一个stage和其他的分开来看的。
分支中输出维度38的是PAF,part affinity field
维度19的是身体部位的热图part heatmap
branches_cfg = [[[128, 128, 128, 512, 38], [128, 128, 128, 512, 19]],
[[128, 128, 128, 128, 128, 128, 38], [128, 128, 128, 128, 128, 128, 19]]]

3 输入图片的尺寸处理
训练时需要相同大小的图片才能组成一个batch,在openpose中有两种做法:
一是直接resize到指定大小的尺寸;
二是源码提供了一种稍微有特色的做法:
先指定长和宽x,y。然后将图片的长/宽和x/y比较,看是否大于1
然后,选择长一些的边(长>x?,宽>y?),固定长宽比缩放到给定尺寸
再然后,为另一条边加padding,两边加相同的padding
最后,resize到制定大小。

4 怎么处理预测图尺寸和输入真实值尺寸不匹配的问题
一种方式是de-convolution到原来的大小
二是源码中指出的方法,因为是只有base net中有图片缩放的过程,在vgg结构中,有三次pooling过程,所以缩放比例是8,将resize后的mask淹膜图片和PAF以及身体部位heatmap三者都缩放8倍。
因为本身有一个核函数处理过程,所以也不用特别要求达到像素级别的精度,反正缩放过程中最大值丢不了。
另外,因为这儿有8倍关系,所以resize的时候要选择一个合适的长与宽,实际上,源码中强制转成16的倍数。

5 为什么输出结果维度是38和19
因为coco的身体part有17个,openpose加了一个颈这个part所以有18个heatmap,再加一幅背景图片,身体部件的热点图应该是19个。
而这些点所连接的边,组成一个人体的骨骼图,一共有19条,但为什么是38个呢。
openpose中的PAF需要表示大小和方向,所以源码中给出的是相应边向量在x和y上的分量,每条边都有,所以是38维。

评价:
越深入神经网络,越觉得神奇。像openpose就是给了一个模板,让神经网络自己去学习去适应,得出一个相似的模板。
SSD中也是让网络自己去学习怎么得到一个合适的检测框。
这些网络都是对过程没什么严格的要求,就是设定想要的模板的时候需要用心,然后在网络中取出构建这种模板的连接线——模板的输入。剩下的就交给了网络。
不过这种逻辑蛮奇怪的,是连接在先,还是模板在先,哪个对作者的启发更大呢。

原创粉丝点击