[paper] Hourglass
Stacked Hourglass Networks for Human Pose Estimation
Abstract
Hourglass Net是一个进行人体位姿估计的卷积神经网络(也可以用在人脸关键点检测等领域)。它结合了身体上的空间关系和多种尺寸上得到特征。作者采用了将多个Hourglass模块堆叠的方法,并且将中继监督运用进来,这些对于提高网络性能至关重要。这个方法在当时可以在FLIC数据集和MPII上达到state-of-art的效果。
网络结构:
Introduction
准确的人体关键点对于理解视频和图片中的人物状态是至关重要的。Hourglass网络和通常的卷积方法一样,最终可以产生像素级别的结果(Hourglass的结果是N个关键点的heatmap图,)。每个hourglass 模块会pool down到一个非常小的尺寸,然后再上采样(上采样的同时加上pool down时相同尺寸的feature map)。
Related Work
人体位姿估计主要有几个方法:
- 直接对x, y坐标进行回归
- 对原始图片进行多个尺度处理,然后得到最终结果
作者的网络建立在上述方法的基础上,探究了如何捕获多个尺度的信息,并且如何对不同的尺寸的特征进行整合。
对各种前人的网络介绍中,提及到Tompson et al. 使用级联(cascade)网络进行预测,并解释说级联网络的优点是减少内存使用的同时提高最终的效果。
网络结构
Bottleneck 模块
整个网络的输入是256*256,首先做一个7*7的卷积,然后做了1个Bottleneck, 在做了1个max_pooling, 之后做了2个BottleNeck,此时的尺寸是64*64
作者在论文中说,将输入从256*256降低到64*64,这样做主要是因为256*256需要消耗大量的GPU资源。缩小尺寸没有影响网络的预测。
我认为,使用bottleneck模块相比直接用一堆卷积、池化操作的优点是:
- 尽可能多的保留信息
- 在残差模块中用了2个1*1 的卷积,可以在不降低效果的情况下,降低参数量
BottleNeck 示意图
Hourglass 模块设计
hourglass的设计目的是捕获多个尺度的特征。因为最终位姿估计需要对整个人体进行理解,例如人的方向,胳膊腿的顺序等。而Hourglass是一个精简且设计优良的网络,它能捕获以上提及的特征,并且将它们结合起来产生最终的预测结果。
对于以上需求,很多方法使用多个pipeline独立的处理不同尺度的输入,并且最终将结果整合到一起。而作者的方法,只使用一个单独的pipeline,并且在同时使用skip layer避免每个尺度空间信息的损失。网路feature map最小达到4*4.
stacked hourglass model的主要贡献在于利用多尺度特征来识别姿态。以前估计姿态的网络结构,大多只使用最后一层的卷积特征,这样会造成信息的丢失。事实上,对于姿态估计这种关联型任务,全身不同的关节点,并不是在相同的feature map上具有最好的识别精度。举例来说,胳膊可能在第3层的feature map上容易识别,而头部在第5层上更容易识别,见下图。所以,需要设计一种可以同时使用多个feature map的网络结构。
对于具体的网路结构觉得有个博客写的挺好,下面引用一下,原文在参考里的1链接:
细心的读者可能注意到了,这里为什么少了个Stacked?因为堆叠沙漏网络是多个沙漏网络串联起来的,首先要明白单个的Hourglass Network如何工作的。串联的Stacked Hourglass相比单个网络主要是复用全身关节信息来提高单个关节的识别精度,后面会进一步解释。
上图就是原论文里给出的HourGlass Model,跟2.2节中的网络结构(c1-c7)相比,有两个显著不同:(1)右边就像左边的镜像一样,倒序的复制了一份(c4b-c1b),整体上看起来就是一个沙漏(2)上面也复制了一份(c4a-c1a),而且每个方块还通过加号与右边对应位置的方块合并。
我们来分析下c4b这个网络层,它是由c7和c4a合并来的,这里有两块操作:
(1)c7层通过上采样将分辨率扩大一倍,上采样相当于pool层的反操作,为了将feature map的分辨率扩大,比如c7的kernel size为 4x4 ,那么上采样后得到的kernel size 为 8x8 。
(2)c4a层与c4层的大小保持一致,可以看作是c4层的“副本”,它的kernel size 是c7的两倍,刚好与被上采样后的c7大小一致,可以直接将数值相加,那么就得到了c4b
用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 ,上图中并未画出该部分。
好了,继续自己写。
上面提到了上采样,https://blog.csdn.net/A_a_ron/article/details/79181108 详细介绍了unsampling, unpooling, deconvolution。
到达一个houglass module的结尾,应用一个1*1的卷积来产生最终的预测。预测结果是一系列headmap(比如人脸的关键点是68个,预测就是一个 68 ∗ 1 ∗ w ∗ h 68*1*w*h 68∗1∗w∗h的形状,每个heatmap代表对于每个点的概率预测)
同时,作者还在整个网络中加入了residual module,
层的设计
Inception v2那篇论文曾经提到,可以将5*5的卷积转换成2个3*3的卷积,这样可以不对结果产生影响的同时,减少参数量。还有另外一点,“reduction steps with 1*1 convolution”,这个具体的操作就是在大的卷积核前面加上1*1的小卷积核, 这样操作首先可以减少计算量,因为1*1的卷积通常配有更小的filter,而且卷积后通常加Relu,这样可以增加非线性。
这篇文章的作者使用了相同的思路,将以上两点加入网络中,对最终结果有一定提升。
中继监督
整个网络由多个Hourglass 模块堆叠而成。中继监督就是对每个Hourglass 模块的结果都计算损失。具体来说,每个Hourglass 模块都生成heatmap,根据groudtruth 计算损失;同时,我们对heapmap进行1*1的卷积,让其和Hourglass模块结果的channel相同,并将其加入进原本Houglass模块的输出。
Illustration of the intermediate supervision process. The network splits and produces a set
of heatmaps (outlined in blue) where a loss can be applied. A 1x1 convolution remaps
the heatmaps to match the number of channels of the intermediate features. These are
added together along with the features from the preceding hourglass.
训练细节
- 输入256*256
- 数据增强包括30°旋转, scale(0.75~1.25)
- rmsprop优化
- 初始学习率2e-4
参考
- https://blog.csdn.net/wangzi371312/article/details/81174452
[paper] Hourglass相关推荐
- CVPR 2011 全部论文标题和摘要
CVPR 2011 Tian, Yuandong; Narasimhan, Srinivasa G.; , ■Rectification and 3D reconstruction of curved ...
- 相机定位 | cv paper整理
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者:梦寐mayshine 链接:https://zhuanlan.zhihu.com/p/13449 ...
- Paper:《How far are we from solving the 2D 3D Face Alignment problem? 》解读与翻译
Paper:<How far are we from solving the 2D & 3D Face Alignment problem? >解读与翻译 目录 How far a ...
- Paper:《Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields ∗》翻译并解读
Paper:<Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields ∗>翻译并解读 目录 Abstract ...
- [paper reading] CenterNet (Object as Points)
[paper reading] CenterNet (Object as Points) GitHub:Notes of Classic Detection Papers 2020.11.09更新:更 ...
- [paper reading] CornerNet
[paper reading] CornerNet GitHub:Notes of Classic Detection Papers 本来想放到GitHub的,结果GitHub不支持公式. 没办法只能 ...
- 堆叠hourglass网络
本文目录 目录 1. 简介 2. stacked hourglass 3. hourglass 4. 上采样myUpsample 5. 残差模块 6. conv 7. ConvBlock 1. 简介 ...
- 【Paper Reading】
Levers are simple too, but they can move the world1. 文章目录 1 Categories Classification Compression Da ...
- Hourglass Network 沙漏网络 (pose estimation姿态估计)
在ECCV2016<Stacked Hourglass Networks for Human Pose Estimation>这篇paper中提出 是一个姿态估计(pose estimat ...
最新文章
- 如何清空DNS缓存Windowslinux
- 好文 | “智能经济”时代,协作机器人的应用前景与趋势探讨
- 推荐15款响应式的 jQuery Lightbox 插件
- OpenStack入门篇(八)之镜像服务Glance
- Module 让 Terraform 使用更简单
- EXTRONICS推出IRFID500便携式UHF RFID读写器
- Windows下安装和配置Maven的方法及注意事项
- android 画布抗锯齿,android – 如何在画布和路径中进行抗锯齿处理
- c语言程序设计 高等教育,[高等教育]c语言程序设计.doc
- Win7 + VS2015 + CMake3.6.1-GUI + Makefile 编译开源库
- HashMap的实现
- 五大主流浏览器内核以及国内常见的几种浏览器内核总结
- (原创)骑士人才系统(74CMS) 阿里短信接口 不影响后续升级
- 电脑保护眼睛的颜色设置
- HGET key field
- 无人机航拍VR全景图拍摄制作教程
- C++多线程/互斥锁/条件变量/信号量思维很重要;设计线程安全队列;1114按序打印;1115交替打印FooBar;1116打印零与奇偶数;1117H2O 生成1195交替打印字符串1226哲学家进餐
- 北京喜提初雪,Edg喜夺冠军
- 三月模拟题——炉石传说
- 阿里云ECS服务器配置全攻略
热门文章
- NXP ZigBee JN5169开发环境搭建
- 【独家】旷视科技CTO唐文斌专访:纯做技术的公司无法持久
- IT历史: 键盘发展历史
- 【已解决】win10 系统 thinkpad X1 carbon windows hello人脸识别不可用
- EF Core学习笔记:反向工程 + 底层操作数据库原理
- Linux中如何安装和运行应用程序(以tar.gz为例)
- Keras vs. tf.keras: 在TensorFlow 2.0中有什么区别?
- php假期培训机构,西安PHP暑假技术学习
- 《痞子衡嵌入式半月刊》 第 5 期
- M.2、SATA3.0、MSATA三种固态硬盘接口区别