SMPL模型学习

动画制作相关术语

  1. Vertex(顶点):动画模型可以看成多个小三角形(四边形)组成,每个小三角形就可以看成一个顶点。顶点越多,动画模型越精细。
  2. 骨骼点:人体的一些关节点,类似于人体姿态估计的关键点。每个骨骼点都由一个三元组作为参数去控制(可以查看欧拉角,四元数相关概念)
  3. 蒙皮:将模型从一个姿态转变为另一个姿态,使用的转换矩阵叫做蒙皮矩阵。
  4. 骨骼蒙皮(Rig):建立骨骼点和顶点的关联关系。每个骨骼点会关联许多顶点,并且每一个顶点权重不一样。通过这种关联关系,就可以通过控制骨骼点的旋转向量来控制整个人运动。
  5. 纹理贴图:动画人体模型的表面纹理,即衣服裤子这些。
  6. texture map:将3D多边形网格表面的纹理展开到2D平面,得到纹理图像
  7. 混合形状(BlendShape):控制动画角色运动有两种,一种是上面说的利用Rig,还有一种是利用BlendShape。比如:生成一种笑脸和正常脸,那么通过BlendShape就可以自动生成二者过渡的动画。这种方式相比于利用Rig,可以不定义骨骼点,比较方便。它指相对于base shape的变形(deformation),这种deformation是通常被表示为顶点的偏移量(vertex displacements),是由某种参数有关的function确定的
  8. 混合蒙皮技术(Blend Skinning) :一种模型网格(mesh)随内在的骨骼结构(skeletal structure)变形的方法。网格的每个顶点(vertex)对于不同的关节点有不同的影响权重(weighted influence),顶点在变形时,形变量与这个权重相关
  9. LBS(Linear Blend Skinning ):线性混合蒙皮。使用最广泛,但是在关节处会产生不真实的变形
  10. DQBS(dual-quaternion blend skinning ):双四元数混合蒙皮。
  11. 顶点权重(vertex weights):用于变形网格mesh
  12. uv map:将3D多边形网格展开到2D平面得到 UV图像
  13. 拓扑(topology):重新拓扑是将高分辨率模型转换为可用于动画的较小模型的过程。两个mesh拓扑结构相同是指两个mesh上面任一个三角面片的三个顶点的ID是一样的(如某一个三角面片三个顶点是2,5,8;另一个mesh上也必有一个2,5,8组成的三角面片)
  14. pose-dependent blend shape:姿势相关的混合变形
  15. regressor from shape to joint locations: 形状到关节位置的回归函数

相关算法详解

SMPL

1.介绍

SMPL(Skinned Multi-Person Linear Model)是一种裸体的(skinned),基于顶点(vertex-based)的人体三维模型,能够精确地表示人体的不同形状(shape)和姿态(pose)。

SMPL适用于动画领域,可以随姿态变化自然的变形,并伴随软组织的自然运动。SMPL与现有的许多图形渲染管线都是兼容的。

SMPL是一种可学习的模型,通过训练可以更好地拟合人体的形状和不同姿态下的形变。

它将身体形状分为identity-dependent shape和non-rigid pose-dependent shape。人体可以理解为是一个基础模型和在该模型基础上进行形变的总和,在形变基础上进行PCA,得到刻画形状的低维参数——形状参数(shape);同时,使用运动树表示人体的姿势,即运动树每个关节点和父节点的旋转关系,该关系可以表示为三维向量,最终每个关节点的局部旋转向量构成了SPML模型的姿势参数(pose)。

这种方法与传统的LBS的最大的不同在于其提出的人体姿态影像体表形貌的方法,这种方法可以模拟人的肌肉在肢体运动过程中的凸起和凹陷。因此可以避免人体在运动过程中的表面失真,可以精准的刻画人的肌肉拉伸以及收缩运动的形貌。

