论文阅读:《Convolutional Pose Machines》CVPR 2016

 

 

 

 

概述

本文使用CNN进行人体姿态估计,它的主要贡献在于使用顺序化的卷积架构来表达空间信息和纹理信息。顺序化的卷积架构表现在网络分为多个阶段,每一个阶段都有监督训练的部分。前面的阶段使用原始图片作为输入,后面阶段使用之前阶段的特征图作为输入,主要是为了融合空间信息,纹理信息和中心约束。另外,对同一个卷积架构同时使用多个尺度处理输入的特征和响应,既能保证精度,又考虑了各部件之间的远近距离关系。 

 

 

 

 

 

Wei, Shih-En, et al. “Convolutional Pose Machines.” CVPR, 2016

本论文将深度学习应用于人体姿态分析,同时用卷积图层表达纹理信息和空间信息。目前在2016年的MPII竞赛中名列前茅。作者在github提供了训练和测试源码
本文详解其思想和实践方法,并指出源码与论文中不同之处。

思想

本文的特色有三:
1.用各部件响应图来表达各部件之间的空间约束。响应图和特征图一起作为数据在网络中传递。
2.网络分为多个阶段(stage)。各个阶段都有监督训练,避免过深网络难以优化的问题。
3.使用同一个网络,同时在多个尺度处理输入的特征和响应。既能确保精度,又考虑了各个部件之间的远距离关系。
这里写图片描述

算法的流程如下:
1. 在每一个尺度下,计算各个部件的响应图
2. 对于每个部件,累加所有尺度的响应图,得到总响应图
3. 在每个部件的总响应图上,找出相应最大的点,为该部件位置

重点在第一步。以下依次讲解:如何设计网络来计算响应图,以及如何训练网络。

网络结构

网络输入彩色图像(绿色ori image)。以半身模型为例,分为四个阶段(stage)。每个阶段都能输出各个部件的响应图(蓝色score),使用时以最后一个阶段的响应图输出为准。
这里写图片描述

center map(绿色)是一个提前生成的高斯函数模板,用来把响应归拢到图像中心。
这里写图片描述

第一阶段

第一阶段是一个基本的卷积网络1(白色convs),从彩色图像直接预测每个部件的响应。半身模型有9个部件,另外包含一个背景响应,共10层响应图。

对应论文3.2.1

第二阶段

第二阶段也是从彩色图像预测各部件响应,但是在卷积层中段多了一个串联层(红色concat),把以下三个数据合一:
- 阶段性的卷积结果(46*46*32)→→ 纹理特征
- 前一阶段各部件响应(46*46*10)→→ 空间特征
- 中心约束(46*46*1)
串联后的结果尺寸不变,深度变为32+10+1 = 43。

对应论文3.2.2

第三阶段

第三阶段不再使用原始图像为输入,而是从第二阶段的中途取出一个深度为128的特征图(feature image)作为输入。同样使用串联层综合三种因素:纹理特征+空间特征+中心约束。
原始图像和128层中的部分特征图层:
这里写图片描述

使用特征图作为阶段输入的方式在论文中未提及,在源码有实现。

后续阶段

第四阶段结构和第三阶段完全相同。在设计更复杂的网络时(例如全身模型),只需调整部件数量(从10变为15),并重复第三阶段结构即可。
这里写图片描述

训练

数据扩展

为了丰富训练样本,对原始图片进行随机旋转缩放镜像。

这部分由一个新定义的caffe层cpm_data实现。仅在训练时使用。

标定

姿态数据集中标定的是各个部件的位置,可以通过在每个关键点的真实位置上放置一个高斯响应,来构造响应图的真值。

疑问: “几何位置->真值响应”在哪里完成? genLMDB.py的输入参数中有json(几何位置),输出lmdb中也含有几何位置。cpm_data_layer.cpp中却找不到绘制响应图的部分。

对于包含多个人的图像,生成两种真值响应:
a. 在每个人的相应部件位置,放置高斯响应。(下图左)
b. 只在标定的人的相应部件位置,放置高斯响应。(下图右)
这里写图片描述

由于第一阶段只能考虑局部特征,故将a用于第一阶段网络训练,b用于后续阶段网络训练。

同样由cpm_data层实现。从标定的集合位置生成两个label数据,分别传给不同阶段的loss层。

中继监督优化

如果直接对整个网络进行梯度下降,输出层的误差经过多层反向传播会大幅减小,即发生vanishing gradients现象。
这里写图片描述
为解决此问题,本文在每个阶段的输出上都计算损失。这种方法称为intermediate supervision,可以保证底层参数正常更新。
这里写图片描述

训练时,初始化参数随机设定。

多尺度

训练时,已经通过cpm_data层对数据进行了尺度扩充。在测试时,直接从原图生成不同尺度的图像,分别送入网络。将所得相应结果求和。下图示出第1,4,8,12尺度:
第1,4,8,12尺度的图像
测试时的尺度范围(0.8-3.0)远大于训练时的尺度范围(0.7-1.3),原因未知。

实验配置

数据集

数据集类别部件数训练/测试样本数
FLIC半身,影视93987/1016
LSP全身,体育1411000/1000
MPII全身,日常1428000/

在这三个数据集上,PCK(Percentage Keypoints Metric)指标均超过已有文献。下图示出一例。

这里写图片描述

中继监督的效果

除了准确性指标,论文还研究了中继监督优化对于底层网络参数更新的帮助。
这里写图片描述
上图示出有中继监督(黑色)和无中继监督(红色)情况下,各层梯度的分布情况。
在无中继监督时,顶层梯度分布较均匀,而底层梯度都集中0附近,几乎无法更新网络。
有中继监督时,各层梯度分布情况良好,网络能够随着训练正常更新。

Stacked Hourglass2同样用CNN解决人体姿态分析问题。比本文在MPII上取得更改精度,网络更为简洁,训练时间大大缩短。可以参看这篇博客


  1. 本文中的“卷积网络”泛指由多个conv,relu,pooling层构成的网络。
  2. Newell, Alejandro, Kaiyu Yang, and Jia Deng. “Stacked hourglass networks for human pose estimation.” arXiv preprint arXiv:1603.06937 (2016).


 

训练细节

1. 数据增强:对原始图片进行随机缩放,旋转,镜像
2. 标定:在每个关节点的位置放置一个高斯响应,来构造响应图的真值。对于含有多个人的图像,生成两种真值响应,一是在每个人的相应关节位置,放置高斯响应。二是只在标定的人的相应关节位置,放置高斯响应。
3. 中继监督,多个loss:如果直接对整个网络进行梯度下降,则输出层在经过多层反向传播会大幅度的减小,解决方法就是在每个阶段都输出一个loss,可保证底层参数正常更新。

开源实现

https://github.com/shihenw/convolutional-pose-machines-release(caffe版本)
https://github.com/psycharo/cpm (tensorflow版本,但是只有用pre-trained model做predict,没有training)


Reference:http://blog.csdn.net/shenxiaolu1984/article/details/51094959

 

 

 

 

 

 

 

    

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值