Integral Human Pose Regression

论文地址: ECCV2018 https://arxiv.org/abs/1711.08229

代码地址: integral-human-pose

作者: 微软亚研 Xiao Sun, Bin Xiao, Yichen Wei

总结: 本文并没有提出什么新颖的方法​​​​​​​,但是在DSNT​​​​​​​(soft-argmax, 知乎)的基础上补充了其没做的大量消融实验(DSNT仅在MPII上),对于解决热图法在低分辨率下的量化误差有很好的性能.

摘要: 当前姿态估计最好的方法都是基于热图进行表达的,虽然取得了不错的性能,但是这种表达方式不可避免的存在几个问题,比如说不可微分的后处理(取最大值操作)量化误差(低分辨率下和真值的差).本文的工作表明通过使用一个简单的积分操作(求均值)就可以把热图法和回归法联系起来.它是可微的、高效的并且可以和其它任何热图的方法取得可比的性能.通过大量的消融实验证明了它的有效性,特别是在3D姿态估计中被首次验证.

最小可调试代码段:

import os
import cv2
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.autograd import Variable

def makeGaussian(height, width, sigma = 3, center=None):
    x = np.arange(0, width, 1, float)
    y = np.arange(0, height, 1, float)[:, np.newaxis]
    if center is None:
        x0 =  width // 2
        y0 = height // 2
    else:
        x0 = center[0]
        y0 = center[1]
    return 10*np.exp(-4*np.log(2) * ((x-x0)**2 + (y-y0)**2) / sigma**2)
    
def generate_hm(height, width ,joints, maxlenght):
    num_joints = joints.shape[0]
    hm = np.zeros((num_joints, height, width), dtype = np.float32)
    for i in range(num_joints):
        s = int(np.sqrt(maxlenght) * maxlenght * 10 / 4096) + 3
        hm[i,:,:] = makeGaussian(height, width, sigma= s, center= (joints[i,0], joints[i,1]))      
    return hm   

def vis_heatmap(heatmap):
    n, c, h, w = heatmap.shape
    heatmap = heatmap.numpy()[0]
    for i in range(c):
        gt = heatmap[i]
        gt = cv2.resize(gt, (w*10,h*10))
        cv2.imwrite("gt/"+str(i)+".jpg",gt*8)

def generate_3d_integral_preds_tensor(heatmaps, num_joints, x_dim, y_dim):
    assert isinstance(heatmaps, torch.Tensor)
    heatmaps = heatmaps.reshape((heatmaps.shape[0], num_joints, y_dim, x_dim))

    accu_x = heatmaps.sum(dim=2)
    accu_y = heatmaps.sum(dim=3)
    np_accux = accu_x.numpy()

    accu_x = accu_x * torch.arange(x_dim)
    accu_y = accu_y * torch.arange(y_dim)

    accu_x = accu_x.sum(dim=2, keepdim=True)
    accu_y = accu_y.sum(dim=2, keepdim=True)
    return accu_x, accu_y

if __name__ == '__main__':
    GT_xy = np.array([[10,10], [3,8], [16,18]])
    heatmap = generate_hm(64, 32, GT_xy, 64)   # [numJoint, 64, 64]
    heatmap = torch.unsqueeze(torch.from_numpy(heatmap), 0) # [1, numJoint, 64, 64]
    vis_heatmap(heatmap)
    preds = heatmap.reshape((heatmap.shape[0], 3, -1))
    preds = F.softmax(preds, 2)
    vis = preds.reshape(3,64,32).numpy()*16
    cv2.imshow("pred", vis[0])
    x, y = generate_3d_integral_preds_tensor(heatmaps=preds, num_joints=3, x_dim=32, y_dim=64)  # 
    # x,y: [1,numJoint,3]
    preds = torch.cat((x, y), dim=0)  # [2,numJoint,1]
    preds = preds.permute(1, 0, 2)  # [numJoint,2,1]
    preds = preds.squeeze()   ####  [numJoint, 2]
    print('preds', preds.size(), preds)
    cv2.waitKey()

引文

人体姿态估计有很多相关的研究,并且近年来随着卷积神经网络的发展取得了巨大的进步.最好的2D姿态回归方法都是基于检测的,他们通常为每个点生成一个似然热图然后通过定位其上的最大值来获得关键点的位置,热图法同样用在了3D姿态估计中并且展示出巨大的潜能.

尽管取得了很好的性能,基于热图的表达天生有一些缺点: 取最大值操作是不可微的,这阻止了端到端的训练(坐标值没有直接参与到训练中),由于神经网络中存在一些降采样操作热图的分辨率通常比输入图像要低的多,这不可避免的会导致量化误差(由小图放大至大图时坐标不精确).使用更大的分辨率能够提升精度但是也会增大计算量和存储的需求,特别是对3D热图来说.

从另外一个角度来说,姿态回归本质上是一个回归问题,回归法进行端到端的学习并且产生连续(实数而不是和热图似的整数)的输出, 它避免了上述的问题.然而在2D姿态估计中回归法并不和热图法那样有效,在所有2D姿态估计评估中最好的方法中,仅有一个是回归法的。一个可能的原因是回归法比热图法更难学习,因为后者是通过密集的像素信息进行监督的.尽管回归法在3D姿态中大量使用,他们的性能始终差强人意.

现有的方法要么是基于热图的要么是基于回归的,两者间有清晰的界限很少有工作研究他们之间的联系.本文的工作表明一个简单的积分操作就可以联系和统一起两者来:它把取最大值的操作改成取期望值.关键点是通过热图上每个位置和其概率做积分获得的。它共享了热图法和回归法的好处,避免了他们的问题.积分操作是可微的,并且允许端到端的训练,它很简单几乎不增加什么负载,此外,它还可以很轻易的和其它任何基于热图的方法进行结合.

积分操作本身并不新鲜,它被称之为soft-argmax,并且在之前的工作中使用。但是之前的工作实验做的不怎么充分,只是在性能近乎饱和的MPII测试集上评估过.这种方法在其它的比如3D姿态估计中是否有用还没有人尝试过.

由于积分操作没有参数并且只是把姿态从热图转换成关键点坐标,它不影响其它的算法设计选择并且可以和他们很好的结合使用,包括不同的任务、热图、损失、网络结构、输入和热图分辨率等,可以参考图1的总结。我们进行了大量的实验来发掘积分回归在所有这些设置下的表现并且发现了一致的提升,这些结果表明了积分表达的有效性.

我们主要的贡献在于将积分回归用于不同的实验设置并且验证了他们的有效性,特别的,我们首次表明积分回归可以大幅度提升3D姿态估计的性能,使得3D和2D数据混合训练成为可能并且在Human3.6M上取得了最好的性能.我们在2D上的结果也很有竞争力,为了促进更进一步的发展代码会开源.

2 积分回归

 给定第k个节点的如图Hk,图上的每个位置代表关键点出现在那的概率,最终的位置是通过取最大值得到的:

​​​​​​​

 这种方法有两个缺点,首先式1是不可微的,因此只能作为后处理的一个步骤而不能参与到学习中来,训练不是端到端的,只能够对热图实施监督.

其次热图会导致量化误差. 由于神经网络中存在很多降采样层热图分辨率比输入图低很多,关键点预测的精度受限于量化尺度,这给姿态估计带来了很大的挑战。使用更大的热图能够避免这些问题,但是随之而来的是急剧增加的计算量和存储空间.

相较于热图法,回归法有两个主要的优势: 学习是在关键点预测目标下端到端进行监督的,减少了学习和推理时的差异; 其次输出是连续的并且理论上可以达到任意的定位精度,这解决了和热图固有的量化问题.

我们提出来一种把热图法转换成回归法的操作,减少了热图法和回归法之间的差异,这带来了理论上和实践上的收益.

我们的方法简单的把取最大值操作换成积分操作.

 其中,Hk是归一化的热图,欧米伽是它的作用域,预测的点是所有点和概率的积分,归一化指的是把热图上的元素变成非负并且和为1,之前34已经讨论过这个问题我们直接拿过来用

 式2的离散化形式为

其默认处理的是3D热图,深度、宽度和高度分别记为D,H和W,2D热图时D=1。

通过这种方式,任何基于热图的方法都能使用积分操作,我们把其称之为积分回归。

积分回归集热图法和回归法的好处于一身,它是可微的、可以端到端训练,简单,并且没有任何参数。可以和其它任何热图法结合并且几乎不带来任何内存和计算的增长,他可以输出连续的坐标值并且免受量化误差之苦。 

联合3D和2D训练

3D人体之态估计中一个严重的问题就是缺少多样化的训练数据,很多工作致力于结合3D和2D数据进行训练,由于积分回归提供了一个统一的设置,可以很简单的把3D和2D数据结合起来解决数据问题。

