End-to-end Recovery of Human Shape and Pose (CVPR2018)
参考:https://blog.csdn.net/sinat_28699719/article/details/93596169
参考:https://zhuanlan.zhihu.com/p/256358005
1、文章提出了一个端到端的方法从二维图像恢复三维人体模型的框架。
2、现有的一些从单张图片恢复人体3D网格的方法专注于恢复人体3D关键点的坐标位置,然而这样做有如下不足之处:
- 关键点是稀疏离散的,但是人体在3D空间的表示是密集连续的。
- 3D关键点的单独表示并不能约束每个关键点之间的关系,仅仅通过关键点并不能很好的预测人体姿势与体型。
3、针对上述问题,作者提出了他们的方法:
- 以kinematic tree的形式表示每个关键点的3D旋转角度矩阵,以此来捕获3D的头部和肢体的角度方向。预测角度可以确定肢体的对称性,以及肢体的长度等信息的合理性。
- 通过学习关键点的角度信息可以使得输出的3D模型在姿势和体型方面的合理性,避免了不合理的姿势和体型。
4、现有的重建人体网格的方法大多数是一种两阶段的方法,即先预测2D关键点位置,之后再预测3D模型参数。然而这种方法过度依赖2D关键点信息,丢失了图片信息。本文提出了一种端到端的解决方案:直接从图像像素信息中获取3D模型参数。
然而在训练这种端到端的模型的时候会遇到一下困难:
- 缺少足够带有3D标注的ground truth,目前现有的图像数据集都是在特定环境下获取的,不能反映真实的情景。
- 从二维到三维的变换具有模棱两可性,会造成深度信息的丢失。许多不同的三维模型都可以映射为同一个二维模型,从二维映射到三维时也有可能生成不符合常理的结果。
针对上述问题,文章提出了一种新颖的解决方案:使用两种数据集,一种是带有关键点标注的二维图像,一种是带有姿势和体型信息的3D网格。使用这两种没有关联性的数据集进行训练。输入一张图像,首先获取到3D网格参数和相机参数,之后将3D关键点映射回二维平面,判断是否能与原图中的2D关键点契合。使用这种2D到3D之后再到2D的方法,就可以很好的利用不含三维标注信息的数据集进行训练。
另一个挑战是,以前的方法在预测模型参数的时候将其看作是一个分类问题来处理,这样得到的结果是离散化的,在精度上有所不足。因此本文采用一种带有反馈的迭代方式,将其看作是一个回归问题。
综上,这篇文章的方法有以下亮点:
- 直接从图像特征获取到3D网格参数,不同于前面提到的两阶段方法,这样不用分两步进行训练,也避免了图像中信息的丢失。
- 生成的是3D网格而不像以往的方法生成3D骨架,这样生成的3D网格有更多了利用价值。
- 使用端到端的方式进行训练,有更高的精度和更短的运行时间。
- 使用新的训练方式,可以通过2D数据学习3D信息。
SMPL模型:《SMPL:A Skinned Multi-Person Linear model》
SPML是一种可分离shape和pose的模型,是由标准线性blend skinning
扩展而来,主要由以下几个部分:Blend skinning
、Shape blend shapes
、Pose blend shapes
与Joint locations
。关于这几部分作用如下图所示:
(a)(Blend skinning
,即标准的3D mesh
模型)中的是有平均顶点集以及权重所描述的人体模型。
(b)(图b在图a基础上对应扩展Shape blend shapes
,即表示对3D模型进行缩放,胖瘦等操作)平均顶点集在体态的影响下发生了位移,同事体态对关节J 也产生影响。
(c)(图c在图b基础上对应扩展Pose blend shapes
,即表示3D模型在各个pose方向上的变形)平均顶点集在体态和动作的两重影响下发生的位移;注意此时的图并未有任何的pose.
(d)(图d在图c基础上对应扩展Joint locations
,并通过二次skinning根据动作进行调整3D mesh)shape和pose双重影响下的SMPL模型,总共四项,分别为经过体型与姿态影响的顶点集、经过体型影响的关节,以及姿势和权重
SMPL模型可用以下公式定义:
tip: M是SMPL函数;W:是Skinning函数;是pose blendshapes function;是shape blendshapes function;J是关节回归(joints regressor),从surface得到joints.
为通过和对标准模型进行体型和姿势上的偏移,其中为人体标准模板模型。J 表示为从体型参数到关键点位置的映射,ω 为混合蒙皮函数。θ 和 β 分别为姿势参数与体型参数。
SMPL的输入是β和θ,只需要输入一个10-D的vector β(代表shape,由PCA对数据集人体进行主成分分析得到)和一个3K-D的vector θ(代表pose,其中K为骨架节点数,3是每个关节具有的3个自由度),就可以输出对应的三维人体模型。加上camera的三个维度,则该模型最终总的输入就是10+3+3x24=85-D的向量。为了把3D joint
映射到2D,采用如下公式:
带有反馈的3D迭代回归:
前面提到,本文将3D模型参数的预测看作是一个回归问题,3D回归模块的目的是输出SMPL模型所需的85维参数 。3D-2D步骤的2D关节点映射用如下损失函数进行约束:
其中是第i个2D关键点的ground truth, 表示关键点是否可见,1为可见,0为不可见。
因为3D表示包含了旋转角的信息,直接对Θ 进行一次回归预测是很难的,本文以IEF(iterative error feedback)的形式对Θ 进行回归:每一次迭代输入图像特征和当前参数 ,输出为,之后更新 ,初始化的为均值 。
当有可利用的带有3D ground truth的数据集时,可以用如下公式来定义3D loss:
模型整体的loss用如下公式来定义:
当有3D的ground truth的时候t为1,否则t为0 。
如果在每次迭代的时候都用最终的目标函数进行监督会造成过拟合和陷入局部最小值,所以只在最终预测的时候使用和 ,但是在每一步预测的时候都使用 。
分解对抗先验:
训练鉴别网络D用来告知用于SMPL的参数是否合乎常理,即是否适用于是一个正常的人体模型。SMPL模型所具有的因式分解的形式使得训练很高效也很稳定。利用SMPL对姿势和体型的分解,分别训练鉴别器用于姿势和体型。
pose是基于kinematic树的,所以我们进一步分解姿势鉴别器,针对每个关键点的旋转角度进行训练。为了获得关键点在整个kinematic树上的分布,还需要学习一个包含所有关键点旋转角度的鉴别器。所有的姿势鉴别器共享一个公共的旋转角矩阵的特征空间,只有在最后的分类器后才分别进行各自的学习。???
令E表示包含图像编码和3D模型的编码器,该编码器的对抗损失函数为:
每一个鉴别器的目标为: