这篇文章不是介绍怎么设计网络去提高多人姿态检测在数据集上的mAP值,而是去找出姿态估计算法为啥得分这么低的原因,更直白的讲就是,这个模型效果不好,这个效果不好具体是哪些地方效果不好,文章探究的是这个更底层的原因,而不是简单粗暴的堆trick提高mAP。文章是2017年发表的,当时比较出名的两个多人人体姿态估计网络是Google的GRMI和CMU的OpenPose,文章就是根据这两个模型来查找原因。
首先先介绍下当前计算人体关键点mAP值的方法:OKS,具体信息可以参考这个链接。对于person 上的两个点的oks值在[0~1]之间,记作。文章提出了三个会造成误差的原因:Localization, scoring, background
Localization
分成4类,如图所示:
- Jitter,,这个公式表明该点被正确的预测出来,但离真值还有一些距离
- Miss,对于任意的点, ,说明该点没有被预测出来
- Inversion,存在点,,但,也就是说匹配错误,例如一个人的左腕点被预测到了右腕处
- Swap,存在点和人,满足,但,通俗来说就是一个人的点匹配到了另外一个人身上
文章总结了GRMI和OpenPose两种方法在这四种错误上的分布:
首先可以明确的一点是,四种类型的误差在这两个不同的算法上分布基本一致,也就是说这个问题是这种算法的通病,和模型结构没有关系。其次,Jitter误差占的比重最大,Miss次之,Inversion紧随其后,而Swap却是最小的。从图中我们可以分析出,无论是top-down的GRMI,还是bottom-up的OpenPose,face部分是最容易预测出来的,误差比重最大的Jitter中,躯干部分最严重,尤其是hip。不仅是在Jitter中,Miss Swap Inversion中,都是躯干部分所占比重最大。特别需要强调的是在Inversion中,因为在实际工程项目中,top-down的模式中的单人pose也好,bottom-up中的多人pose也好,都经常出现同一个人的左右脚不分现象。从上图Inversion我们也能看出,下躯干最容易发生左右不分现象(因为实在没有特别明显的特征区分),而上躯干部分比较容易出现Swap现象,有可能是因为多人场景下,多人上半身重叠现象比较常见。
Scoring
这个简略说下,主要是指top-down方式的多人pose算法。top-dwon方式是先由一个检测器检测出来所有的human boxes,然后在这些boxes中对每一个box执行单人pose算法。那么这就引发了一个问题,我们送入单人pose算法的box是不是最优的box?形象化如下图所示,左图是具有high confidence的box,在传统的NMS算法中,我们会保留左图的框而抑制右图的框,然而实际测试中,左图的box得到的oks值反而比右图box得到的oks值要小,这就产生了high score with low oks or vice versa。文章给出的一个解决方法是使用Soft-NMS代替NMS来降低这种情况的发生。
Background
这个主要是由于BG造成的FP和FN。文章分析了如果去除算法产生的FN和FP会对mAP造成的影响,如下图:
比较有意思的是,GRMI产生的FN位于图像中央,而OpenPose产生的FN位于图像边缘,而且可能由于是前面人体检测器的影响,GRMI对于small size的FP数量最多,可能是前面的人体检测器产生了更多的小的human box传进去了下一级的姿态估计算法中。
文章最后还对图像中的遮挡、密集及人体size大小对算法的影响做了一次探讨。印象比较深刻的就是MSCOCO中crowd占的比例太少,这个也是后来CrowdPose数据集的出现的原因。
总结一下,这篇文章对于搞清楚我们的人体姿态算法为什么不好非常有帮助,它从根本上向我们展示了当前人体姿态算法具体的错误处,首先就是Jitter,因为算法预测出来的点没有离真值特别特别近,这就造成了Jitter误差的出现,并且占的比重特别大。如果可以设计出一个算法或者decode方法,能够让预测出来的点尽可能接近真值,那么算法的mAP值将会提高很多,这也是之后的工作中,类似PifPaf所作的工作。其次是Miss,说明算法的解析力还不足够,还需要更先进的模型来去学习。最后一张图结束,来整体看看这三种主要误差对模型的影响,如果解决了对应的AP值能够提高到多少。