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尺度:
测试时的尺度范围(0.8-3.0)远大于训练时的尺度范围(0.7-1.3),原因未知。
数据集 | 类别 | 部件数 | 训练/测试样本数 |
---|---|---|---|
FLIC | 半身,影视 | 9 | 3987/1016 |
LSP | 全身,体育 | 14 | 11000/1000 |
MPII | 全身,日常 | 14 | 28000/ |
在这三个数据集上,PCK(Percentage Keypoints Metric)指标均超过已有文献。下图示出一例。
除了准确性指标,论文还研究了中继监督优化对于底层网络参数更新的帮助。
上图示出有中继监督(黑色)和无中继监督(红色)情况下,各层梯度的分布情况。
在无中继监督时,顶层梯度分布较均匀,而底层梯度都集中0附近,几乎无法更新网络。
有中继监督时,各层梯度分布情况良好,网络能够随着训练正常更新。
Stacked Hourglass2同样用CNN解决人体姿态分析问题。比本文在MPII上取得更改精度,网络更为简洁,训练时间大大缩短。可以参看这篇博客。