当前位置:   article > 正文

堆叠沙漏网络(stacked hourglass network)

堆叠沙漏网络

最近一直在准备3D人体重建的项目,所以在这里记录一下对hourglass net的一些浅显的理解。

本文将以SHN来表示来表示stacked hourglass network。SHN在人体姿势预测(human pose estimation)效果很好。也常常被用到和SMPL相关的项目的当中,比如SMPLR。
hourglass 网络可以在像素级的精度上来预测RGB图片中人体关节的位置,使用SHN的效果大致如下所示,
在这里插入图片描述

计算机视觉领域,我们会发现使用一般的CNN网络结构就可以很好的对物品进行分类,也就是说,计算机知道该图片中有什么,但是不知道这个东西在哪里,因为在CNN所输出的feature map中包含了很少的空间信息(spatial information),而想要精准的定位人体的关节,不仅仅需要让计算机知道以照片里有什么,还需要让他知道这个东西在哪里。

hourglass network,顾名思义,这个网路的形状就很想一个沙漏。网络的形状如下图:
在这里插入图片描述
整个网络包含了一下几个组成部分:

  • convolutional layers
  • pooling layers
  • residual layers
  • bottleneck layers
  • upsampling layers

首先卷积层的作用一定是提取输入图像的 feature map,将输入的RGB图像进行分解。最大池化层的作用可以理解成是选取在feature map中哪些地方对于预测重要,哪些地方对于预测不重要,经过池化层之后的图片进一步变小。残差层是hourglass 网络的非常重要的组成部分,这个网络在很大程度上是基于残差模块的。残差层的作用是将网络前面的层的输出向后传递。然后bottleneck layer其实本质上也是一种residual。只不过,bottleneck layer 改变了卷积的形式,将两个3x3的核,变成了1x1,3x3,1x1三个核的组合。使用较小的核可以节约不少的计算机内存。最后的upsampling层使用 the nearest neighbor 的技术来填充已经被缩小到预设值的图片,直到图片和原输入图片的大小一致。

知晓了网络每一层的具体作用之后,现在可以来大致的记录一下网络的具体工作流程和每一层的具体细节。hourglass network 本身其实可以理解成是一个encoder-decoder的结构,encoder最大程度的提取图像在每一个scale的特征以及空间信息(spatial information),decoder则是将网络在不同分辨率下提取的特征进行综合,最后得到一个与输入图像大小一致的heatmap。值得注意的是,很多情况网络会以一个或者多个全连接成作为最后的输出层,但是hourglass 网络使用了一个1x1的卷积层来代替了全连接层,这样做的目的是为了让网络可以接受不同维度的输入。

首先,网络对输入图片的尺寸大小是有要求的。论文中规定的图片输入大小是64x64大小的图片。由于训练量巨大,若图片的尺寸很大,那么对计算机内存就会产生很大的压力。每当图片进过一次最大池化层的时候,网络都会分成两个分支,一个分支是将当前池化层的输出继续向后传递,另一个分支则将当前池化层的输出传给一个bottleneck layer, 可以理解成网络是在保存当前层的输出。当输入图片从encoder端输出的时候,该图片的大小只有4x4了,然后也生成了4个不同scale的feature map。值得注意的是,stacked hourglass network 使用的是 immediate supervision,因为它是由很多个hourglass network组合而成,在每一个hourglass network输出之后就计算损失,而不是到跑完所有的hourglass networks都跑完之后在计算损失。

接下来记录一下网络每一层的具体结构
在这里插入图片描述
第一层与其他三层有些也的不同,当输入图片之后,会经过一个7x7的卷积核,batchnorm还有一个relu激活函数,然后过了bottleneck layer之后,网络分成两路,一路继续提取feature map,一路保存当前尺寸的特征图,留给以后的层时候,这样做的目的是为了尽可能的保存多的不同scale中的空间信息。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最后一层的输出层没有现在是在论文给出的图中,但是前向提到了,他是一个1x1的卷积层,它的结构如下图所示:
在这里插入图片描述

可以看到的是输入到下一个hourglass net的是原始的输出加上当前hourglass net的损失,意思是下一个hourglass 网络将在一定程度上基于上一个网络的损失进行训练,这也是为什么residual 模块对于 stacked hourglass 网络很重要的原因之一。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号