10.31周报-人体姿态估计CPN
前言
本周进行了CPN算法思想的学习
文章
标题:Cascaded Pyramid Network for Multi-Person Pose Estimation
作者:Yilun Chen Zhicheng Wang Yuxiang Peng Zhiqiang Zhang Gang Yu Jian Sun
背景
论文提出提出了一种网络结构,能够对不可见的关键点,重叠的关键点,模糊难以辨识的关键点的检测,克服复杂背景的影响。
网络分为两部分:
GlobalNet:为一个FPN网络,用来检测比较简单的关键点,如眼睛,手;但对不可见的等较难的点判断并不是很好。
RefineNet:主要是用来检测非常难分辨的关键点,他的输入的GlobalNet的几个不同层次的特征来在线的对判断困难的关键点进行检测。
论文的方法获得了COCO 人体姿态点检测的2017年冠军,在COCO test-dev上的平均检测精度为73.0,在COCO test-challenge 数据集上平均检测精度 72.1,比2016年冠军的60.5高出了19%
解决了什么问题
多人姿态估计所面临的挑战,关键点遮挡,关键点不可见,复杂背景等提出的 Cascaded Pyramid Network (CPN) 方法,即着重于处理 “困难hard” 关键点
主要思路
下面这张图阐述了作者的网络设计思路,即一些比较容易识别出来的人体关键点,直接利用一个CNN模型就可以回归得到;而对于一些遮挡比较严重的关节点,则需要增大局部区域感受野以及结合上下文信息才能够进一步refine得到

方法
多人姿态估计
主要包括两部分
[1] - 人体边界框检测 Human Detector
[2] - 关键点估计 CPN
整体框架采用Top-down自上而下的检测策略。首先使用行人检测框架,先检测出行人候选框。然后使用本文的CPN网络对每一个检测出来的行人候选框进行人体关键点的回归,进而输出最终结果
CPN

主要包括两个子网络
GlobalNet
GlobalNet的输入并不是一幅图像,而是Resnet的4个blocks提取出的特征图,论文中分别以C2,C3,C4,C5来代表。其中C2,C3由于层数较浅,所以有很高的空间精度即能够很好的定位原图信息,但是语义信息不足;相反,C4,C5,拥有较高的语义信息,但是空间分辨率较低,不足以定位图像信息。所以,GlobalNet采用FPN的结构充分的利用各个层次的不同信息来对关键点的heatmap进行预测。GlobalNet与FPN稍有不同,在升采样(upsampling process)之后,两层相加之前,要再进行一次1×1的卷积操作
RefineNet
基于 GlobalNet 生成的特征金字塔表示,再添加 RefineNet,定位 “hard” 关键点.RefineNet 利用了不同层的特征信息,并通过类似于 HyperNet 的上采样和链接,整合不同层的特征信息.
stacked Hourglass 网络仅利用了 hourglass 模块尾部输出的上采样特征,而 RefineNet 链接了所有层的金字塔特征.对困难关键点进行定位,此处的困难关键点由训练决定,根据globalnet的loss大小决定哪几个关键点成为困难关键点,并不是人为的决定
def create_refine_net(blocks, is_training, trainable=True):
#global_fms 即 blocks
initializer = tf.contrib.layers.xavier_initializer()
bottleneck = resnet_v1.bottleneck
refine_fms = []
for i, block in enumerate(blocks):
mid_fm = block
with slim.arg_scope(resnet_arg_scope(bn_is_training=is_training)):
for j in range(i):
mid_fm = bottleneck(mid_fm, 256, 128, stride=1, scope='res{}/refine_conv{}'.format(2+i, j)) # no projection
mid_fm = tf.image.resize_bilinear(mid_fm, (cfg.output_shape[0], cfg.output_shape[1]),
name='upsample_conv/res{}'.format(2+i))
refine_fms.append(mid_fm)
refine_fm = tf.concat(refine_fms, axis=3) ##此处的操作的是concat!!!!
with slim.arg_scope(resnet_arg_scope(bn_is_training=is_training)):
refine_fm = bottleneck(refine_fm, 256, 128, stride=1, scope='final_bottleneck')
res = slim.conv2d(refine_fm, cfg.nr_skeleton, [3, 3],
trainable=trainable, weights_initializer=initializer,
padding='SAME', activation_fn=None,
scope='refine_out')
return res

模型图

实验
datasets:使用MS COCO trainval dataset(包含57k images and 150k person instances)和验证集:MS COCO minival dataset (includes 5000 images);测试集:test-dev set (20K images) and test-challenge set (20K images)
裁剪策略:
对于每个人体检测边界框,扩展到保持固定的长宽比,如 height:width = 156:192;
然后不改变长宽比的进行裁剪;
最后,将裁剪的图片 resize 到固定尺寸:height - 256 px;width - 192 px.
数据增强策略:
数据增强对于尺度不变性和旋转不变性很重要.
图片裁剪后,随机翻转(random flip),随机旋转(random rotation, -45 ~ + 45),随机尺寸变换(random scale, 0.7-1.35).
训练细节:
Adam 算法.
初始学习率 5e-4. 每 360000 次迭代,学习率减少 2x.weight decay = 5.
batchsize = 32.
BatchNormalization.
在 8 张 Titan X GPUs 上,ResNet50 模型的训练耗时 1.5 天左右.
采用 ImageNet 预训练模型进行参数初始化.
测试细节:(这一部分还没了解完全)
预测的 heatmaps 进行 gaussian filter 处理,最小化预测方差.
同时预测翻转图片的关键点估计,平均化 heatmaps 得到最终预测结果.
使用从最高响应到第二最高响应的方向上的四分之一偏移量来作为关键点的最终位置(a quarter offset in the direction from the highest response to the second highest response is used to obtain the final location of the keypoints.)
重新定位策略(Rescoring):人体框的 score 和所有关键点的平均 score 的乘积作为人体实例的最终 score.
Experiments
table3:可以看到cpn网络可以取得AP:69.4的效果

table4:该实验说明在refinenet阶段,每个层级的特征使用不同个数的boottleneck块,达到的检测效果

table5:该实验说明,使用哪几层的特征可以达到良好的效果

table6:该实验说明在refineNet中计算loss后选取M个loss作为网络的训练,下表中可以看到不同的M值,该网络得到的不同的AP值

table7:下表说明,在CPN网络中,采用不同的loss形式带来的检测效果,可以看到GlobalNet中采用L2 loss,RefineNet中采用L2 loss *,cpn网络可以达到最优的效果

总结
通过GlobalNet网络,可以对简单的点进行有效的关键点检测,但是对于不可见的关键点的检测,效果仍然不佳,RefineNet可以利用了不同层的特征信息,并通过类似于 HyperNet 的上采样和链接,整合不同层的特征信息,进行在线关键点挖掘。作者将检测点通过两个阶段的网络进行检测,这种想法很值得我们学习。CPN的主要思想就是在保持高分辨率图像的同时既可以保留大人物的特征,也可以保留小人物的特征,所以采用级联金字塔模型,将下层信息和上层信息进行融合。之前看的resnet和simple baseline都是想要实现这个效果,感觉这篇论文对于人体姿态估计的研究思想有很大帮助,和之前读的文章都联系起来了。自己理解的更深刻了。但是自己对于模型的训练和测试只是看了代码还没有自己实现过,这周想着重点完成一下整个流程,从数据处理开始,每一个阶段自己都尝试做一遍。