本文是人体关键点中非常经典的一篇文章:Stacked Hourglass Networks for Human Pose Estimation
论文地址:
https://arxiv.org/abs/1603.06937arxiv.org
代码地址:
wbenbihi/hourglasstensorlfowgithub.com
论文框图:
摘要:
正如论文名称所说,我们提出的网络是漏斗形状,通过多次对网路的上采样和下采样,我们在多个尺度上得到了人体关键点的位置特征。
method:
1:Hourglass Design
对于人体特征而言,我们既需要能够区*部特征如人脸和人手,又需要能够区分全身的特征,这就要求我们在图片的各个尺度上都能够捕捉足够多的特征,这也是我们漏斗网络设计的初衷。一种实现在各个尺度上都捕捉特征的方式是先单独地获得多个分辨率的特征,然后在网络后面几个阶段中将他们combine起来,而我们使用的是单个网络,网络分辨率最低能够降到4*4,然后通过skip connection来保持空间分辨率。
网络的backbone使用卷积层和max pooling层来实现分辨率的降低,在每一层max pooling之前,我们额外的接出一个分支,在其后接上更多的卷积层,当网络的分辨率到达最低尺寸之后,我们使用最近邻插值法来把小尺寸的特征进行上采样,然后和skip layer进行 elementwise addition。在得到最终的pixel级别的feature map输出之后,我们使用两个1*1的卷积层来得到最后的pixel wise的heatmaps。
2:Layer Implementation
我们也使用的经过验证非常有效的一些layer design,如残差结构和inception结构,以及使用多个小的卷积核来替代大的卷积核,如用2个3*3来替代一个5*5的卷积核,最终的layer结构如下:
由于在全部分辨率256*256上面进行计算需要太多的GPU资源,因此我们将最后的输出维度限制在了64*64的分辨率上。
3:Stacked Hourglass with Intermediate Supervision
就两点,多个网络叠加,将上一个hourglass的输出作为下一个hourglass的输入,同时对每个输出加一个中间监督信号,GT和最后一层监督信号的GT是一样的,图4中蓝色的feature map就是中间监督信号的heatmap,然后再将它用1*1的卷积核扩增channel,再加回原来的feature中去。
train:
数据集用的比较老的数据集,就不讲了。训练的GT还是用的2D的高斯核来生成的,loss使用的是MSE。
result:
作者特别指出了观察不同的层次的hourglass的输出结果,从左图可以看到第二层的输出在第八层里面得到了微调,更加精确了。从右图的评估指标也可以看到同一种颜色的层数越深,结果越好。