openpose学习

openpose过程分析

Openpose是一种botton-up的方法,就是对于一张图片,首先找到图像中的所有人的所有点,然后再对这些点进行匹配连接,让同一个人的点进行相连,具体过程如下图:

openpose学习_第1张图片

OpenPose的pipeline主要有两个部分:

**** 在inference阶段,输入图像,输出两个tensor,分别是关键点的heatmap和关键对应的连接关系(part affinity field, paf),这些输出的heatmap都是只有原图的8分之一。
****根据keypoint和paf的heatmap,提取所有的keypoint点,并将这些keypoint点进行分组,将同一个人的所有关键点分配到当前人上。
在OpenPose中,backbone就是使用的VGG19前4个block,然后在后面添加两个额外的卷积。backbone提取特征后,紧接着一个initial stage,这部分有两个branch,分别对应生成keypoint heatmap和PAF heatmap,再后面就跟着5个refinement stage,目的是为了进一步生成更加精确的heatmap。

openpose学习_第2张图片

上表描述的不同个数的refinement stage对精度AP和运算量的影响,观察可以发现,其实在使用一个refinement stage后,性能就已经达到了43.6,使用5个stage性能为48.6,性能提升并不显著,但运算量却增加了一倍,因此lightweight openpose的作者就只使用了一个refinement stage。

LightWeight openpose

backbone:
作者并没有使用VGG作为backbone了,而是使用MobileNet。但是作者发现单纯的直接使用MobileNet效果并不好,效果不好的原因是MobileNet网络结构不够深,所以感受野不够大。为什么感受野不大就会影响性能,个人分析主要有两个方面原因:一是我们在回归一个骨骼点时,不仅仅要关注骨骼点附近的情况,还应该关注更大的范围,这样才能较少误报;二是因为本身骨骼点的回归,肯定是能够学到一定的骨骼连接结构信息的,这也是为什么有时候明明骨骼点被遮挡了,但是网络仍旧能够定位到这个点的原因。为了解决因为感受野太小而造成的效果不好,作者通过使用空洞卷积(dilated convolution)来提升感受野。

refinement stage:

在openpose中,为了生成keypoint heatmaps和paf,其构造了两个branch,一个branch用来生成keypoint heatmap,一个用来生成PAF,并将这个生成heatmap的步骤称为refinement stage。

在本文的lightweight openpose,也有refinement stage,但在实现上又有两点改进:

openpose学习_第3张图片
1.如上图左,为原始openpose有两个prediction branch,两个branch的结构是一样,只是在输出阶段,获得不同的数量的输出结果,在lightweight openpose中(如上图右),其将两个branch合并成一个,只是在输出阶段才使用11的卷积分支出两个branch,从而获得两个结果输出。
openpose学习_第4张图片
2.如上图,将原来的7
7卷积替换成11,33,33的卷积级联,为了让这个级联结构与77的卷积核有同样的感受野,在最后一个3*3的卷积中,使用dilation=2的空洞卷积,另外,对与上图中的每个block,还使用了residual connection结构。

问题:OpenPose在refinement阶段的输出,会将两个branch的结果进行channel stack,为何不直接在开始的时候就只使用一个branch呢?对于7×7的卷积,我们都知道越大的卷积核,计算量也就越大,就感受野的大小来看,3个33的卷积等价于一个77的卷积,但是计算量却少了很多,因此使用小的卷积核代替大的理所当然。

总结:

lightweight openpose具体改进的有三点:

  1. 特征backbone部分使用带空洞卷积的mobilenet结构代替原来的VGG结构
  2. 将openpose的两个branch合并成一个branch,只在输出再分叉出两个输出
    3.使用作者提出的带空洞卷积的block结构代替7*7卷积

转载:https://zhuanlan.zhihu.com/p/56010675

你可能感兴趣的:(深度学习,Python,openpose,人工智能,深度学习)