美文网首页
人体姿态评估(二)AlphaPose

人体姿态评估(二)AlphaPose

作者: blackmanba_084b | 来源:发表于2021-12-14 21:54 被阅读0次

接上次说的的OpenPose的网络,该网络属于bottom-up类型的网络,今天我们要说的是一种基于top-down的网络AlphaPose。该网络也是属于3年前的网络了,是上海交通大学发表的,借此机会希望记录下以便日后回顾。首先我们先给出链接地址:
文章:RMPE: Regional Multi-Person Pose Estimation
(目前有5.7k star)代码:AlphaPose
(AlphaPose是基于RMPE的部分算法开发的(poseNMS, PGPG))


一、知识背景

1.1 STN (在该代码中没有放入AlphaPose)

在我们说到原理之前需要科普下STN(Spatial Transfomer Networks)网络, 该网络使用谷歌DeepMind2015年发表的文章。这里我们推荐可以看李宏毅老师的这门视频课程,简单易懂,自己还超喜欢听他的课程Spatial Transformer Network (STN)让 CNN 具有缩放/旋转不变性 李宏毅), 当然如果你觉得看视频太麻烦的话,你可以看下这篇博客详细解读Spatial Transformer Networks(STN)-一篇文章让你完全理解STN了该文章基本就是将上述视频进行了概述。

1.1.1 使用STN原因 -> CNN不具备完全的不变性

这里我总结下基于CNN其实并不具备scaling invariance以及 rotation invariance,只有maxpooling才具有不变性(invariation)若是2x2的池化,那么特征在2x2的区域中平移,得到的结果是一样的。越往后的pooling层,2x2的核的感受野就越大、所允许的平移也就越大。传统CNN中使用卷积和池化操做在必定程度上实现了平移不变性,但这种人工设定的变换规则使得网络过度的依赖先验知识,既不能真正实现平移不变性(不变性对于平移的要求很高),又使得CNN对于旋转,扭曲等未人为设定的几何变换缺少应有的特征不变性。所以提出了STN。简单理解CNN有微小的平移不变性,但是该不变性主要还是因为max-pooling的操作导致的

1.1.2 STN

STN说白了就是一个映射转换功能,通过该网络可以实现对原图的移动旋转缩放以及裁剪(这里裁剪先不考虑)。对于每一种变化方式都是有两个参数,最后我们会有6个参数(3[移动+旋转+缩放] * 2[参数])来进行对原图变化, 这里可以理解这里就是替代CNN不具备平移不变性的特征,这个部件可以放到CNN网络中的任意一个位置。STN相当于在传统的一层Convolution中间,装了一个“插件”,可以使得传统的卷积带有了[裁剪]、[平移]、[缩放]、[旋转]等特性


我们举一个简单的例子,比如我们的abcdef的值我们得到了,如下图所示。比如右边白色矩形框中间的索引是[2,2]我们就可以推出左边对应的索引[1,1]
例子
上面的例子会很容易理解,但是如果我们中间的转移矩阵万一出现小数呢?如下所示
例子2
为此我们需要做interpolation,插值的方法,它是介于四个点中间。不能直接设置为周围四个点某一个点,这样不利于微分
具体该值怎么算如下所示,可以理解为就是与周围点距离乘上周围点的值
解决方案 上述说的STN如下所示,我们这里可以用黄色的菱形所示,它可以放到CNN任意一个地方。如下所示、
上面的图也是很多介绍STN管用的原理图,该图主要分为三个部分
Localization net
把feature map U作为输入,过连续若干层计算(如卷积、FC等),回归出参数θ,在我们的例子中就是一个[2,3]大小的6维仿射变换参数,用于下一步计算。
Grid generator + Sampler上面介绍的Interpolation(插值计算)

下面我们来看下基于STN有什么效果。


示例1
示例2
示例3

在演示的过程中发现input无论怎么变化经过ST之后Output里面的数字几乎是很稳定不怎么发生变化的。