最近,42等人提出了一个简单但是很有效的方法来混合2D和3D数据并且展现了巨大的提升。关键之处在于把深度z和xy分开然后使用丰富的2D数据训练。

积分回归可以很自然的用到这个方法上,我们也观察到巨大的提升。然而3D热图仍然不能被丰富的2D数据进行监督,为了解决这个问题,我们进一步把式4分解成两个步骤来分别生成x,y,z热图。例如,对于x目标,我们首先把3D热图分成1维的向量

 然后x坐标可以由下面得到

y和z也睡同理,通过这种方式,xyz在第一步分离开来,使得2D和3D混合训练成为可能。我们在直接和两步法中都获得了显著的提升。 

3方法大量的实验

本文工作的主要贡献就在于对积分回归做了大量的消融实验,图1描述了每个阶段的选择.

29,34等相关工作只在MPII上做了2D的姿态评估,特别是29只提供系统级比较结果,没有任何消融实验,34研究了热图的归一化方法、热图的正则化和骨干网,但实验远没有我们做的全面.

任务,我们的方法是普适的可以无差别的用在2D和3D的任务上,在两类任务上都能获得一致的提升,特别的,在训练中可以混合2D和3D数据,尤其是3D任务可以从中获得更大的收益并且比其它方法高出一大截

网络结构,我们使用了检测、分割等其它视觉任务中普遍使用的简单的结构,它包含一些列的卷积层提取特征,然后加上一个浅的头层 估计目标输出

热图损失,在学术界有关热图损失有好几种选择,最为广泛使用的是MSE均方差,它把预测的热图和基于真值点为中心以标准差为1绘制的高斯块的做差。我们把这种基线称之为H1.

最近Mask RCNN使用了一个mxm的独热编码只有一个位置被标记为关键点,它使用交叉熵损失函数,我们把它称之为H2

另外一种方法使用逐像素的二分类损失,相当于热图上每个位置都进行分类,热图的真值是通过点周边15像素赋值为1获得的,其它的都置为0,我们把这种方法称之为H3.

实验表明,我们的方法可以和任意这些热图损失结合,尽管他们可能有不同的性能,并且分别需要精心的调参,但是他们都获得了提升.

热图和坐标损失结合,对于关键点坐标损失,我们实验了L1和L2距离,我们发现L1都比L2好,因此后面的实验都使用L1损失

此外我们的积分损失还可以是否与热图进行结合,对于那种不与热图结合的方法我们称之为I*,网络结构是类似的,但是没有使用热图损失作为监督,训练监督的信号只是坐标值而不是热图。实验发现不管使不使用热图,积分损失都工作的很好。根据任务不同,最好的性能也有不同,2D任务I1取得最好的性能,而对于3D任务I*性能最好。

图像和热图分辨率,由于量化误差,要想获得高的定位精度就不得不使用大的输入的热图分辨率。然而这也带来了计算量和存储空间的飞涨,特别是3D热图。实验发现我们的积分法对于图像和热图分辨率更鲁棒,这使得它成为实际使用计算量受限时很好的选择。

4数据集和评估指标

我们方法在3种数据集上做了评估.

Human3.6M 是3D人体姿态估计最大的数据集,它是在受控环境下拍摄的,包含3.6M视频片段,11个人(5男6女)有4个不同的视角,作了15个动作。人物的外表和背景都非常简单,精确的3D坐标点是通过运动捕捉设备获得的,之前的很多工作都使用MPJPE作为评估指标,还有一些工作首先使用普氏分析对姿态做一刚性变换进行对齐然后再算MPJPE,我们把其称作PA MPJPE

MPII是单人姿态估计的测试集,图片来自于YouTube视频,包含了人们日常的活动含有复杂的姿态和外表,总共有25k张图片,29k个姿态用于训练,7k个姿态用于测试,PCK用于评估,如果预测的关键点和真值的距离小于头部的一定倍数a就被认为是正确的,指标被记作PCKh@a,通常都选择[email protected],为了评估更高定位精度下的准确率,[email protected]和AUC也会使用

COCO关键点挑战赛 需要复杂、非受限环境下多人检测和之态估计,训练集、验证集、测试集包含200k图片和250k个姿态,150k可以公开获取用于训练和验证,COCO评估定义了OKS和AP作为主要的评估指标,它是通过预测点和真值点并使用人的尺度进行归一化计算得到的