在SMPL文章中介绍了SMPL的总体模型,这个模型是通过训练得到,就是一些参数, 该模型中β和θ是其中的输入参数,其中β代表人体高矮胖瘦、头身比等比例的10个参数,是一个10-D的vector。θ是代表人体整体运动位姿和24个关节相对角度的75(24*3+3;每个关节点3个自由度,再加上3个根节点)个参数,是一个3K-D的vector(代表pose,其中K为骨架节点数,3是每个关节具有的3个自由度)。 β参数是Shape Blend Pose参数,可以通过10个增量模板控制人体形状变化: 具体而言:每个参数控制人体形态的变化可以通过动图来刻画。

SMPL骨架的节点个数为24,标注了人体影响姿态的几个主要关节,即:

smpl_names = [
                'Left_Hip', 'Right_Hip', 'Waist', 'Left_Knee', 'Right_Knee',
                'Upper_Waist', 'Left_Ankle', 'Right_Ankle', 'Chest',
                'Left_Toe', 'Right_Toe', 'Base_Neck', 'Left_Shoulder',
                'Right_Shoulder', 'Upper_Neck', 'Left_Arm', 'Right_Arm',
                'Left_Elbow', 'Right_Elbow', 'Left_Wrist', 'Right_Wrist',
                'Left_Finger', 'Right_Finger'
            ]

img

加上position的三个维度,则该模型最终总的输入就是10+3+3x24=85-D的数据。
根据输入的数据,对标准模型进行一步步的变化,大概流程就是:

1. Add shape blend shapes(缩放)
2. Infer shape-dependent joint locations.(根据shape调整joint)
3. Add pose blend shapes(胖瘦变形)
4. Get the global joint location(摆pose)
5. Do skinning(给骨架包裹外皮)
   

最终生成的模型是具有6980个顶点的mesh。

smpl 10个shape参数分别对应的物理意义:(实际有50个参数,开源的只有10个)smpl官网的unity模型可以用slider 控制参数变化

0 代表整个人体的胖瘦和大小,初始为0的情况下,正数变瘦小,负数变大胖(±5)
1 侧面压缩拉伸,正数压缩
2 正数变胖大
3 负数肚子变大很多,人体缩小
4 代表 chest、hip、abdomen的大小,初始为0的情况下,正数变大,负数变小(±5)
5 负数表示大肚子+整体变瘦
6 正数表示肚子变得特别大的情况下,其他部位非常瘦小
7 正数表示身体被纵向挤压
8 正数表示横向表胖
9 正数表示肩膀变宽

2.相关参数:

顶点 vertical: N=6890

关节 joint: K=23

网格对男女具有相同的拓扑结构,空间分辨率可变,干净的四元数结构,分割成多部分,有初始混合权重和骨骼蒙皮。

模型生成的函数:

  1. \(M(\vec \beta ,\vec \theta ;\Phi ) = W\left( {{T_P}(\vec \beta ,\vec \theta ),J(\vec \beta ),\vec \theta ,{\cal W}} \right)\mathbb{R}{^{\left| {\mathop \theta \limits^ \to } \right| \times \left| {\mathop \beta \limits^ \to } \right|}} \mapsto {\mathbb{R}^{3N}}\), SPML function: 将形状和位姿参数映射成顶点。$\Phi $表示学习到的参数。

  2. \(W(\overline{\mathrm{T}}, \mathbf{J}, \vec{\theta}, \mathcal{W}): \mathbb{R}^{3 N \times 3 K \times|\vec{\theta}| \times|\mathcal{W}|} \mapsto \mathbb{R}^{3 N}\): the standard linear blend skinning function. 标准线性混合蒙皮.从模板smpl模型中取vertics in the rest pose \(\overline{\mathrm{T}}\),joint locations J,a pose \(\vec{\theta}\) and the blend weights $ \mathcal{W}$ , 输出posed vertices.

  3. \(B_{P}(\vec{\theta}): \mathbb{R}^{|\theta|} \mapsto \mathbb{R}^{3 N}\):a pose-dependent blend shape function. 一个取决于位姿的混合模型函数。输入是$\mathop \theta \limits^ \to $:一系列位姿参数向量,代表位姿的相关形变。它会和blend shapes加在一起,施加到rest pose上。

  4. \(B_{S}(\vec{\beta}): \mathbb{R}^{\mid \beta \mid} \mapsto \mathbb{R}^{3N}\):a blend shape funchtion. 混合变形函数。输入是形状参数向量(shape parameters)\(\vec{\beta}\),输出是塑造了目标身份的混合形状(a blend shape sculpting the subject identity),也就是人体模型。

  5. \(B_D\): Dynamic blendshapes function

  6. \(J(\vec{\beta}): \mathbb{R}^{\mid \beta \mid} \mapsto \mathbb{R}^{3K}\): a function to predict K joint locations. 一个预测K个关节位置的函数.

