2D人体姿态估计 - Stakced Hourglass Network(SHN)个人理解

Stacked Hourglass Networks for Human Pose Estimation

中文翻译

An Intuitive Explanation of Convolutional Neural Networks – the data science blog

https://github.com/princeton-vl/pytorch_stacked_hourglass】 

一、残差网络(ResNets)与残差块(Residual block)

非常深的神经网络是很难训练的,因为存在梯度消失和梯度爆炸问题。跳跃连接(Skip connection)可以从某一层网络层获取激活,然后迅速反馈给另外一层,甚至是神经网络的更深层。利用跳跃连接构建能够训练深度网络的ResNets,有时深度能够超过100层。ResNets是由残差块(Residual block)构建的.

1.1 Residual block

上图是一个两层神经网络。计算过程:

残差网络中有一点变化:

如上图的紫色部分,我们直接将a^{l}向后,到神经网络的深层,在ReLU非线性激活函数前加上a^{l},将激活值a^{l}的信息直接传达到神经网络的深层,不再沿着主路进行,因此a^{l+2}的计算公式为:

加上a^{l}后产生了一个残差块(residual block)。插入的时机是在线性激活之后,ReLU激活之前。除了捷径(shortcut),你还会听到另一个术语“跳跃连接”(skip connection),就是指a^{l}跳过一层或者好几层,从而将信息传递到神经网络的更深层。

 residual block有两种形式,一种叫BasicBlock,一种叫Bottleneck

 

 

右侧为Bottleneck Block,使用了1×1卷积层。如输入通道数为256,1×1卷积层会将通道数先降为64,经过3×3卷积层后,再将通道数升为256。1×1卷积层的优势是在更深的网络中,用较小的参数量处理通道数很大的输入。

在Bottleneck Block中,输入输出通道数均为256,残差基础块中的参数量是:

与BasicBlock比较,使用1×1卷积层,参数量减少了。当然,使用这样的设计,也是因为更深的网络对显存和算力都有更高的要求,在算力有限的情况下,深层网络中的残差基础块应该减少算力消耗。

 二、Hourglass 的Residual Module

借助于残差网络的思想,也是整个网络最基础的模块,如下图所示:

第一行为卷积路,由三次卷积操作串联而成,间插有Batch Normalization(浅蓝)和ReLU(浅紫);
第二行为跳级路,只包含一个1x1的卷积层,负责改变输入的通道数,以便与第一行的卷积结果相加;如果跳级路的输入输出通道数相同,则这一路为单位映射
所有卷积层的步长为1,pading为1,不改变数据尺寸,只对数据深度(channel)进行变更。
因此Residual Module只由两个参数控制:输入深度M和输出深度N,而与图片尺寸H和W无关。

作用:残差模块提取了较高层次的特征(卷积路),同时保留了原有层次的信息(跳级路),不改变数据尺寸,只改变数据深度,也解决了反向传播时可能存在的梯度消失问题。

三、Hourglass

 网络的编解码器结构使它看起来像一个沙漏,因此被称为“hourglass networks”

Hourglass网络图

 如上图,hourglass 网络是个递归的结构,输入从左到中间,维度增加,特征map的大小变小,从中间到右,维度减少,特征map变大。整个结构是C1中嵌套C2,C2中嵌套C3,C3中嵌套C4,C4后面单独说明,C5,C6, C7是residual模块串联,总网络是4层的嵌套。

相对于从左侧输入C1产生两个分支,上部分支即C1a(skip connection),下部分为卷积分支进入C2,作为C2输入,C2同样分为两个分支,上部分支即C2a(skip connection),下部分卷积分支进入C3,作为C3输入。

c4b网络层,是由c7和c4a合并来的,这里有两块操作:
(1)c7层通过上采样将分辨率扩大一倍,上采样相当于pool层的反操作,为了将feature map的分辨率扩大,比如c7的kernel size为 4x4 ,那么上采样后得到的kernel size 为 8x8 。
(2)c4a层与c4层的大小保持一致,可以看作是c4层的“副本”,它的kernel size 是c7的两倍,刚好与被上采样后的c7大小一致,可以直接将数值相加,那么就得到了c4b

  

  最近邻上采样(图源 cs231n)