简单示例1

上面表示的是经过4次ST我们将数字放大的效果。

简单示例2

图片输入到两个STN会出现两个不一样的结果,比如不同的部位,在进行合成。

1.1.3 STN Torch代码
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
        self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
        self.conv2_drop = nn.Dropout2d()
        self.fc1 = nn.Linear(320, 50)
        self.fc2 = nn.Linear(50, 10)

        # Spatial transformer localization-network
        self.localization = nn.Sequential(
            nn.Conv2d(1, 8, kernel_size=7),
            nn.MaxPool2d(2, stride=2),
            nn.ReLU(True),
            nn.Conv2d(8, 10, kernel_size=5),
            nn.MaxPool2d(2, stride=2),
            nn.ReLU(True)
        )

        # Regressor for the 3 * 2 affine matrix
        self.fc_loc = nn.Sequential(
            nn.Linear(10 * 3 * 3, 32),
            nn.ReLU(True),
            nn.Linear(32, 3 * 2)
        )

        # Initialize the weights/bias with identity transformation
        self.fc_loc[2].weight.data.zero_()
        self.fc_loc[2].bias.data.copy_(torch.tensor([1, 0, 0, 0, 1, 0], dtype=torch.float))

    # Spatial transformer network forward function
    def stn(self, x):
        xs = self.localization(x)
        xs = xs.view(-1, 10 * 3 * 3)
        theta = self.fc_loc(xs)
        theta = theta.view(-1, 2, 3)

        grid = F.affine_grid(theta, x.size())
        x = F.grid_sample(x, grid)

        return x

    def forward(self, x):
        # transform the input
        x = self.stn(x)

        # Perform the usual forward pass
        x = F.relu(F.max_pool2d(self.conv1(x), 2))
        x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))
        x = x.view(-1, 320)
        x = F.relu(self.fc1(x))
        x = F.dropout(x, training=self.training)
        x = self.fc2(x)
        return F.log_softmax(x, dim=1)


model = Net().to(device)

1.2 PoseNMS


如上图所示如果一个人检测多个人体框的时候我们可以基于p-NMS(poseNMS)的方式进行解决。对于上述的问题我个人觉得目前检测器都以及进入如此之快,该方法实用性其实并不大,也就是说出现该问题的机会也是比较小的。
下面给出了P-NMS的方法(源: (原)人体姿态识别alphapose

目标检测中的NMS大家应该都理解,其实他是通过IOU进行NMS筛选的,筛选重合率较大的,且保留置信度最大的框。这里的衡量标准就是基于IOU, 这里的PoseNMS其实的衡量标准就是基于距离的度量。该距离 = 姿态距离 + 空间距离

1.3 PGPG (姿势引导建议发生器(PGPG):数据增强,产生训练样本)

步骤:

1 归一化姿态,使得所有躯干有归一化长度。
2 使用kmeans聚类对齐的姿态,并且聚类得到的中心形成atomic poses。
3 对有相同atomic poses的人,计算gt bbox和detected bbox的偏移。
4 偏移使用gt bbox进行归一化。
5 此时,偏移作为频率的分布,且固定数据为高斯混合分布。对于不同的atomic poses,有不同的高斯混合分布的参数。

实在写不下去了,稍微理解下去看最新paper了。😴

参考
[1] 详细解读Spatial Transformer Networks(STN)-一篇文章让你完全理解STN了
[2] Spatial Transformer Network (STN)让 CNN 具有缩放/旋转不变性 李宏毅)
[3] CNN网络中的不变性理解
[4] CNN的旋转不变性和pooling
[5] 目标检测之网络篇(2)【STN-空间变换网络】
[6] STN Tutorial
[7] (原)人体姿态识别alphapose

相关文章

网友评论

      本文标题:人体姿态评估(二)AlphaPose

      本文链接:https://www.haomeiwen.com/subject/snoefrtx.html