Paperreading 之二 多人人体姿态估计COCO2017冠军—CPN(含TF和torch实现)

 

  1. 前言

人体姿态估计是MSCOCO数据集(http://cocodataset.org/)上面的一项比赛,人体关键点检测,目前主流的做法都是深度学习来做。可以分为两个大的方向:

(1)top-down方向:自顶向下的方法,目前的主流,像cpn,hourglass,cpm,alpha pose等都是top-down。主要分为两个阶段,行人检测和单人姿态估计,行人检测对后面的单人姿态估计影响很大,通常会使用性能较好的检测器(比如faster rcnn,fpn之类的),然后把检测到的行人框(bbox)作为单人姿态估计的输入,所以把行人准确无误的检测出来非常重要。

(2)bottom-up方向:自底向上方法,典型就是COCO2016年人体关键点检测冠军open pose。主要分为两个阶段:检测出输入图片中左右的人体关键点,根据某种策略对关键点之间进行连线,这时候就容易出现把a的关键点和b的关键点连接起来,open pose里面的策略是提出PAFs,让网络学习人体关节的矢量场信息,相当于得到了一个方向信息,结合前面的坐标点,可以确定连线。

 

2.构建网络

Paperreading 之二 多人人体姿态估计COCO2017冠军—CPN(含TF和torch实现)

CPN网络整体结构非常的直观明了,包含两个部分GlobalNet和RefineNet,顾名思义,GlobalNet是一个全局的初步的检测,相当于一个粗检测,会得到一个不错的结果;而RefineNet是一个微调网络,在GlobalNet的输出基础上做进一步的精细检测,会得到更加精确的结果。

GlobalNet相当于是一个FPN结构,假设使用ResNet50作为backbone(全文都是以ResNet50作为backbone),左边的四个实心方块就是ResN50的res2- res5(包含[3,4,6,3]个Residual block),右边的虚线方块就是特征融合的过程,不断通过上采样和elem-sum的过程做特征融合。共有4个层次,这样就会得到4个不同的结果,都需要计算loss,不同的层次对应groundtruth的heatmap使用的sigma大小不一样,根据实验来选择,通常使用7-15之间的奇数。

RefineNet就更简单了,把GlobalNet提取到的4个层次特征分别经过一些bottleneck(也是使用Residual block)和一些不同倍数的上采样,然后在特征层上进行concat进行特征融合,最后再经过一个bottleneck,输出最后的结果,最后的结果是outputsize[0]*ouputsize[1]*num_points的形式,对于COCO数据集,num_points=17,output_size=[64,48](如果输入是256*192),共有17个feature map,每一个表示一个关键点信息。在feature map上的heatmap中热力值最大的点就表示对应的关键点。

 

3.LOSS的设计

GlobalNet和RefineNet都是使用L2 loss,只是在RefineNet里面略有点不同,作者设计了一个类似ohem的策略进行loss回传,ohkm(Online Hard Keypoints Mining)在线困难关键点挖掘,ohkm更关注与高层次的信息,而ohem更关注与困难样本。

Paperreading 之二 多人人体姿态估计COCO2017冠军—CPN(含TF和torch实现)

Ohkm原理很简单,在loss回传的时候,只回传那些loss值比较大的loss,比如说只回传最大的8个loss(一共有17个点,相当于有17个loss),相当于是让网络更针对比较难学的关键点,从而会有更精细的结果。

Paperreading 之二 多人人体姿态估计COCO2017冠军—CPN(含TF和torch实现)

  

关于loss的设计作者做了不少实验,关于到底使用L2 loss还是ohkm版的L2 loss,以及GlobalNet到底使用还是不使用loss。实验结果表明,前面使用普通L2 loss,后面使用ohkm的L2 loss效果最好。

Paperreading 之二 多人人体姿态估计COCO2017冠军—CPN(含TF和torch实现)

 

4.Ablation Experiment

消融实验作者也做了很多,

  1. 关于行人检测以及里面的一些处理,比如nms和softnms等等
  2. 关于网络的设计主要和hourglas对比,
  3. 关于RefineNet的设计,作者尝试过不加bottleneck直接上采样和concat,加一个bottleneck,提取GlobalNet输出4层的哪几层(C2-C5)

Paperreading 之二 多人人体姿态估计COCO2017冠军—CPN(含TF和torch实现)

Paperreading 之二 多人人体姿态估计COCO2017冠军—CPN(含TF和torch实现)

最终得到图1的RefineNet结构,4个不同层次加不同个数的bottleneck,效果最好。

5.源码和结果

作者提供了TensorFlow版本的源码(https://github.com/chenyilun95/tf-cpn),质量不错,能达到论文的效果

Github上有很多其他版本,有一个PyTorch版本(https://github.com/GengDavid/pytorch-cpn

)复现作者的tf代码,效果不错,代码也很整洁。

Paperreading 之二 多人人体姿态估计COCO2017冠军—CPN(含TF和torch实现)

Paperreading 之二 多人人体姿态估计COCO2017冠军—CPN(含TF和torch实现)

 

6. 结论

  1. 分析多人姿态估计的影响因素,提出一种新的网络结果CPN,由GlobalNet和RefineNet组成
  2. 对RefineNet的精心设计和提出ohkm
  3. 主要是遭不住人家效果好,拿了冠军呀

做了一些实验,效果确实很不错。下次写上

参考文献

[1] Chen Y, Wang Z, Peng Y, et al. Cascaded Pyramid Network for Multi-Person Pose Estimation[J]. 2017.

[2] Cao Z, Simon T, Wei S E, et al. Realtime Multi-person 2D Pose Estimation Using Part Affinity Fields[C]// IEEE Conference on Computer Vision and Pattern Recognition. IEEE Computer Society, 2017:1302-1310.

[3] https://github.com/chenyilun95/tf-cpn

[4] https://github.com/GengDavid/pytorch-cpn