Transposed Convolution(图源 cs231n) 

用python伪代码写下来上述操作如下:

c7_up = up_sample(c7)   #   1x4x4x256 -> 1x8x8x256
c4_a = residual(c4)     #   1x8x8x256 -> 1x8x8x256     
                        #   c4_a相当于c4的副本,但是经过了一个residual处理
                        #   后面会解释这个操作,这里可以简单理解为复制了一份c4 
c4b = c4_a + c7_up      #   1x8x8x256

接下来就是c3b这个网络层,同样的,先对c4b进行上采样,然后与c3a合并,python伪代码如下:

c4_up = up_sample(c4_b)     #   1x8x8x256 -> 1x16x16x256
c3_a = residual(c3)         #   1x16x16x256 -> 1x32x32x256     
c3b = c3_a + c4_up          #   1x16x16x256

这样将feature map层层叠加后,最后一个大的feature map - c1b 既保留了所有层的信息,又与输入原图大小,意味着可以通过1x1卷积生成代表关键点概率的heat map ,上图中并未画出该部分

四、Hourglass子网络

Hourglass是本文的核心部件,由Residual模块组成。根据阶数不同,有不同的复杂程度。

4.1 一阶Hourglass



上下两个半路都包含若干Residual模块(浅绿),逐步提取更深层次特征。但上半路在原尺度进行,下半路经历了先降采样(红色/2)再升采样(红色*2)的过程。
降采样使用max pooling,升采样使用最近邻插值。
注:另一种进行升采样的方法是反卷积层(Deconv)

4.2 二阶Hourglass

把一阶模块的灰框内部分替换成一个一阶Hourglass(输入通道256,输出通道N),得到二阶Hourglass:

两个层次的下半路组成了一条两次降采样,再两次升采样的过程。两个层次的下半路则分别在原始尺寸(OriSize)和1/2原始尺寸,辅助升采样。

4.3 四阶Hourglass

本文使用的是四阶Hourglass:

每次降采样之前,分出上半路保留原尺度信息;
每次升采样之后,和上一个尺度的数据相加;
两次降采样之间,使用三个Residual模块提取特征;
两次相加之间,使用一个Residual模块提取特征。
由于考虑了各个尺度的特征,本文不需要像CPM3方法一样独立地在图像金字塔上多次运行,速度更快。
作用:n阶Hourglass子网络提取了从原始尺度到尺度 1 / 2 n 1/2^{n} 1/2n的特征。不改变数据尺寸,只改变数据深度。

五、Stacked Hourglass 完整网络结构

多个N阶Hourglass结构堆叠在一起,组成了一个完整的Stacked Hourglass结构,如下图:

其中,N1代表第一个Hourglass结构,提取出的混合特征经过1个1x1的全卷积网络后,分成上下两个分支,上部分支继续经过1x1卷积后,进入下一个沙漏网络。下部分支先经过1x1卷积后,生成Heat Map,就是图中蓝色部分。上图中蓝色方块比其他三个方块要窄一些,因为Heat Map矩阵的通道数就是预测的人体关键点个数,设为 [64, 64, N_Landmark],而其他几个黑色方块的深度只是代表特征的通道数,如 [64, 64, 256]。
Heat Map继续经过1x1卷积,将通道数调整到与上部分支一致,如256,最后与上部分支合并,并与上一层N1的输入一起作为下一个沙漏网络的输入。

 内部细节如下图:

其中Conv_1就是Heat Map,shape为[64,64, N_Landmark],每一个通道表征了某一个关节点在每个像素点存在的概率。可以看到下一层Hourglass结构的输入,由之前说过的三部分相加得到,最后一层Hourglass结构的输出就是其Conv_1的结果。

上图就是各个关节点的Heat Map,左边第一张为输入图像以及最终的预测关节点位置,第二张为负责颈部节点的通道所预测的概率结果,红色和黄色代表着对应像素位置是颈部的概率很高,其他蓝色区域意味着这里几乎不会是颈部位置。之后的几张分别表示Heat Map的不同通道所预测的不同节点的概率结果。

5.1 关节点间的相互参考

既然单独的Hourglass结构已经可以输出Heat Map进行预测,为什么还要采用堆叠的方式?
在人体关键点检测任务中,关节点之间是可以互相参考预测的,即知道双肩的位置后,可以更好的预测肘部节点,给出腰部和脚踝位置,又可以用于预测膝盖。其他姿态估计文章有利用图模型(Graphic Model)来结合CNN做预测的,这个图模型就是对人体关节点的结构做抽象归纳。但是目前的图模型效果一般。既然热力图代表了输入对象的所有关节点,那么热力图就包含了所有关节点的相互关系,可以看作是图模型以将第一个沙漏网络给出的热力图作为下一个沙漏网络的输入,就意味着第二个沙漏网络可以使用关节点件的相互关系,从而提升了关节点的预测精度

5.2 一级网络


以一个Hourglass(深绿色)为中心,可以从彩色图像预测K个人体部件的响应图:

原始图像经过一次降采样(橙色),输入到Hourglass子网络中。Hourglass的输出结果经过两个线性模块(灰色),得到最终响应图。期间使用Residual模块(浅绿)和卷积层(白色)逐步提取特征。
更正:两个Linear应该是卷积操作,输出应该是H/4W/4K。

5.3 二级网络

本文使用的完整网络包含两个Hourglass:

对比上图,二级网络重复了一级网络的后半结构。第二个Hourglass的输入包含三路:

(上图绘制有点问题,没有体现三路合并,可以参看下图)

  1.      第一个Hourglass的输入数据
  2.     第一个Hourglass的输出数据
  3.     第一级预测结果

    这三路数据通过串接(concat)和相加进行融合,它们的尺度不同,体现了当下流行的跳级结构思想。对于H×W×3的输入图像,每一个hourglass级都会生成一个H/4×W/4×K的响应图。对于每个响应7

  • 八级Hourglass Networks

在整个网络中,作者共使用了8个hourglass模块,这些hourglass模块的权重不是共享的,并且所有的模块都基于相同的ground truth添加了损失函数。

对于不同的Hourglass Module,中继loss是单独计算的,这样使得后面的Hourglass Module能够更好地再评估。

  • 逻辑关系

模块从底层到顶层的关系式:

Residual Module -> 一阶Hourglass Module -> 高阶Hourglass Module -> 单级Hourglass Networks -> Stacked Hourglass Networks

模型亮点

  • 使用模块式网络设计
  • 采用先降采样,再升采样的结构
  • 借鉴resnet思想,使用跳级链接(skip connection)辅助升采样
  • 中继监督训练(intermediate supervision)

5.4、中间监督学习(intermediate supervision)

在上文中我们主要讲述了Hourglass模块,我们也知道实际上,stacked Hourglass网络是堆叠了多个Hourglass模块,前一个模块的输出作为下一个Hourglass模块的输入。通过这样的架构,才实现了文章最一开始提到的不断重复进行自上而下,自下而上的推断机制,通过这种机制从而能够重新评估整张图像的初始估计和特征。

而这种推断机制的关键就是对中间层生成的heatmaps计算loss。为什么中间监督那么关键?这是因为当通过每个Hourglass模块时,网络都将有机会在局部和全局上下文中处理特征,然后生成预测。 随后的Hourglass模块允许这些高级特征再次被处理,以进一步评估和重新评估更高阶空间关系。 这与其他采用多个迭代阶段和中间监督下表现出色的姿态估计方法相似。

既然中间监督这么关键,那中间监督的位置放在哪里合适呢?首先我们知道,大多数高阶特征只会在比较低的分辨率时才会出现,除非是在上采样发生时的最后。如果把监督放在网络上采样后,那就没有办法在更大的全局上下文中相对重新评估这些特征。如果希望网络能够做出最好的预测,那这些特征就不能在一个局部上下文中进行预测。局部和全局线索被整合在每个Hourglass模块中,而让网络进行早期预测需要它对图像有一个高层次的理解的形象,即使这只是整体网络的一部分。自底向上、自顶向下处理的后续阶段允许更深层次的处理。

这种在尺度之间来回切换的方法尤其重要,因为保留特征的空间位置对完成最后的定位步骤至关重要。关节点的精确位置是其它决定不可缺少的线索。对于像姿势检测这样的结构化问题,输出是许多不同特性的相互作用,这些特性应该结合在一起,形成对场景的连贯理解。

由下图可以看到中间监督的位置:

中间监督过程的说明

我们通过一个额外的1x1卷积将中间预测映射到更多的通道,从而将它们重新集成到特征空间中。这些来自前一个Hourglass模块的特征输出被添加回来自当前Hourglass模块的中间特征。结果输出直接作为下一个Hourglass模块的输入,生成另一组预测。 在最终的网络设计中,使用了8个Hourglass模块。 值得注意的是,这8个Hourglass模块的权重不是共享的,损失适用于所有Hourglass模块的预测并使用相同的ground truth。

六、与Resnet/Densenet的联系与区别

  1. Resnet
  • 相同点

这篇文章借鉴了Resnet的跳级连接思想,这有助于训练过程中计算梯度的反向传播,使得网络深度可以大大提高。

跳级连接(skip connection)思想主要体现在:

- 单个Residual Module的实现与Resnet类似
- 一阶Hourglass Module分为两个支路,一路采用沙漏型结构,一路采用单个Residual Module
- 中继监督也体现了跳级连接的思想
  • 不同点

Stacked Hourglass Networks采用了先降采样再升采样的方式,提取不同层次的特征,并利用跳级连接和中继监督重用特征。Resnet中没有利用前级网络帮助升采样,结合不同分辨率特征的思想。

2. Densenet

  • 相同点

与Resnet相比,都进一步重用了特征。

  • 不同点

Densenet利用所有层之间的相互连接来重用特征,而Stacked Hourglass Networks利用前级特征来帮助升采样恢复图像来重用特征。

个人理解:

具体以人体特征来说,SHN要解决两个主要的问题:

1、图像特征具有尺度性。即在通过CNN提取特征时,每个分辨率下提取不同的特征,或者说每个特征具有不同的尺度性。例如一个树整体特征需要在低分辨率下提取,而树的叶子特征需要高分辨率特征提取。

2、特征的空间关系性。也就是说各个不同的特征在空间上是具有联系的,这是进行姿态估计的重要依据。姿态本身就是不同部件在空间上的不同布局关系。

 

SHN网络在图像的各个尺度上捕获并整合信息,通过端到端连续地将多个houorglass模块放置在一起来扩展单个houorglass。允许跨尺度的重复bottom-up、top-down的推断,并与中间监督的使用相结合,实现最终的重复的双向推断。

此文基础是Joint training of a convolutionalnetwork and a graphical model for human pose estimation (中文翻译)[15]

Tompson等人[15]采用是卷积网络和图模型的联合。通过图模型学习关节之间的空间关系,使用级联来完善预测,同时在高精度范围提高定位性能

有的工作采用多分支的结构来达到整合多分辨率的目的,本文则是采用单一网络+跨层连接来保留每一个分辨率的空间信息,hourglass 结构最低会将特征图降到 4x4 的分辨率。

top-down 阶段: 采用卷积层 + maxpooling

down-top 阶段: 采用 [参考文献15] 中提出的最近邻上采样 + 跨层连接

因为要跨层连接,进行点加(element-wise addtion),所以它们对应分辨率的通道数都是一样的,这就成了更加对称的结构。 最后输出端用连续两个 1x1 的卷积层来产生最后的输出。

相关的官方资料链接如下:

论文地址

训练代码

Demo代码

预训练模型

第三方pytorch代码(位于models/StackedHourGlass.py):

https://github.com/Naman-ntc/Pytorch-Human-Pose-Estimation

代码实现参见:(原)堆叠hourglass网络 - darkknightzh - 博客园

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值