CPN:Cascaded Pyramid Network for Multi-Person Pose Estimation

旷视科技face++发表于cvpr2018,模型取得2017年coco keypoint benchmark冠军。
论文:https://arxiv.org/abs/1711.07319 官方代码:https://github.com/chenyilun95/tf-cpn

基本思想

此方法为TOP-DOWN方法,需依赖另一个人体检测模型,先把人体检测出来,再用此模型进行关键点检测。
对于比较明显的关键点,基于局部信息就能识别出来,如眼睛鼻子;但对于比较隐晦的关键点,如躯干部分或者有遮挡的部分,需要视野比较大的全局信息。因此设计两个堆叠的网络,一个负责明显关键点的检测,另一个在此基础上进行修正。

整体框架

maskrcnn 实现视频中人体关键点检测 人体关键点检测算法_缩放

模型分为两大部分,一部分是Globalnet,主体是resnet,负责初步检测关键点坐标;第二部分是Refinenet,对第一部分的各层进行进一步加工,然后用concat进行堆叠,负责对困难部分关键点进行检测。

流程

  • 训练
  • 输入:裁剪、缩放后的包含人体的图片(假设输入尺寸为(384, 288),后面尺寸皆以此为参照,若输入尺寸改变,相应的输出尺寸也会改变),标签为4个由ground truth经高斯模糊后生成的heatmap(尺寸相同,皆为输入的1/4,即(96, 72),但高斯模糊的程度不同)
  • loss:分为两部分,第一部分是Globalnet的输出,第二部分是RefineNet的输出,最后loss为两部分的和
  • Globalnet部分:
    如框架图,取resnet的4个feature,分别经过1x1卷积,把通道数变为17;
    最下层(尺寸最小的那层,实际上为resnet的最top层,图里倒过来了),载经1x1和3x3的卷积后,upsample (代码里为粗暴的resizelinear)缩放到(96, 72)大小然后与模糊程度最大的heatmap计算L2损失(像素点相减,取平方和);
    以上各层分别由下一层经upsample缩放到(96, 72),经1x1卷积后与该层的feature逐点相加,再经1x1和3x3卷积,与对应的heatmap计算L2损失。
    最后globalnet的损失为各层损失的平均值乘以权重(代码里为0.5)。
  • RefineNet部分:
    由Global的4个feature(逐点相加后的和)经过不同数量的bottleneck卷积(数量如上结构图,对本来已经比较深层的最下层卷积的次数比较多,而对本来比较浅层的上层卷积次数比较少,感觉有点反常),统一upsample成统一大小(96, 72),concat堆叠到一起,再通过卷积把通道数改变到17,然后与模糊程度最小的heatmap分通道计算L2损失;
    取各通道中loss最大的若干个(OHEM,代码中为8个)的平均值作为RefineNet的loss值。
  • 预测
  • 输入:每张图片进行左右flip,分别预测
  • 输出:预测部分只取RefineNet最后输出的heatmap(尺寸为(96, 72, 17)),然后把一对flip的结果计算平均值。得到的是每个关键点一张heatmap,经过高斯模糊,然后取最大值点的坐标作为关键点坐标;取第二大值点的坐标与最大值点的坐标之间的距离,计算一个偏移量;关键点坐标与偏移量的和为最后的关键点坐标。

PS