论文原文:https://arxiv.org/pdf/1711.07319.pdf 项目地址:https://github.com/GengDavid/pytorch-cpn 博客参考:https://blog.csdn.net/yangzhengzheng95/article/details/85288347
The algorithm achieves state-of-art results in the challenging COCO multi-person keypoint benchmark, that is, 73.0 AP in test-dev dataset and 72.1 AP in test challenge dataset.
作者观点:人体关节点可以分为两类,一类是是易于检测到,特征比较明显的,另一类是难以检测的,比如被遮挡的关节点。所以对这两类的关节点不能够平等对待。作者认为表层特征难以识别“难点”,并且目前关节点方法中都没有明确“难点”检测问题。所以作者采用金字塔结构的网络融合多尺度信息进行关节点的估计,并且在训练过程中根据关节点产生的 loss 大小进行排序,选取其中 loss 大的关节点进行反向传播,从而平衡“易点”和“难点”的检测(明确了“难点”检测问题)
网络由两个部分组成:GlobalNet & RefineNet。GlobalNet 对一些简单的关节点进行预测,RefineNet 对一些难的关节点进行预测。为了实现多人的检测,采用 Top-bottom 的方式:先利用人体检测器检测出单人,然后通过关节点检测器进行关节点的检测。
GlobalNet 以 ResNet 为 backbone,作者利用最后一个残差 block 的 C2~C5 的输出特征图来进行关节点的多尺度预测。如上图所示,C2~C5 特征图先进行一个 3 x 3 卷积操作来产生关节点 heatmap;然后,从最底层开始计算 L2 loss,其中每一层都融合(Element-wise-Sum)来自下面一层进行上采样(进行 size 的变换)以及 1 x 1 卷积操作(进行 channel 的变换)之后的 heatmap 结果(如图中所示,也就是说在 GlobalNet 将计算 4 个 L2 loss)。
特征图拿去做 loss 计算之前,通过两个卷积层使得最终输出 channel 为 k (k 为关节点数量)
GlobalNet 对简单关节点进行检测,但是对于一些不可见的难关节点的检测效果不理想。所以在 GlobalNet 的基础上,作者级联了 RefineNet 来提升对难关节点的检测。
RefineNet 以 GlobalNet 输出的特征为输入(一共四层)。对于每层的特征图,经过不同数量的 BottleNeck 之后得到相同 channel 的特征图,然后进行上采样产生相同 size 的特征图。然后在 channel 维度进行 concat 综合不同尺度信息。最后利用综合信息生成最终的 heatmap。
注意:L2 loss和L2 loss的区别,在GlobalNet中,使用L2 loss,即GlobalNet网络的输出和label计算所有关键点的loss;在RefineNet中,使用L2 loss,即网络输出和label计算所有关键点的loss,然后对loss进行从大到小排序,最后选择top-k个loss用于网络的反向传播。
数据集:训练集- MS COCO trainval dataset(57K images, 150K person instances),验证集- MS COCO minival dataset(5000 images),测试集- test-dev set(20K images)& test-challenge set(20K images)
裁剪策略:检测框按指定比例进行拓展,后面实验同样长宽等比例缩放(使得人不变形,之前有些项目采用的是非等比例缩放,人易变形)
数据增强:-45°-45°随机选择 & 0.7-1.35 随机缩放(后面再裁剪)
训练细节:lr=5e-4,每 3600000 iterations,学习率变为原来 1/2;weight_decay=1e-5,Batch size=32;网络权值初始化参数来自 ImageNet 数据集上训练的模型。
测试细节:最终 heatmap 通过高斯滤波器减小方差(?);被估计关节点的人进行旋转,然后和没有选旋转的检测结果平均;最高响应位置,沿着从最高响应到第二高响应的方向偏移 1/4 的量作为最终检测结果;检测框的 score 和所有关节点的 scores 平均值之间的乘积作为被检测人的分数。
总结:GlobalNet 对简单关节点进行估计,而 RefineNet 相对于在已有简单关节点估计的基础上来进行难点的估计。相对于 RefineNet 做的事情就是来在部分关节点已知的情况下来对关节点进行一个补全预测。
关节点估计大家貌似都在进行:多尺度信息的融合;多阶段估计;