paper title: SMPL: A Skinned Multi-Person Linear Model
paper link: http://files.is.tue.mpg.de/black/papers/SMPL2015.pdf
oral or demo video:https://www.youtube.com/watch?time_continue=98&v=kuBlUyHeV5U&feature=emb_logo
project: https://smpl.is.tue.mpg.de/
github: https://smpl.is.tue.mpg.de/signup
conf & anthor: ACM ToG 2015; Matthew Loper et. al (MPII & ILM)
相关知识链接:
MPII Human Shape
what is blendshape
what is ‘bake’ in CG?
what is rigging?
whta is shape displacement?
这篇文章的主要内容是要通过学习得到一个模型可以根据一些输入的参数创建人体动画模型,可以做到
目标函数:自己生成的model和registered meshes之间每个顶点的差异
训练数据:1786个高分辨率3D扫描模型(为了学习到人在不同的姿势下模型是如何变形的),将自己的模型与3D扫描模型一一align得到训练集;
手工设计的人体mesh:顶点数 N = 6890 N = 6890 N=6890; 关节点数目 K = 23 K = 23 K=23;
根据标准蒙皮操作,模型可以通过一个平均模板形状来定义,并由以下元素来表示:
三个主要变换函数:
上述这些函数生成的corrective blend shapes都加到rest pose上。最后,一个标准的blend skinning函数 W ( ⋅ ) W(·) W(⋅)用来在以joint location回归函数 J ( β ⃗ ) J(\vec{\beta}) J(β)估计的这些关节点为中心旋转顶点,并使用blend weights进行平滑。 最后的结果是一个模型,根据形状和姿态参数向量映射得到一个顶点集合:
M ( β ⃗ , θ ⃗ ; Φ ) : R ∣ θ ⃗ ∣ × ∣ β ⃗ ∣ ↦ R 3 N M(\vec{\beta},\vec{\theta};\Phi) : \mathbb{R}^{|\vec{\theta}| \times |\vec{\beta}|} \mapsto \mathbb{R}^{3N} M(β,θ;Φ):R∣θ∣×∣β∣↦R3N
其中 Φ \Phi Φ是学习到的一个参数,下文详述。这里做一个说明,变换符号(如上面的 M M M)所带的参数列表中,分号后面的是通过训练学习得到的( Φ \Phi Φ),而分号前面的是系统已知的或是由外部输入的( β ⃗ , θ ⃗ \vec{\beta},\vec{\theta} β,θ)。
1. Blend skinning
人物模型(body)的姿态采用标准的skeletal rig(what is rigging)。这里使用的rig有 K = 23 K=23 K=23个关节点,第 k k k个部位的绕坐标轴的局部旋转为 w ⃗ k ∈ R 3 \vec{w}_k \in \mathbb{R}^3 wk∈R3;那么前面提到的pose parameter的形式就是:
θ ⃗ = [ w ⃗ 0 T , . . . , w ⃗ K T ] T \vec{\theta} = [\vec{w}_0^T,...,\vec{w}_K^T]^T θ=[w0T,...,wKT]T
参数数目为 3 × 23 + 3 = 72 3 \times 23 + 3 = 72 3×23+3=72,其中加的3为根关节的位置。
对每个关节 j j j关于各个轴的旋转角度可以使用罗德里格公式转换为旋转矩阵:
e x p ( w ⃗ j ) = I + w ‾ j ^ s i n ( ∣ ∣ w ‾ j ∣ ∣ ) + w ‾ j 2 ^ c o s ( ∣ ∣ w ‾ j ∣ ∣ ) exp(\vec{w}_j) = \mathcal{I} + \hat{\overline{w}_j}sin(||\overline{w}_j||) + \hat{\overline{w}_j^2}cos(||\overline{w}_j||) exp(wj)=I+wj^sin(∣∣wj∣∣)+wj2^cos(∣∣wj∣∣)
其中:
那么,标准的LBS(Linear Blend Skinning)函数为:
W ( T ‾ , J , θ ⃗ , W ) : R 3 N × 3 K × ∣ θ ⃗ ∣ × ∣ W ∣ ↦ R 3 N W(\overline{T},J,\vec{\theta}, \mathcal{W}) : \mathbb{R}^{3N \times 3K \times |\vec{\theta}| \times |\mathcal{W}|} \mapsto \mathbb{R}^{3N} W(T,J,θ,W):R3N×3K×∣θ∣×∣W∣↦R3N
其中:
OK,到这里就可以计算 T ‾ \overline{T} T中的第 i i i个顶点的变换:
t ‾ i ′ = ∑ k = 1 K w k , i G k ′ ( θ ⃗ , J ) t ‾ i \overline{t}_i^{'} = \sum_{k=1}^Kw_{k,i}G_k^{'}(\vec{\theta},J)\overline{t}_i ti′=k=1∑Kwk,iGk′(θ,J)ti
G k ′ ( θ ⃗ , J ) = G k ( θ ⃗ , J ) G k ( θ ∗ ⃗ , J ) − 1 G_k^{'}(\vec{\theta},J) = G_k(\vec{\theta},J)G_k(\vec{\theta^{*}},J)^{-1} Gk′(θ,J)=Gk(θ,J)Gk(θ∗,J)−1
G k ( θ ⃗ , J ) = ∏ j ∈ A ( k ) [ e x p ( w ⃗ j ) j j 0 ⃗ 1 ] G_k(\vec{\theta},J) = \prod_{j \in A(k)} \left[ \begin{matrix} exp(\vec{w}_j) & j_j \\ \vec{0} & 1 \end{matrix} \right] Gk(θ,J)=j∈A(k)∏[exp(wj)0jj1]
其中:
至此,再看模型 M ( β ⃗ , θ ⃗ ; Φ ) M(\vec{\beta},\vec{\theta};\Phi) M(β,θ;Φ):
M ( β ⃗ , θ ⃗ ) = W ( T p ( β ⃗ , θ ⃗ ) , J ( β ⃗ ) , θ ⃗ , W ) M(\vec{\beta},\vec{\theta}) = W(T_p(\vec{\beta},\vec{\theta}),J(\vec{\beta}),\vec{\theta},\mathcal{W}) M(β,θ)=W(Tp(β,θ),J(β),θ,W)
T p ( β ⃗ , θ ⃗ ) = T ‾ + B s ( β ⃗ ) + B p ( θ ⃗ ) ) T_p(\vec{\beta},\vec{\theta}) = \overline{T} + B_s(\vec{\beta}) + B_p(\vec{\theta})) Tp(β,θ)=T+Bs(β)+Bp(θ))
有了上面的定义, t ‾ i ′ \overline{t}_i^{'} ti′可表示为:
t ‾ i ′ = ∑ k = 1 K w k , i G k ′ ( θ ⃗ , J ( β ⃗ ) ) ( t ‾ i + b S , i ( β ⃗ ) + b P , i ( θ ⃗ ) ) \overline{t}_i^{'} = \sum_{k=1}^K w_{k,i} G_k^{'}(\vec{\theta},J(\vec{\beta}))(\overline{t}_i + b_{S,i}(\vec{\beta}) + b_{P,i}(\vec{\theta}) ) ti′=k=1∑Kwk,iGk′(θ,J(β))(ti+bS,i(β)+bP,i(θ))
其中:
2. Shape blend shapes
不同人的体型(body shape)可以用一个线性函数 B S B_S BS表示为:
B S ( β ⃗ ; S ) = ∑ n = 1 ∣ β ⃗ ∣ β n S n B_S(\vec{\beta};\mathcal{S}) = \sum_{n=1}^{|\vec{\beta}|}\beta_{n}S_{n} BS(β;S)=n=1∑∣β∣βnSn
其中:
3. Pose blend shapes
从上面可以知道,姿态向量 θ ⃗ \vec{\theta} θ包含K个关节的旋转角度和根关节的位置,这里现将姿态向量 θ ⃗ \vec{\theta} θ映射为旋转矩阵,每个关节的的旋转转换为一个 3 × 3 3 \times 3 3×3的旋转矩阵:
R : R ∣ θ ⃗ ∣ ↦ R 9 K R:\mathbb{R}^{|\vec{\theta}|} \mapsto \mathbb{R}^{9K} R:R∣θ∣↦R9K
现在定义pose blend shape:
R ∗ ( θ ⃗ ) = ( R ( θ ⃗ ) − R ( θ ∗ ⃗ ) ) R^*(\vec{\theta}) = ( R(\vec{\theta}) - R(\vec{\theta^*}) ) R∗(θ)=(R(θ)−R(θ∗))
那么通过姿势作用得到的顶点与rest template之间的偏差为:
B P ( θ ⃗ ; P ) = ∑ n = 1 9 K ( R ( θ ⃗ ) − R ( θ ∗ ⃗ ) ) P n B_P(\vec{\theta};\mathcal{P}) = \sum_{n=1}^{9K}( R(\vec{\theta}) - R(\vec{\theta^*}))P_n BP(θ;P)=n=1∑9K(R(θ)−R(θ∗))Pn
其中:
4. Joint locations
不同的body shape的关节位置不同,每个关节在rest pose中是一个3D的位置。这里,将关节定义为body shape β ⃗ \vec{\beta} β的函数:
J ( β ⃗ ; J , T ‾ , S ) = J ( T ‾ + B S ( β ⃗ ; S ) ) J(\vec{\beta};\mathcal{J},\overline{T},\mathcal{S}) = \mathcal{J}(\overline{T}+B_S(\vec{\beta};\mathcal{S})) J(β;J,T,S)=J(T+BS(β;S))
其中:
5. SMPL model
介绍完以上这些可以,可以正式写出SMPL模型 Φ \Phi Φ的所有参数:
Φ = { T ‾ , W , S , J , P } \Phi = \{{\overline{T},\mathcal{W},\mathcal{S},\mathcal{J},\mathcal{P}}\} Φ={T,W,S,J,P}
再来回顾一下这些符号:
到这里可以写出SMPL模型的定义:
M ( β ⃗ , θ ⃗ , Φ ) = W ( T P ( β ⃗ , θ ⃗ ; T ‾ , S , P ) , J ( β ⃗ ; J , T ‾ , S ) , β ⃗ , W ) M(\vec{\beta},\vec{\theta},\Phi)=W(T_P(\vec{\beta},\vec{\theta};\overline{T},\mathcal{S},\mathcal{P}),J(\vec{\beta};\mathcal{J},\overline{T},\mathcal{S}),\vec{\beta},\mathcal{W}) M(β,θ,Φ)=W(TP(β,θ;T,S,P),J(β;J,T,S),β,W)
那么对于mesh中的一个顶点(序号为i),所做的变换为:
t i ′ = ∑ k = 1 K w k , i G k ′ ( θ ⃗ , J ( β ⃗ ; J , T ‾ , S ) ) t P , i ( β ⃗ , θ ⃗ ; T ‾ , S , P ) {t}_i^{'}=\sum_{k=1}^{K}w_{k,i}G_k^{'}(\vec{\theta},J(\vec{\beta};\mathcal{J},\overline{T},\mathcal{S})) t_{P,i}(\vec{\beta},\vec{\theta};\overline{T},\mathcal{S},\mathcal{P}) ti′=k=1∑Kwk,iGk′(θ,J(β;J,T,S))tP,i(β,θ;T,S,P)
其中 w k , i w_{k,i} wk,i是blend weight, G k ′ G_k^{'} Gk′前面提到是从父关节到当前关节“累计”旋转变换并除去初始变换的一个“变换偏移量”, t P , i t_{P,i} tP,i是顶点初始状态+体型(shape)差异变形+姿态(pose)差异变形
:
t P , i ( β ⃗ , θ ⃗ ; T ‾ , S , P ) = t ‾ i + ∑ m = 1 ∣ β ⃗ ∣ β ⃗ s m , i + ∑ n = 1 9 K ( R n ( θ ⃗ ) − R n ( θ ∗ ⃗ ) ) p n , i t_{P,i}(\vec{\beta},\vec{\theta};\overline{T},\mathcal{S},\mathcal{P}) = \overline{t}_i+\sum_{m=1}^{|\vec{\beta}|}\vec{\beta}s_{m,i}+\sum_{n=1}^{9K}(R_n(\vec{\theta})-R_n(\vec{\theta^*}))p_{n,i} tP,i(β,θ;T,S,P)=ti+m=1∑∣β∣βsm,i+n=1∑9K(Rn(θ)−Rn(θ∗))pn,i
其中 s m , i , p n , i ∈ R 3 s_{m,i},p_{n,i} \in \mathbb{R}^3 sm,i,pn,i∈R3分别是顶点 t ‾ i \overline{t}_i ti的shape和pose blend shape。
SMPL参数的训练过程是在shape和pose数据集上最小化重建误差得到的。
现分别使用 V j P V_j^P VjP和 V j S V_j^S VjS表示multi-pose和multi-shape数据集中的第 j j j个mesh。
1. Pose parameter training
pose parameter主要是训练 { J , W , P } \{{\mathcal{J},\mathcal{W},\mathcal{P}}\} {J,W,P}(joint location predict, blend weight和pose displacement)。
前面已经说过multi-pose数据集包含了40个人的1786个registration,这里用下标 i i i表示第 i i i个人,下标 j j j表示第 j j j个registration。在pose数据集中,不同的registration的姿态是不同的,表示为 θ ⃗ j \vec{\theta}_j θj;
根据前面说的 W ( ⋅ ) W(·) W(⋅):
M ( β ⃗ , θ ⃗ ) = W ( T p ( β ⃗ , θ ⃗ ) , J ( β ⃗ ) , θ ⃗ , W ) M(\vec{\beta},\vec{\theta}) = W(T_p(\vec{\beta},\vec{\theta}),J(\vec{\beta}),\vec{\theta},\mathcal{W}) M(β,θ)=W(Tp(β,θ),J(β),θ,W)
这里可以写出在pose数据集上的 W ( ⋅ ) W(·) W(⋅)的形式为:
W ( T ^ s ( j ) P + B P ( θ ⃗ ; P ) , θ ⃗ ) , J ^ s ( j ) P , θ ⃗ , W ) W(\hat{T}_{s(j)}^P + B_P(\vec{\theta};\mathcal{P}),\vec{\theta}),\hat{J}_{s(j)}^P,\vec{\theta},\mathcal{W}) W(T^s(j)P+BP(θ;P),θ),J^s(j)P,θ,W)
其中:
综合上面所说的 W ( ⋅ ) W(·) W(⋅)的过程就是当前(第j个)mesh所属人物的在姿态 θ ⃗ \vec{\theta} θ作用下产生的变形,而这个变形的过程涉及到一些参数是需要学习的,这里就是 P \mathcal{P} P和 W \mathcal{W} W。变形之后得到一个新的mesh,学习的目标就是找到最佳的参数是变形之后的结果mesh和数据集中对其好的mesh之间的差异最小。
为了完成这个学习过程,定义一个包含数据项和正则项的目标函数:
E = E D + λ Y E Y + λ J E J + λ P E P + E W E = E_D+\lambda_YE_Y+\lambda_JE_J+\lambda_PE_P+E_W E=ED+λYEY+λJEJ+λPEP+EW
其中:
下面对目标函数中的这几项分别进行阐述:
(1) E D E_D ED
E D ( T ^ P , J ^ P , W , P , Θ ) = ∑ j = 1 P r e g ∣ ∣ V j P − W ( T ^ s ( j ) P + B P ( θ ⃗ ; P ) , θ ⃗ ) , J ^ s ( j ) P , θ ⃗ , W ) ∣ ∣ 2 E_D(\hat{T}^P,\hat{J}^P,\mathcal{W},\mathcal{P},\Theta)=\sum_{j=1}^{P_{reg}}||V_j^P - W(\hat{T}_{s(j)}^P + B_P(\vec{\theta};\mathcal{P}),\vec{\theta}),\hat{J}_{s(j)}^P,\vec{\theta},\mathcal{W})||^2 ED(T^P,J^P,W,P,Θ)=j=1∑Preg∣∣VjP−W(T^s(j)P+BP(θ;P),θ),J^s(j)P,θ,W)∣∣2
其中:
要训练的参数数目:
上面的 W \mathcal{W} W中的4
是因为这里使用了Sparse SMPL,也就是每个顶点最多受到4个关节的影响。
(2) E Y E_Y EY
E Y E_Y EY是对称正则项,也就是激励template mesh和joint为对称的,对左右不对称的情况进行惩罚:
E Y ( J ^ P , T ^ P ) = ∑ i = 1 P s u b j λ U ∣ ∣ J ^ i P − U ( J ^ i P ) ∣ ∣ 2 + ∣ ∣ T ^ i P − U ( T ^ i P ) ∣ ∣ 2 E_Y(\hat{J}^P,\hat{T}^P)= \sum_{i=1}^{P_{subj}}\lambda_U||\hat{J}_i^P-U(\hat{J}_i^P)||^2+||\hat{T}_i^P-U(\hat{T}_i^P)||^2 EY(J^P,T^P)=i=1∑PsubjλU∣∣J^iP−U(J^iP)∣∣2+∣∣T^iP−U(T^iP)∣∣2
其中 U ( T ) U(T) U(T)的作用是沿着矢状面(sagittal plane 指将躯体纵断为左右两部分的解剖平面)左右翻转人体;
(3) E J E_J EJ
文中将人体分割为24个部分,根据这个分割情况可以得到不同部分之间的连接的一个“顶点序列”,是一个环状的顶点集合,使用一个回归器 J I \mathcal{J}_I JI计算joint的初始中心,实际上就是对这个顶点集合里面的顶点的坐标做平均。当估计joint中心的时候,锁甲的正则项就是让估计的中心接近这个初始中心:
E J ( T ^ P , J ^ P ) = ∑ i = 1 P s u b j ∣ ∣ J I T ^ i P − J ^ i P ∣ ∣ 2 E_J(\hat{T}^P,\hat{J}^P) = \sum_{i=1}^{P_{subj}}||\mathcal{J}_I\hat{T}_i^P-\hat{J}_i^P||^2 EJ(T^P,J^P)=i=1∑Psubj∣∣JIT^iP−J^iP∣∣2
(4) E P E_P EP
为了防止pose-dependent blend shape的过拟合,这里对 P \mathcal{P} P也做了一个正则化,使其趋向于0:
E P ( P ) = ∣ ∣ P ∣ ∣ F 2 E_P(P)=||\mathcal{P}||_F^2 EP(P)=∣∣P∣∣F2
其中 ∣ ∣ ⋅ ∣ ∣ F ||·||_F ∣∣⋅∣∣F是Frobenius范数,实际上就是矩阵中对应元素的平方和再开平方.
(5) E W E_W EW
根据人体的分割结果,通过"diffus"可以得到一个初始的blend weight于 W I \mathcal{W}_I WI,现在添加一个正则项使 W \mathcal{W} W趋向于 W I \mathcal{W}_I WI:
E W ( W ) = ∣ ∣ W − W I ∣ ∣ F 2 E_W(\mathcal{W})=||\mathcal{W}-\mathcal{W}_I||_F^2 EW(W)=∣∣W−WI∣∣F2
分别说完了上面的数据项和正则项,现在可以写出目标函数的更详细的形式:
E ( T ^ P , J ^ P , Θ , W , P ) = E D + λ Y E Y + λ J E J + λ P E P + E W E(\hat{T}^P,\hat{J}^P,\Theta,\mathcal{W},\mathcal{P}) = E_D+\lambda_YE_Y+\lambda_JE_J+\lambda_PE_P+E_W E(T^P,J^P,Θ,W,P)=ED+λYEY+λJEJ+λPEP+EW
其中,根据经验 λ Y = 100 , λ J = 100 , λ P = 25 \lambda_Y=100,\lambda_J=100,\lambda_P=25 λY=100,λJ=100,λP=25。由于模型的参数较多,这些正则项能够有效防止模型过拟合。
Joint Regressor
通过上面的优化过程可以得到训练集中每个人物的template mesh和joint location。但是如果我们想为新的人物预测其关节位置呢?文章中通过学习一个regressor matrix J \mathcal{J} J预测Joint位置。 J \mathcal{J} J通过非负最小二乘计算得到,并使权重加起来为1。这种方法使得计算joint的顶点是稀疏的,同时权重非负和加起来为1又使得预测的joint不会出现在mesh的外侧。
2. Shape parameter training
shape 空间是通过"mean and principal shape direction" { T ‾ , S } \{\overline{T},\mathcal{S}\} {T,S}来定义的。计算方法multi-pose数据集中shape做一个pose归一化,然后再运行PCA得到。
pose归一化的过程是将数据集中的registration V j S V_j^S VjS转换为一个处于rest pose θ ∗ ⃗ \vec{\theta^*} θ∗下的registration T ^ j S \hat{T}_j^S T^jS;转为rest pose这一步保证了pose和shape的建模不会相互影响。那么如何进行pose归一化呢?对于数据集中的一个一个registration V j S V_j^S VjS,首先要估计它的姿势,也就是要寻找一个姿势表示 θ ⃗ \vec{\theta} θ使得经过这个参数变换后的mesh和原始的mesh的误差最小,也就是优化:
θ ⃗ j = arg min θ ⃗ ∑ e ∣ ∣ W e ( T ^ μ P + B P ( θ ⃗ ; P ) ) , J ^ m u P , θ ⃗ , W − V j , e S ∣ ∣ 2 \vec{\theta}_j = \mathop{\arg\min}_{\vec{\theta}} \sum_{e}||W_e(\hat{T}_{\mu}^P+B_P(\vec{\theta};\mathcal{P})),\hat{J}_{mu}^P,\vec{\theta},\mathcal{W} - V_{j,e}^S||^2 θj=argminθe∑∣∣We(T^μP+BP(θ;P)),J^muP,θ,W−Vj,eS∣∣2
其中:
得到姿态 T ⃗ j S \vec{T}_j^S TjS之后,可以求 T ^ j S \hat{T}_j^S T^jS:
T ^ j S = arg min T ⃗ ∣ ∣ W ( T ^ + B p ( θ ⃗ j ; P ) , J T ^ , θ ⃗ , W ) − V j S ∣ ∣ 2 \hat{T}_j^S = \mathop{\arg\min}_{\vec{T}}||W(\hat{T}+B_p(\vec{\theta}_j;\mathcal{P}),\mathcal{J}\hat{T},\vec{\theta},\mathcal{W}) - V_j^S||^2 T^jS=argminT∣∣W(T^+Bp(θj;P),JT^,θ,W)−VjS∣∣2
然后在 { T ^ j S } j = 1 S s u b j \{\hat{T}_j^S\}_{j=1}^{S_{subj}} {T^jS}j=1Ssubj上运行PCA,得到 { T ‾ , S } \{\overline{T},\mathcal{S}\} {T,S},PCA这一步是为了最大大rest pose下顶点偏移的可解释方差(explained variance),同时使shape direction的数目较少。
3. Optimization summary
优化过程:
(1)首先通过最小化model和registration的edge差异求得 θ ⃗ j \vec{\theta}_j θj;
(2)通过交替的方式最小化目标函数 E ( T ^ P , J ^ P , Θ , W , P ) E(\hat{T}^P,\hat{J}^P,\Theta,\mathcal{W},\mathcal{P}) E(T^P,J^P,Θ,W,P),得到对各参数的估计;
(3)然后从 { J ^ P , T ^ P } \{\hat{J}^P,\hat{T}^P\} {J^P,T^P}估计joint回归矩阵 J \mathcal{J} J;
(4)在 { T ^ j S } j = 1 S s u b j \{\hat{T}_j^S\}_{j=1}^{S_{subj}} {T^jS}j=1Ssubj上运行PCA,得到 { T ‾ , S } \{\overline{T},\mathcal{S}\} {T,S};
上述步骤中除了PCA这一步,其他优化步骤使用通过gradient-based算法求解,使用chumpy框架。
1.quantitative evaluation
定量评价包括两个方面:
2.Sparse SMPL
常规的SMPL的pose blend shape不是稀疏的,mesh中的一个顶点会受到其他所有任一关节的旋转的影响,为了是手部的动画更加直观并避免关节“长距离影响”,手动使模型稀疏,在求导的时候,让顶点最多受到4个关节的影响。
稀疏SMPL的精度比常规的SMPL稍差,但是降低了模型大小并能有效用于动画制作。
3.visual evaluation
如下图,是SMPL生成的的不同shape和pose的结果:
4.run-time analysis
系统的run-time如下图,包括shape的pose两个部分的耗时;其中横坐标是body shape的系数;测试使用的是2014 Macbook Pro。
5.Compatibility with rendering engines
SMPL使用的是标准蒙皮,可与现有的动画软件适配。SMPL可导出FBX格式的装配好模型。Pose blend weight可以bake到模型中,也可以在在运行时根据pose θ t ⃗ \vec{\theta_t} θt计算。在Maya,Unity,Blender中测试,均可以直接加载。