模型输入的参数:

\(\beta\):\(\vec{\beta}=\left[\vec{\beta}_{1}, \ldots, \overrightarrow{\beta_{\mid \beta \mid} }\right]^{T}\),形状参数(shape parameter) 其中,\(\mid \beta \mid\)是线性形状系数(linear shape coefficients)的数量

\(\theta\):,\(\vec{\theta}=\left[\vec{\omega}_{0}^{T}, \ldots, \vec{\omega}_{K}^{T}\right]^{T}\)姿态参数(pose parameter).其中,\(w_k\)指关节k相对于运动树(kinematic tree)中的父关节点的旋转轴角度,\({\omega _{\rm{k}}} \in {R^3}\)

$\mathop \omega \limits^ \to $: Scaled axis of rotation; the 3 pose parameters corresponding to a particular joint

\(\vec{\theta}^{*}\):原始姿态(zero pose)

$\overrightarrow \phi $: Dynamic control vector

$\overrightarrow \delta $: Dynamic shape coefficients

要通过训练集训练获取的参数:

\(\overline{\mathrm{T}} \in \mathbb{R}^{3 N}\):Mean shape of the template.平均模型,由N个串联的顶点表示(a mean template shape represented by a vector of N concatenated vertices)

\(\mathcal{S}=\left[\mathbf{S}_{1}, \ldots, \mathbf{S}_{|\vec{\beta}|}\right] \in \mathbb{R}^{3 N \times|\vec{\beta}|}\): shape blend shapes. 所有207个姿势混合形状组成的矩阵 (由姿势引起位移的正交主成分)

\(\mathcal{P}\): Pose blend shapes

\(\mathcal{W} \in \mathbb{R}^{N \times K}\): blend weights. 一组混合权重,BS/QBS混合权重矩阵,即关节点对顶点的影响权重 (第几个顶点受哪些关节点的影响且权重分别为多少) (a set of blend weights)

\(\mathcal{J}:\) Joint regressor matrix. 将rest vertices转换成rest joints的矩阵(获取T pose的关节点坐标的矩阵)[完成顶点到关节的转化]

训练数据:

\(V\): A registration

\(V^P\): Pose dataset registration

\(V^S\): Shape dataset registration

\(\hat{\mathbf{T}}^{P}\):Pose dataset subject shape; body vertices in the template pose

\(\hat{\mathbf{J}}^{P}\):Pose dataset subject joint locations in the template pose

\(\hat{\mathbf{T}}_{\mu}^{P}\):Mean shape of a pose subject; body vertices in the template pose

\(\hat{\mathbf{T}}_{\mu}^{S}\):Shape dataset subject shape; body vertices in the template pose

\(\hat{\mathbf{T}}_{\mu}^{S}\):Mean shape of a subject in the shape dataset; body vertices in the template pose

3.Blend skinning

每个关节j绕轴的旋转角用罗德里格斯公式转换成旋转矩阵:

