最近拜读了Leibniz Universitat Hannover AI发表在CVPR2019的文章《RepNet: Weakly Supervised Training of an Adversarial Reprojection Network for 3D Human Pose Estimation》,本文的新颖之处在于通过网络estimate了相机的参数,将相机的约束引入到pose estimation中,并采用GAN去生成合理的3D Pose。
文章简介:
出处: CVPR 2019
题目: 《RepNet: Weakly Supervised Training of an Adversarial Reprojection Network for 3D Human Pose Estimation》
作者: B a s t i a n W a n d t Bastian Wandt BastianWandt and B o d o R o s e n h a h n Bodo Rosenhahn BodoRosenhahn
单位: Leibniz Universitat Hannover
文章地址: https://arxiv.org/abs/1902.09868
下图为摘要的思路框架图。具体不在细讲,下图应该能够比较清晰的展示摘要的内容。
与常规文章不同,本文着重在第一段集中写了Motivation,大部分内容都在介绍文章所提出的方法。
下面是本文的Motivation(其中有我自己总结的)。作者从三个方面去讲。
相关工作部分分别从三个方面进行介绍。首先是总结之前的相关工作可以分为两大类,然后分别从两方面进行方法总结介绍。
又到了本文的重头戏——方法论部分。首先我们来看一下方法论的文章结构,作者是如何组织的。如下图所示:
首先,我们先来看本文方法的整体结构。如下图所示:
本文提出的方法主要包括三部分:(1)Pose和Camera Estimation网络;(2)Critic 网络(Discriminator);(3)Reprojection 网络。
其中,第一部分的Pose and Camera Estimation网络采用双分支结构,一路网络estimate pose,另一路网络estimate相机参数。
先来看一下网络的输入输出。
输入: 2n维的向量,其中n为骨架点个数。即将2D骨架(通过Hourglass获取)拉成了向量的形式;
输出: 3n维的向量,即Pose Estimation 网络生成的3D Pose。
下面,详细介绍每一部分的实现。
输入的2D骨架结构是通过Hourglass网络结构提取到的。在输入网络之前,2×n 的骨架数据被拉伸成了2n维的向量,其中n是骨架关节点数量。
本文提到的Pose Generator Network 和 Camera Network采用了Residual Block。每个Block有两个隐层,每层1000个神经元。除了最后的输出不同,两个分支采用的网络结构是一致的。其中,Pose Estimation Network输出是3n维的向量;Camera Network的输出是6维的向量(相机的内置参数有3个)。在两个分支的网络输出之后,对输出结果进行reshape操作,如上图所示。Reshape操作的目的是为后面的reprojection做铺垫。
在Camera Network输出后,计算第一个loss值,
Reprojection Layer主要是将生成的3D Pose映射成2D的Pose,从而可以将输入和输出联系起来,辅助模型训练。
**在这里,映射层仅仅只起到映射的作用,没有任何需要训练学习的参数。**那么,它到底完成了什么样的映射呢?请看下图。
红色虚线框内即映射层。它的输入分别是Pose Estimation Network 和 Camera Network 的输出。利用3D Pose 和相机内置参数映射得到2D Pose,即,
Critic Network实则是GAN中的Discriminator。本文所采用的是WGAN,具体的W-Loss文中没有说明。
该部分网络最大的特点就是将Kinematic Chain Space (KCS)条件引入到模型中。一方面引入了人体骨架的运动信息,另一方面建模了人体结构的对称性。具体的网络结构看下图:
该部分亦采用双分支结构。其中第一个分支引入了KCS条件,输入为3*n的3D Pose结构;第二个分支为纯全连接层,输入为3n维的矩阵。两个分支的全连接层也是采用residual block的结构(同第一部分的结构相同),每一层都有1000个神经元。经过两个分之处理之后,将两个特征concate,最后经过一个全连接层输出,最后一个全连接层的输出维度为1。
KCS 条件
KCS条件实则是根据人体每段骨骼长度进行计算的。首先,要计算出每段相连骨骼的长度,即:
写成矩阵的形式,如下:
其中的C可以理解为一个邻接矩阵,只不过每一列的非零元素包括1和-1。
然后,KCS矩阵就可以通过B的转置和B的乘积得到了:
可以清楚地看到,KCS矩阵是一个对阵矩阵,引入了人体结构的对称性特点。其对角线元素代表了每段骨骼的长度,保证了生成Pose的Size大小;除对角线以外的元素实则表示了骨骼运动的角度信息,因为它们实际上可以看作夹角的cos值。
最后,训练的loss应该是文中提到的三个loss function的综合。一个是WGAN的loss,一个是相机的loss以及Reprojection的loss。具体的loss表达式没有明确给出。
以上便是本文方法的主要思想。下面即使文章的实验组织,就不在列举实验结果,感兴趣的话可以阅读原文。