因为要做毕业设计,所以看了RMPE: Regional Multi-person Pose Estimation的论文,感觉相关的博客非常的多,但是总是get不到我不理解的点,还是记录下来,以免以后又不懂了。
单人姿态估计中遇到的错误有两个:定位错误(SPPE认定IoU>0.5就是边界框正确的),姿势冗余(一个人可能会产生多个谷歌模型)
针对这两个错误,提出了一些新的东西:
对称空间变换器网络(SSTN):提取高质量的单人区域
参数姿势非最大抑制(NMS):解决检测冗余
姿势引导建议发生器(PGPG):数据增强,产生训练样本
首先放上一张大家再熟悉不过的结构图镇楼。我们的对称STN由STN和SDTN组成,它们在SPPE之前和之后连接。STN接收人类提议,SDTN生成姿势提议。Parallel SPPE在训练阶段充当额外的正则化器。最后,执行参数姿势NMS(p-Pose NMS)以消除冗余姿势估计。与传统培训不同,我们使用PGPG生成的图像训练SSTN + SPPE模块。
看论文时,我就一直不懂STN到底是什么?其实很简单,我长话短说。
我们在处理手写数据集的时候,会出现旋转的数字,数字仅仅占据图片的一小部分,等等情况,但是我们希望的是,无论我的数字经过 了怎样的变换,CNN都可以准确识别它的数字,单纯训练的话可能会造成很多时间或者参数上的代价,于是出现了空间变换网络STN,我们把它加在CNN中(或者前面),它能够自适应的将输入的图片进行各种空间变换,提高分类的准确性。
以更加抽象的话来说就是,我们可以输入图片,STN可以在训练的过程中自动选择感兴趣的区域特征,实现对各种形变的数据进行空间变换。
如图,简单描述就是localisation net用来生成仿射变换系数θ,就可以用来进行变换了。
好的,现在我们可以把它应用在Alphapose中了,STN和SDTN空间变换网络在自动选择感兴趣区域方面表现出优异的性能,所以我们使用STN来接收人体区域提议,在SPPE之后,将得到的姿势映射到原始人类提议图像中。当然,需要空间反变换器网络(SDTN)将估计的人体姿势重新映射回原始图像坐标。在这一过程中训练SPPE姿态估计网络,(这一点很重要)
那么为什么又有一个并行的SPPE出现呢?我们先看下下面这张图,
其实它的存在是为了训练STN中的参数的,我们为它指定了一个位于中心的姿势标签,训练时,我们冻结并行SPPE的所有层的权重,它可以有效避免STN进行不正确的变换。
为何不直接在SPPE之后(SDTN之前)加入损失函数呢?因为这种方法同时对STN和SPPE进行训练,STN很难完美的进行变换使之与标签相契合,这将会大大减弱SPPE进行姿态预测的能力,因此加入Parallel SPPE部分来固定SPPE,只更新STN以保证STN达到最优。
非极大值抑制就很容易理解了,简单说来,就是以置信度最高的姿势作为参考,通过一定的标准消除一些接近它的姿势。
具有m个关节的姿势表示为,其中和分别是位置和关节的置信分数。
如果小于η,则的输出应为1,这表示由于参考姿势的冗余,应该消除姿势。
这个公式主要时为了消除低置信度的姿势,当置信度低时,则tanh会接近0。
这个公式,消除距离很近的姿势,避免冗余。
设置一个权重,综合两个考虑,可以达到很好的效果。
第一次写这么长的博客,现在我只想睡觉,但是我不想明天再接着写了,我太难了。
姿态引导建议发生器,就是为了增加样本的数量可以很好的训练网络。
检测到的边界框和地面实况边界框之间的相对偏移的分布在不同的姿势中是不同的。更具体地说,存在一个分布,其中是由人类探测器生成的边界框的坐标与地面实况边界框的坐标之间的偏移,P是人的地面真实姿态,按照这种分布建模,我可以生成很多类似的训练样本。
因上式不好实现,我们尝试学习分布,其中表示P的原子姿势,原子姿势是我们通过k-means聚类算法获得的。现在,对于共享相同原子姿势a的每个人实例,我们计算其地面实况边界框和检测到的边界框之间的偏移。然后通过该方向上的地面实况边界框的相应边长来对偏移进行归一化。在这些过程之后,偏移形成频率分布,我们将数据转换为高斯混合分布。
对于训练样本中的每个注释姿势,我们首先查找相应的原子姿态a。然后我们根据通过密集采样生成额外的偏移量,以产生增强的训练提议。
原理写到这里就大功告成了!有的地方我自己 理解的也不够到位,欢迎大家批评指正,一起进步,谢谢大噶!