人体姿态估计之MSPN

Posted easy-hard

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了人体姿态估计之MSPN相关的知识,希望对你有一定的参考价值。

首先先回答一下为什么multi-stage非常适合姿态估计这个任务呢?原因是:第一,对人体关节的预测需要给出准确的坐标值,这本身就需要有一个比较高的resolution; 第二, 对一些难度比较高的关节预测任务,不能仅仅去看关节点本身的feature,还需要结合整个图像的上下文来做出判断,而要获取上下文的信息就必须减小resolution( 有人可能说,增大卷积的kernel size 可以在不损失分辨率的情况下增大感受野,但是这种做法的效率很低,而且会大大增加参数量)。前面说的第一点和第二点构成了一对矛盾, 而怎么解决这一对矛盾呢?就是用 multi-stage。比如在stage 1的 down-sampling的时候,是产生低分辨率feature的过程,然后在up-sampling的过程中,产生heatmap,注意:由于不同关节点的heatmap是同时生成的,所以生成关节点a的heatmap的过程中没法参照关节点b的位置(对于关节点a而言,关节点就是一个context信息),那么如何才能利用context信息呢? 只有再搞一个stage,把前一个stage中学到的上下文信息利用起来。

上面是从图像context信息的角度来说明为什么multi-stage是必要的,其实这个问题还可以从另外一个角度来解读:那就是第一段中讲到的人体姿态估计的矛盾决定了好的解决方案必定是high resolution feature 和 low resolution feature 相互融合的,那么我们看看如果只有一个stage的话,可以做到很好的融和吗? 不能。因为在down-sampling之前,low-resolution的feature还没有产生,也就是说这时的神经网络输入不含有low-resolution feature。 只有经过了第一个stage后,high 和 low resolution 的feature才算合到一起,这时再做down sampling,信息就比较全面了。

注意: multi-stage只是解决前面说的矛盾的一种手段,但不是唯一手段。解决问题的本质就是 high resolution feature 和 low resolution feature 的融和问题, 所以我们会看到2019年的HRnet没有用multi-stage,但是他的网络架构也同样解决了高低分辨率的融和问题。

下面来说说对MSPN的理解:

  1. 首先表达一个我的疑惑:MSPN的论文中的网络架构和旷视给出的开源代码似乎不太相符。在stage 2 中, 在旷视的github上给出的代码中, layer 1的输入中并没有stage 1 的两个skip,这两个skip是在layer 1 的输出中才加上去的,也就是说每一个skip都在与layer的输出相加,而不是与输入相加。但是论文中给出的图片中,其画法非常有歧义,让人觉得skip是加在输入上而不是输出上。

  2. 下面重点说说MSPN的网络架构为什么能取得当时state-of-the-art的效果,引用论文原文中的话说就是feature aggregation做得很好,之前好像没人在姿态识别上提出跨stage的特征融和。实际上,你去看看hourglass的网络,第一个stage的输出作为第二个stage的输入,这是一种stage级别的融和;而MSPN则是同一分辨率的feature级别的特征融和,是深入到stage内部的,所以融和的效果更好。 顺便提一句,你可以用HRnet 论文中的网络结构的样式去画一下hourglass 和 MSPN 的网络结构,就知道他们三者在特征融和上的区别了。

  3. 最后再说下 损失函数的计算,MSPN中作者是把所有stage的所有resolution的prediction的偏差都放到所示函数里了。但是这里面有两个变化: 一个是在stage 1 中,目标heatmap的生成采用的是大的高斯核,也就是说生成的heatmap“比较模糊”, 而在stage 2中则采用了比较精确的heatmap。这个设计原则其实也体现了由粗到精的优化原则。 第二个变化是,在每一个stage的最高的resolution中产生的prediction只取损失值最大的k个放到损失函数中, 即所谓的OHKM(online hard keypoint mining)。这个OHKM是每一轮迭代的时候就进行的。

最后说一下,MSPN的论文中给出的网络结构图是很简略的,很多细节都没有表达地特别清楚,然后我自己用画了一个比较详细的图,能够帮助大家更好地理解MSPN的结构

技术图片

以上是关于人体姿态估计之MSPN的主要内容,如果未能解决你的问题,请参考以下文章

人体姿态估计(人体关键点检测)2D Pose训练代码和Android源码

人体姿态估计--OpenPose算法解析

Openpose+Tensorflow 这样实现人体姿态估计 | 代码干货

手势姿态估计,隔空写字绘图

二维已经 OUT 了?3DPose 实现三维人体姿态识别真香 | 代码干货

基于单目RGB的3D人体姿态估计