5实验

训练 我们的训练和网络结构在3个数据集上是类似的。ResNet和HourGlass被改造作为骨干网络,ResNet在ImageNet数据集上进行预训练而Houglass是从头开始训练的,那些参数都使用1e-3的正态分布初始化。

热图使用的头层是全卷积,它首先使用反卷积把特征图上采样到需要的分辨率,输出通道固定为256,然后使用一个1x1卷积来获得K个热图,热图基线和我们的积分回归都是基于这些头层的。

为了对比我们还实现了广泛使用的回归头,首先池化然后使用全连接输出3K个关键点坐标,我们把这种基线称之为R1.

Mxnet用于实现,Adam用于优化,输入图片归一化成256x256大小,平移(2%)、缩放(25%)、旋转(30度)和镜像用于数据增强,学习率设置成1e-3,当在测试集上饱和时下降到1e-5,每个方法都训练了足够多的次数直到在验证集上饱和,批大小设为128,使用了4块卡训练,还使用了BN,其它训练细节可以在附件找到
对于积分回归方法(I1,I2,I3以及他们的多级版本),使用基于热图的预训练模型,然后只使用积分回归继续训练积分回归的,我们发现这种方法比同时使用两种损失从头训要好。

5.1在MPII上的实验

由于MPII测试集并没有公开,和大多数做法一样,我们使用从训练集上分开的3k张图作为测试集,训练是在剩下的图上进行的。

积分回归的有效性 表1展示了有竞争力的结果我们首先注意到积分回归法(I1,I2,I3)比他们的对手(也即热图法H1,H2,H3)要好,特别是在[email protected]这个高定位精度指标上。比如I1相比于H1 [email protected]只提升0.5个点,但是[email protected]上提升12.1个点,总体的AUC提升也很显著+5.4个点。在所有的热图法中,H3最不好,使用了积分回归后它提升的最明显,AUC从46.3涨到了57.5(+11.4),这些结果表明积分回归很有效,定位精度上显著的提升来自于积分回归表达的有效性。

出乎意料的是I*也很好,它只是比I1/I2/I3稍微差,在[email protected]和AUC上击败了H1/H2/H3,它还击败了R1,表明积分回归比直接回归要更有效,因为他们使用了几乎相同的网络结构(更别提R1的参数还要更多)

在上面的比较中,我们可以得到两个结论,首先在热图上使用积分回归很有效(I*>H,I*>R),即使没有热图监督也能工作,其次联合训练热图和积分回归获得了两种方法的优势并且取得了最好的结果(I>H,R,I*)

由于H3比另外两个要差并且在3D上很难实现,后面的实验不再和它对比。由于H1和I1在2D姿态中取得了最好的结果,他们会用在后续的2D(MPII和COCO)实验中,图2展示了PCKh曲线指标

图3展示了样例结果,R1在角点和边缘效果不太好,相反H1很难区分局部相似的块,容易陷入到局部最优。积分回归保留了这两种方式的好处,它有效的提升了两种基线的性能。

 分辨率的影响 表2对比了两种输入和2种输出尺寸的结果。

果不其然使用大的输入和热图在所有case里都获得更好的结果。然而相比于H1,I1更少嗯受到分辨率的影响。因此在计算量敏感和小输出的情况下是一个不错的选择。

举例说来,当热图分辨率由256降低一半的时候(a->b),节约了1.1G FLOPs的算量(约15%),I1的AUC只掉了0.67个点而H1掉了4.8。这个差距在128上更明显(c->d),节约了0.3G FLOPs的算量(约17%),I1只掉3.5个点而H1掉12.5个点。

当图片分辨率减半的时候(b->d),减少了4.7G FLOPs,I1只掉11.1,而H1掉18.8。

综上,我们认为积分回归有效的解决了热图中为避免量化误差而不得不使用大分辨率热图的问题。

网络容量的影响 表3总结了不同骨干网络的影响,尽管所有的方法在大的骨干下都有提升,I1仍然比H1要好。虽然大骨干网络提升了性能,但是也需要大的算量。积分回归I1使用ResNet18的基底比H1使用ResNet-101的效果都好,因此在使用中使用小网络骨干的时候更建议和积分回归搭配。

猜你喜欢

转载自blog.csdn.net/minstyrain/article/details/119518642
今日推荐