
首先先回答一下为什么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中学到的上下文信息利用起来。
首先表达一个我的疑惑:MSPN的论文中的网络架构和旷视给出的开源代码似乎不太相符。在stage 2 中, 在旷视的github上给出的代码中, layer 1的输入中并没有stage 1 的两个skip,这两个skip是在layer 1 的输出中才加上去的,也就是说每一个skip都在与layer的输出相加,而不是与输入相加。但是论文中给出的图片中,其画法非常有歧义,让人觉得skip是加在输入上而不是输出上。
下面重点说说MSPN的网络架构为什么能取得当时state-of-the-art的效果,引用论文原文中的话说就是feature aggregation做得很好,之前好像没人在姿态识别上提出跨stage的特征融和。实际上,你去看看hourglass的网络,第一个stage的输出作为第二个stage的输入fms人体姿态估计,这是一种stage级别的融和;而MSPN则是同一分辨率的feature级别的特征融和,是深入到stage内部的,所以融和的效果更好。 顺便提一句,你可以用HRnet 论文中的网络结构的样式去画一下hourglass 和 MSPN 的网络结构,就知道他们三者在特征融和上的区别了。
最后再说下 损失函数的计算,MSPN中作者是把所有stage的所有resolution的prediction的偏差都放到所示函数里了。但是这里面有两个变化: 一个是在stage 1 中,目标heatmap的生成采用的是大的高开云体育官方入口斯核,也就是说生成的heatmap“比较模糊”, 而在stage 2中则采用了比较精确的heatmap。这个设计原则其实也体现了由粗到精的优化原则。 第二个变化是,在每一个stage的最高的resolution中产生的prediction只取损失值最大的k个放到损失函数中, 即所谓的OHKM(online hard keypoint mining)。这个OHKM是每一轮迭代的时候就进行的。
最后说一下,MSPN的论文中给出的网络结构图是很简略的,很多细节都没有表达地特别清楚,然后我自己用画了一个比较详细的图,能够帮助大家更好地理解MSPN的结构