首页 > 编程知识 正文

Stacked Hourglass Networks - 堆叠沙漏网络结构详解

时间:2023-05-06 00:33:59 阅读:115470 作者:4036

1 .姿态估计(pose estimation )是计算机视觉领域非常重要的方向,人类动作理解、人机交互等应用需要准确的姿态识别。 目前大部分2d姿态识别是人体识别的关键,例如给定普通的RGB图像,算法给出人体踝、臂、脸等区域的关键。 目前,基于stacked Hourglass Model的各种变种算法,牢牢占据了姿态检测的半壁江山,需要清晰

2 .结构简介2.1 CNN的多层特征CNN深度卷积网络,如vgg16、resnet,近年来在推动人工智能发展方面做出了巨大贡献。 这是因为CNN可以自动提取对分类/检测/识别任务有用的特征,而不需要传统的人工设计特征,例如SIFT/HOG等。

CNN通常包括深度网络层,每个层代表图像的特征提取,称为功能图。 随着网络层次的加深,卷积网络图像特征的提取逐渐从低层特征描述抽象为高层特征描述。 这是什么意思呢? 举个脸部识别的例子吧。

上图为人脸识别的CNN,第一层提取了轮廓等低级特征。 第2层基于第1层,提取眼、鼻、口等更上位的语义特征。 顶层第3层提取并识别与任务最相关的特征feature-map-3,如完整的脸部轮廓。 然后,将feature- map-3输入到SVM等识别器中,并给出识别结果。 更详细的CNN说明请参考这篇文章

请注意。 这里是一个简单的例子。 实际的cnn比上图更复杂。 例如,这三层特征通常需要用几十层更精细的特征来代替,才能达到较高的识别效果。

2.2提出并用多层特征堆叠的hourglass model (以下简称SHM )的主要贡献是利用多尺度特征识别姿态。 先前估计姿态的网络结构往往只使用最底层的卷积特征,从而导致信息的丢失。 实际上,在姿势推测这样的关联型任务中,全身不同的相关节点在同一feature map中并不是具有最好的识别精度。 例如,手臂可能在第3层的“feature map”中更容易识别,头部可能在第5层更容易识别。 请参照下图。 因此,需要设计一种可以同时使用多个功能图的网络结构。

3.Stacked HourGlass网络结构的细节在我刚开始接触SHM的时候,无论是原文还是其他博客都是如云般的,不太清楚具体的网络结构是什么样的,直到后来读了源代码才弄清楚细节。 现在深入一句话,大多数珀普只有通过源代码才能自己再现。 另外,一些打开源代码的人,也有写不出文章的结果,所以不给源代码的paper都是流氓。 当然,这里将详细阐述我对SHM网络结构的理解,但我建议您仔细阅读源代码(by tensorflow )

3.1 hourglass网络的细心读者可能注意到了,这里为什么堆叠减少了? 沙漏网络由多个沙漏网络连接而成,因此首先需要了解各个Hourglass Network是如何工作的。 序列化的Stacked Hourglass与单个网络相比,主要复用全身的关节信息,提高了单个关节的识别精度,后面将进一步说明。

上图为原论文所示的HourGlass Model,与2.2节的网络结构(c1-c7 )相比,)1)右边如左边的镜像,按相反顺序复制(c4b-c1b ),以及整体看起来像沙漏)2)

让我们分析一下c4b这个网络层。 那是c7和c4a合并的。 这里有两个操作。

) c7层通过上采样将分辨率扩大两倍。 上采样相当于pool层的逆操作。 为了扩大特征映射的分辨率,例如c7的kernel size为44,则上采样后获得的kernel size为88。

) c4a层和c4层的大小一致,可以视为c4层的“拷贝”。 其kernel size是c7的两倍,正好与上采样的c7的大小一致,如果能够直接将数值相加,则得到c4b

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

C7_up=up_sample(C7 ) 1x 4x 4x 256-1x 8x 8x 256 c4 _ a=residual ) c4 ) #1x8x256-1x8x8x256 ) C4_a相当于C4的副本,但1 类似地,首先对c4b进行上采样,然后与c3a集成。 python伪代码为以下:

C4_up=up_sample(C4_b ) 1x8x 256-1x 16x 16x 256 C3 _ a=residual (C3 ) # 1x 16x 256-1 x32 x32 x 256 c3b=

c3_a + c4_up # 1x16x16x256

后面的层不再赘述。

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

3.2 Heat Map

大部分姿态检测的最后一步,是在feature map上对每个像素做概率预测,计算该像素是某个关节点的概率。

上图就是各个关节点的heat map,左边第一张为输入图像以及最终的预测关节点位置,第二张为对颈部节点的概率预测,红色和黄色代表着对应像素位置是颈部的概率很高,其他蓝色区域意味着这里几乎不会是颈部位置。

实际代码里,所有关节的预测是一起的,放在一个大的高维矩阵里,上图是为了演示才分开画的。

[ px1_of_c1b ]->[socre_of_neck,score_of_wrist,socre_of_knee,... ][ px2_of_c1b ]->[score_of_neck,score_of_wrist,score_of_knee,... ]# px1_of_c1b,px2_of_c1b 是特征层c1b上的两个像素# score_of_neck 是预测该点为颈部关键点的得分 3.3 关节点间的相互参考

3.1节给出的hourglass network 其实已经可以用来训练姿态估计了,但是为什么作者还要将沙漏网络串联呢?

关节点之间是可以互相参考预测的,即知道双肩的位置后,可以更好的预测肘部节点,给出腰部和脚踝位置,又可以用于预测膝盖。其他姿态估计文章有利用图模型(Graphic Model)来结合CNN做预测的,这个图模型就是对人体关节点的结构做抽象归纳。但是目前的图模型效果一般。

既然热力图代表了输入对象的所有关节点,那么热力图就包含了所有关节点的相互关系,可以看作是图模型。所以将第一个沙漏网络给出的热力图作为下一个沙漏网络的输入,就意味着第二个沙漏网络可以使用关节点件的相互关系,从而提升了关节点的预测精度。

如上图,N1代表第一个沙漏网络,提取出的混合特征经过1个1x1全卷积网络后,分成上下两个分支,上部分支继续经过1x1卷积后,进入下一个沙漏网络。下部分支先经过1x1卷积后,生成heat map,就是图中蓝色部分.

上图中蓝色方块比其他三个方块要窄一些,这是因为heat map矩阵的depth与训练数据里的节点数一致,比如 [1x64x64x16],其他几个则具有较高的depth,如 [1x64x64x256]

heat_map继续经过1x1卷积,将depth调整到与上部分支一致,如256,最后与上部分支合并,一起作为下一个沙漏网络的输入。

3.4 中间监督(Intermediate Supervision)

传统的识别或者检测网络,loss只比较最后的预测与ground truth之间的差异。因为堆叠沙漏网络的每一个子沙漏网络都会有heat map作为预测,所以将每个沙漏输出的heat map参与到loss中,实验证实,预测精确度要远远好于只考虑最后一个沙漏预测的loss,这种考虑网络中间部分的监督训练方式,就叫做中间监督(Intermediate Supervision)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。