SMPL
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)
相关知识链接:
一、主要内容
这篇文章的主要内容是要通过学习得到一个模型可以根据一些输入的参数创建人体动画模型,可以做到
- 可以表示不同身形;
- 随着不同姿势自然变形;
- 能够展现软组织运动;
- 模型渲染快速、部署简单、适配现有渲染引擎;
目标函数:自己生成的model和registered meshes之间每个顶点的差异
训练数据:1786个高分辨率3D扫描模型(为了学习到人在不同的姿势下模型是如何变形的),将自己的模型与3D扫描模型一一align得到训练集;
二、相关工作
- (1) blend skinning: 骨骼子空间变形方法,又称blend skinning。mesh中得每一个顶点会受到其相邻骨骼的加权影响,当这种影响是线性的时候就是LBS. how it works-LBS。这篇文章就是要修正blend skinning的局限性。
- (2) auto-rigging: 给定一个mesh的集合,推算出骨骼、关节和blend权重。
- (3) blend shapes: 姿态空间变形模型(PSD:Pose Space Deformation)。
- (4) learning pose models
- (5) learning pose and shape models
三、模型构建
手工设计的人体mesh:顶点数 N = 6890 N = 6890 N=6890; 关节点数目 K = 23 K = 23 K=23;
根据标准蒙皮操作,模型可以通过一个平均模板形状来定义,并由以下元素来表示:
- N vertices T ‾ ∈ R 3 N \overline{T} \in \mathbb{R}^{3N} T∈R3N
- zero pose θ ∗ ⃗ \vec{\theta^*} θ∗
- blend wights W ∈ R N × K \mathcal{W} \in \mathbb{R}^{N \times K} W∈RN×K
- shape parameter β ⃗ \vec{\beta} β
- pose parameter θ ⃗ \vec{\theta} θ
- blend shape function B s ( β ⃗ ) : R ∣ β ⃗ ∣ ↦ R 3 N B_s(\vec{\beta}):\mathbb{R}^{|\vec{\beta}|} \mapsto \mathbb{R}^{3N} Bs(β):R∣β∣↦R3N
- K joint location predict function J ( β ⃗ ) : R ∣ β ⃗ ∣ ↦ R 3 K J(\vec{\beta}):\mathbb{R}^{|\vec{\beta}|} \mapsto \mathbb{R}^{3K} J(β):R∣β∣↦R3K
- pose-dependent blend shape function B p ( θ ⃗ ) : R ∣ θ ⃗ ∣ ↦ R 3 N B_p(\vec{\theta}):\mathbb{R}^{|\vec{\theta}|} \mapsto \mathbb{R}^{3N} Bp(θ):R∣θ∣↦R3N
三个主要变换函数:
- blend shape 函数 B s ( β ⃗ ) B_s(\vec{\beta}) Bs(β)的输入是形状向量,输出是刻画人物(subject)形体的blend shape;
- joint location 回归函数 J ( β ⃗ ) J(\vec{\beta}) J(β)的输入是形状向量,输出是K个关节点的位置;
- pose-dependent blend shape函数 B p ( θ ⃗ ) B_p(\vec{\theta}) Bp(θ)的输入是姿态向量,用来实现’姿态-依赖’的变形;
上述这些函数生成的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∣∣)
其中:
- w ‾ = w ⃗ ∣ ∣ w ⃗ ∣ ∣ \overline{w} = \frac{\vec{w}}{||\vec{w}||} w=∣∣w∣∣w是单位旋转角;
- w ‾ ^ \hat{\overline{w}} w^是 w ‾ \overline{w} w的斜对称矩阵;
- I \mathcal{I} I是 3 × 3 3 \times 3 3×3的单位矩阵;
那么,标准的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
其中:
- T ‾ \overline{T} T为rest pose;
- J J J 为关节位置;
- θ ⃗ \vec{\theta} θ为pose参数;
- W \mathcal{W} W是blend weight;
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