\[\exp \left(\vec{\omega}_{j}\right)=\mathcal{I}+\widehat{\bar{\omega}}_{j} \sin \left(\left\|\vec{\omega}_{j}\right\|\right)+\widehat{\omega}_{j}^{2} \cos \left(\left\|\vec{\omega}_{j}\right\|\right) \]

其中,\(\vec{\theta}=\left[\vec{\omega}_{0}^{T}, \ldots, \vec{\omega}_{K}^{T}\right]^{T}\),参数通过\(|\vec{\theta}|=3 \times 23+3=72\)定义

\(\bar{\omega}=\frac{\vec{\omega}}{|\mid{\omega}| \mid}\):为旋转的单位范数轴(the unit norm axis of rotation)

\(\hat{\omega}\):斜对称矩阵,通过三维向量\(\bar{\omega}\)组成

\(\mathcal{I}\):3x3单位矩阵

4.顶点坐标计算方法

每个\(\overline{\mathrm{T}}\)中的顶点\({\overline t _i}\)被转换成\(\overline{t}_i^{'}\)(都是齐次坐标系下的列向量):

\[\begin{aligned} \overline{\mathbf{t}}_{i}^{\prime} &=\sum_{k=1}^{K} w_{k, i} G_{k}^{\prime}(\vec{\theta}, \mathbf{J}) \overline{\mathbf{t}}_{i} \\ G_{k}^{\prime}(\vec{\theta}, \mathbf{J}) &=G_{k}(\vec{\theta}, \mathbf{J}) G_{k}\left(\vec{\theta}^{*}, \mathbf{J}\right)^{-1} \\ G_{k}(\vec{\theta}, \mathbf{J}) &=\prod_{j \in A(k)}\left[\begin{array}{c|c}\exp \left(\vec{\omega}_{j}\right) & \mathbf{j}_{j} \\ \hline \overrightarrow{0} & 1\end{array}\right] \end{aligned} \]

其中,\({\omega _{k,i}}\)是混合权重矩阵\(\mathcal{W}\)的元素,代表第\(k\)部分的旋转角度有多少程度影响了第\(i\)个顶点。

\(\exp \left(\vec{\theta}_{j}\right)\)为局部\(3\times 3\)旋转矩阵,对应结点\(j\)

\(G_{k}(\vec{\theta}, \mathbf{J})\) 是关节\(k\)的世界变换

\(G_{k}^{'}(\vec{\theta}, \mathbf{J})\)是移除了变换后的相同变换(the same transformation after removing the transformation due to the rest pose.)

\(\mathbf{J}\):关节回归函数。Predict points from surface. Each 3-element vector in \(J\) corresponding to a single joint center \(j\), is denoted \(\mathbf{j}_j\).

\(A(k)\)定义了关节k的有序集合。

注意,为了与现有的渲染引擎兼容,我们假设\(\mathcal{W}\)是稀疏的,最多允许四个部分影响一个vertex。

为了保持兼容性,我们保留了基本的皮肤函数,而是以一种附加的方式修改模板,并学习一个预测关节位置的函数。

\[\begin{array}{c} M(\vec{\beta}, \vec{\theta})=W\left(T_{P}(\vec{\beta}, \vec{\theta}), J(\vec{\beta}), \vec{\theta}, \mathcal{W}\right) \\ T_{P}(\vec{\beta}, \vec{\theta})=\overline{\mathbf{T}}+B_{S}(\vec{\beta})+B_{P}(\vec{\theta}) \end{array} \]

\(B_{S}(\vec{\beta}),B_{P}(\vec{\theta})\)表示由shape和pose引起的相对于SMPL标准模板的顶点向量\({\overline t _i}\)的偏移量:

\[\overline{\mathbf{t}}_{i}^{\prime}=\sum_{k=1}^{K} w_{k, i} G_{k}^{\prime}(\vec{\theta}, J(\vec{\beta}))\left(\overline{\mathbf{t}}_{i}+\mathbf{b}_{S, i}(\vec{\beta})+\mathbf{b}_{P, i}(\vec{\theta})\right) \]

进行进一步的细化,初始顶点不能直接用平均形状下的顶点,还要考虑到体型与姿势的影响,同样关节也会因为体型而发生改变。于是得到以下扩展:

\[\overline{\mathbf{t}}_{i}^{\prime}=\sum_{k=1}^{K} w_{k, i} G_{k}^{\prime}(\vec{\theta}, J(\vec{\beta}))\left(\overline{\mathbf{t}}_{i}+\mathbf{b}_{S, i}(\vec{\beta})+\mathbf{b}_{P, i}(\vec{\theta})\right) \]

其中,\(\mathbf{b}_{S, i}(\vec{\beta}), \mathbf{b}_{P, i}(\vec{\theta})\) 分别\(B_{S}(\vec{\beta}),B_{P}(\vec{\theta})\)的顶点,表示相对于顶点\({\overline t _i}\)的偏移量。关节中心是身体形状的函数,通过混合蒙皮变形的模板网络是姿态和形状的函数。

5.Shape blend shapes

不同人的身体形状可以被以下的线性函数表示:

\[B_{S}(\vec{\beta} ; \mathcal{S})=\sum_{n=1}^{|\vec{\beta}|} \beta_{n} \mathbf{S}_{n} \]

\(\vec{\beta}=\left[\beta_{1}, \ldots, \beta_{|\vec{\beta}|}\right]^{T}\)\(|\vec{\beta}|\)是线性形状系数的数量。

\(\mathbf{S}_{n} \in \mathbb{R}^{3 N}\): 形状位移的标准正交主分量(orthonormal principal components of shape displacements )

\(\mathcal{S}=\left[\mathbf{S}_{1}, \ldots, \mathbf{S}_{|\vec{\beta}|}\right] \in \mathbb{R}^{3 N \times|\vec{\beta}|}\)为形状位移矩阵。线性函数\(B_{S}(\vec{\beta} ; \mathcal{S})\)能够完全被矩阵\(\mathcal{S}\)定义,通过注册训练网络学习。

右边的值表示学习过的参数,而左边的值是动画器设置的参数;为了便于标记,当学习的参数在训练中没有得到明确的优化时,通常忽略这些参数。

6.Pose blend shapes

定义\(R:\mathbb{R}^{|\vec{\theta}|} \mapsto \mathbb{R}^{9 K}\)为把一个位姿向量映射到连接部分相对旋转矩阵的向量上\(\vec{\theta}\),由于我们的骨骼(rig)有23个关节,则\(R(\vec{\theta})\)是一个23x9=207维的向量。它的元素是关节旋转角的sin和cos函数,因此它是一个对于\(\vec{\theta}\)的非线性函数。

但是作者又定义了一个可以让pose blend shape线性的函数:\(R^{*}(\vec{\theta})=(R(\vec{\theta})-R(\vec{\theta}^{*}))\),其中,\(\vec{\theta}^{*}\)定义了rest pose. 定义\(R_n(\vec{\theta})\)\(R(\vec{\theta})\)的第n个向量,则与静止模板的偏差为:

\[B_{P}(\vec{\theta} ; \mathcal{P})=\sum_{n=1}^{9 K}\left(R_{n}(\vec{\theta})-R_{n}\left(\vec{\theta}^{*}\right)\right) \mathbf{P}_{n} \]

上式代表将姿势带来的形状位移正交分解,进行计算,不过要减去休息状态的姿势的影响,这样可以保障pose blend shapes在静止状态时贡献为0。

其中,\(\mathbf{P}_{n} \in \mathbb{R}^{3 N}\)表示顶点偏移的向量。

\(\mathcal{P}=\left[\mathbf{P}_{1}, \ldots, \mathbf{P}_{9 K}\right] \in \mathbb{R}^{3 N \times 9 K}\)是所有207个pose blend shape组成的矩阵。\(B_{P}(\vec{\theta})\)完全被矩阵\(\mathcal{P}\)定义。

  1. Joint locations

不同的体型有不同的关节位置,每个关节由其在静止位姿(rest pose)中的3D位置表示。至关重要的是,这些数据必须是准确的,否则在使用皮肤化方程建立模型时将会出现伪影关节。关节3D位置相对于身体形状的函数如下:

\[J(\vec{\beta} ; \mathcal{J}, \overline{\mathbf{T}}, \mathcal{S})=\mathcal{J}\left(\overline{\mathbf{T}}+B_{S}(\vec{\beta} ; \mathcal{S})\right) \]

其中,\(\mathcal{J}\)是将rest vertices转换成rest joints 的矩阵,我们从不同的人在不同的姿势的例子中学习回归矩阵\(\mathcal{J}\)。这个矩阵models哪些网格顶点是重要的,以及如何结合它们来估计关节位置。

8.SPML模型

SMPL模型的模型参数定义为:\(\Phi = \{ \overline T , \mathcal{W}, \mathcal{S}, \mathcal{J}, \mathcal{P}\}\),通过变换\(\vec{\beta}, \vec{\theta}\)可以得到不同的人体形状和姿态。SMPL最后被定义为:

\[M(\vec \beta ,\vec \theta ;\Phi ) =W\left(T_{P}(\vec{\beta}, \vec{\theta} ; \overline{\mathbf{T}}, \mathcal{S}, \mathcal{P}), J(\vec{\beta} ; \mathcal{J}, \overline{\mathbf{T}}, \mathcal{S}), \vec{\theta}, \mathcal{W}\right) \]

每个顶点被转换成:

\[\mathbf{t}_{i}^{\prime}=\sum_{k=1}^{K} w_{k, i} G_{k}^{\prime}(\vec{\theta}, J(\vec{\beta} ; \mathcal{J}, \overline{\mathbf{T}}, \mathcal{S})) \mathbf{t}_{P, i}(\vec{\beta}, \vec{\theta} ; \overline{\mathbf{T}}, \mathcal{S}, \mathcal{P}) \]

其中,

\[\mathbf{t}_{P, i}(\vec{\beta}, \vec{\theta} ; \overline{\mathbf{T}}, \mathcal{S}, \mathcal{P})=\overline{\mathbf{t}}_{i}+\sum_{m=1}^{|\vec{\beta}|} \beta_{m} \mathbf{s}_{m, i}+\sum_{n=1}^{9 K}\left(R_{n}(\vec{\theta})-R_{n}\left(\vec{\theta}^{*}\right)\right) \mathbf{p}_{n, i} \]

代表施加blend shapes后的顶点i,\(\mathbf{s}_{m, i}, \mathbf{p}_{n, i} \in \mathbb{R}^{3}\)是shape and pose blend shapes对应模板顶点\(\bar{\mathbf{t}}_{i}\)的元素.

最后,文章用LBS,DQBS去训练参数,分别为SMPL-LBS,SMPL-DQBS,然后默认SMPL-DQBS为它们研发的好模型,因此后边都叫SMPL

9.训练

训练目标是训练\(\Phi = \{ \overline T , \mathcal{W}, \mathcal{S}, \mathcal{J}, \mathcal{P}\}\) 的参数来最小化数据集上最小顶点的重建误差。因为这个模型分解了shape和pose,因此可以分开训练。先用多姿态数据集训练 \(\{\mathcal{W}, \mathcal{J}, \mathcal{P}\}\),再用多形状数据集训练 \(\{ \overline T , \mathcal{S}\}\)

参考:

https://blog.csdn.net/weixin_45915902/article/details/108654466

https://blog.csdn.net/qq_34296627/article/details/103158923

https://blog.csdn.net/qq_34296627/article/details/103158923?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-7.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-7.control

posted @ 2021-01-24 18:35  sariel_sakura  阅读(11663)  评论(0编辑  收藏  举报