SMPL基础


简介

SMPL,全称 Skinned Multi-Person Linear Model,是一套优雅而实用的三维人体参数化模型.

更白话一点:给它一份”骨架的姿态”(pose)和”一纸身形的刻度”(shape),它便能织出一张细腻的人体网格(成千上万的顶点),起落有致,动作流畅.Pose 决定关节如何开合回旋;Shape 勾勒高矮胖瘦的轮廓;再配上整体的平移与旋转,人物就稳稳落在世界坐标系中.

它之所以经久不衰,有两点朴素而关键的优势:

  • 可微且线性友好,和深度学习模型同频共振;
  • 扎根于大规模人体扫描数据,形体细节自然,少有违和的折痕.

应用场景也很广:三维人体重建,姿态估计,动作捕捉,AR/VR,动画制作……凡与”人”有关的 3D 任务,往往都有它的身影.

下面,我们沿着一条清晰的路径——从姿态到旋转,再到顶点——把 SMPL 温柔而彻底地拆开.

2. 数学预备

2.1 轴角表示法

在深入 SMPL 之前,先把”旋转”这件事说清楚:一根轴,一份角.轴告诉你”沿这条直线去绕”,角则回答”要绕多少”.有了它们,三维里的任何小转身都能被描述得干净利落.

轴(axis):一个单位向量 u=(ux,uy,uz)\boldsymbol{u} = (u_x, u_y, u_z),表示一个向量要绕着哪一条直线旋转.

角度(angle):一个标量 θ\theta,说明要转过的弧度/角度是多少.

例如 u=(0,0,1)\boldsymbol{u}=(0,0,1)θ=90\theta=90^\circ,就是”绕着 zz 轴,旋转 9090^\circ“.

2.2 罗德里格斯公式(Rodrigues’ rotation formula)

走到罗德里格斯公式之前,先认识一个小角色:叉乘矩阵(skew-symmetric matrix).它的巧思在于——把”u×v\boldsymbol{u} \times \boldsymbol{v}“这类向量叉乘,变成一记清爽的矩阵乘法.

给定单位向量 u=(ux,uy,uz)\boldsymbol{u} = (u_x, u_y, u_z),它的叉乘矩阵记作:

[u]×=[0uzuy uz0ux uyux0] [\boldsymbol{u}]_\times = \begin{bmatrix} 0 & -u_z & u_y \\\ u_z & 0 & -u_x \\\ -u_y & u_x & 0 \end{bmatrix}

于是就有 u×v=[u]×v\boldsymbol{u} \times \boldsymbol{v} = [\boldsymbol{u}]_\times \, \boldsymbol{v}.这里 vR3\boldsymbol{v} \in \mathbb{R}^3 表示任意三维向量;而 [u]×[\boldsymbol{u}]_\times 本身是一类反对称矩阵,用来把向量叉乘”线性化”.

常用性质:

[u]×=[u]×,[u]×u=0. [\boldsymbol{u}]_\times^\top = -[\boldsymbol{u}]_\times, \quad\quad [\boldsymbol{u}]_\times\, \boldsymbol{u} = \boldsymbol{0}.

u=1\lVert \boldsymbol{u} \rVert = 1 时,还有一个极好用的恒等式:

[u]×2=uuI. [\boldsymbol{u}]_\times^{\,2} = \boldsymbol{u} \, \boldsymbol{u}^\top - \mathbf{I}.

推导(用向量三重积 BAC–CAB 恒等式):对任意 vR3\boldsymbol{v} \in \mathbb{R}^3,

[u]×2v=[u]×([u]×v)=u×(u×v)=u(uv)v(uu). [\boldsymbol{u}]_\times^{\,2}\,\boldsymbol{v} = [\boldsymbol{u}]_\times\big([\boldsymbol{u}]_\times\,\boldsymbol{v}\big) = \boldsymbol{u}\times(\boldsymbol{u}\times\boldsymbol{v}) = \boldsymbol{u}\,(\boldsymbol{u}\cdot\boldsymbol{v}) - \boldsymbol{v}\,(\boldsymbol{u}\cdot\boldsymbol{u}).

由于 u=1\lVert\boldsymbol{u}\rVert=1,即 uu=1\boldsymbol{u}\cdot\boldsymbol{u}=1,于是

[u]×2v=u(uv)v=(uuI)v. [\boldsymbol{u}]_\times^{\,2}\,\boldsymbol{v} = \boldsymbol{u}\,(\boldsymbol{u}\cdot\boldsymbol{v}) - \boldsymbol{v} = (\boldsymbol{u}\,\boldsymbol{u}^\top - \mathbf{I})\,\boldsymbol{v}.

因上式对任意 v\boldsymbol{v} 都成立,便有矩阵恒等式

[u]×2=uuI. [\boldsymbol{u}]_\times^{\,2} = \boldsymbol{u}\,\boldsymbol{u}^\top - \mathbf{I}.

小注:这也意味着 [u]×2[\boldsymbol{u}]_\times^{\,2}u\boldsymbol{u} 方向为 0\mathbf{0},而在与 u\boldsymbol{u} 正交的平面上等于 I-\mathbf{I}(把垂直分量”翻个面”).

有了它,罗德里格斯公式就水到渠成:围绕单位轴 u\boldsymbol{u} 旋转 θ\theta 的旋转矩阵可写为

R(ω):=I+sinθ[u]×+(1cosθ)[u]×2. \mathbf{R}(\boldsymbol{\omega}) := \mathbf{I} + \sin\theta\,[\boldsymbol{u}]_\times + (1-\cos\theta)\,[\boldsymbol{u}]_\times^{\,2}.

其中 ω=θu\boldsymbol{\omega} = \theta\,\boldsymbol{u}.

直观一点看:沿着 u\boldsymbol{u} 的分量不动,垂直于 u\boldsymbol{u} 的那一片平面里,整体转过一个 θ\theta.

等价的”向量版”写法也很常见,对任意 vR3\boldsymbol{v} \in \mathbb{R}^3:

R(u,θ)v=cosθv+sinθ(u×v)+(1cosθ)(uv)u. \mathbf{R}(\boldsymbol{u},\theta)\,\boldsymbol{v} = \cos\theta\,\boldsymbol{v} + \sin\theta\,(\boldsymbol{u}\times\boldsymbol{v}) + (1-\cos\theta)\,(\boldsymbol{u}\cdot\boldsymbol{v})\,\boldsymbol{u}.

3. 模型参数

3.1 形状参数(β)

形状参数刻画”人”的体态与比例变化,可把它想象成一组推拉自如的滑块:身高,胖瘦,肩宽……轻轻调整,体型便随之细腻起伏.下文将在模板网格与形状基的框架中展开说明.

在 SMPL 中,模板网格(Template Mesh) 共有 N=6890N=6890 个顶点(vertices),每个顶点都是一个三维坐标:ti=(xi,yi,zi)t_i = (x_i, y_i, z_i).

将所有顶点按顺序”堆叠”起来,得到一条长向量:

T={t1,t2,,t6890},TR3N. T = \{t_1, t_2, \cdots, t_{6890}\},\quad T \in \mathbb{R}^{3N}.

(也常把 TT 看作 RN×3\mathbb{R}^{N\times 3} 的矩阵,两种写法本质等价.)

形状对模板的线性修正,按原论文记号为:

T(β)=Tˉ+BS(β), T(\boldsymbol{\beta}) = \bar{T} + B_S(\boldsymbol{\beta}),

其中 Tˉ\bar{T} 是模板网格,BS(β)B_S(\boldsymbol{\beta}) 是由形状参数 β\boldsymbol{\beta} 驱动的 shape blend shapes.

等价地,也可写成 PCA 形状基的和式:

T(β)=Tˉ+k=1KβkSk. T(\boldsymbol{\beta}) = \bar{T} + \sum_{k=1}^{K} \, \beta_k\, S_k.

其中,βk\beta_k(shape parameter) 是第 kk 个形状参数,SkS_k(shape basis vector) 是对应的形状基向量,通常由大量 3D 扫描人体数据通过 PCA(Principal Component Analysis,主成分分析) 学到.

小记:β=(β1,,βK)RK\boldsymbol{\beta} = (\beta_1,\dots,\beta_K)^\top \in \mathbb{R}^K,SkR3NS_k \in \mathbb{R}^{3N}.常见设置是 K=10K=10(SMPL 经典 10 维形状空间).

补充:实际发布的 SMPL 亦提供 K=10K=10K=300K=300 两种形状空间版本,后者能捕捉更细致的体型差异.

可以把 β\boldsymbol{\beta} 理解成一排”滑块“,每个滑块驱动一类典型的体型变化:

  • β1\beta_1:身高
    • 正数:更高
    • 负数:更矮
  • β2\beta_2:胖瘦
    • 正数:更壮实
    • 负数:更清瘦
  • β3\beta_3:腿长 vs 躯干
    • 正数:腿更长
    • 负数:躯干更长
  • β4\beta_4:肩宽
    • 正数:更宽
    • 负数:更窄
  • β5\beta_5:四肢粗细
    • 正数:更粗壮
    • 负数:更纤细
  • β6\beta_6:骨盆大小
    • 正数:更宽
    • 负数:更窄
  • β7\beta_7:胸腔厚度
    • 正数:更厚
    • 负数:更薄
  • β8,β9,β10\beta_8,\beta_9,\beta_{10}:细部比例,用于刻画更精细的身材差异.

3.2 姿态参数(θ)

共 24 个关节,每个关节用 3 个参数(旋转轴 + 角度)描述,合计 72 维:

θR72. \boldsymbol{\theta} \in \mathbb{R}^{72}.

为什么不是 4 个参数(四元数)?因为三维旋转群 SO(3) 只有 3 个自由度;四元数 qR4\boldsymbol{q}\in\mathbb{R}^4 还需满足 单位范约束 q=1\lVert\boldsymbol{q}\rVert=1(且 q\boldsymbol{q}q-\boldsymbol{q} 表示同一旋转),有效自由度仍是 3.轴—角(axis–angle) 用 3 维最小参数,回归更直接.

每个关节的参数是一个轴—角向量.记第 ii 个关节的单位旋转轴为 WiW_i,旋转角为 θi\theta_i,则轴—角向量

ωi=θiWi,WiR3, Wi=1. \boldsymbol{\omega}_i = \theta_i\, W_i,\quad W_i \in \mathbb{R}^3,\ \lVert W_i\rVert = 1.

也可反过来由 ωi\boldsymbol{\omega}_i 取出角度与轴:

θi=ωi,Wi={ωi/ωi,ωi>0,任意单位向量,否则. \theta_i = \lVert\boldsymbol{\omega}_i\rVert,\quad W_i = \begin{cases} \boldsymbol{\omega}_i/\lVert\boldsymbol{\omega}_i\rVert, & \lVert\boldsymbol{\omega}_i\rVert>0,\\ \text{任意单位向量}, & \text{否则}. \end{cases}

例如:绕 xx 轴旋转,有 Wi=(1,0,0)W_i=(1,0,0),θi\theta_i 采用弧度制.

由罗德里格斯公式可得其旋转矩阵:

R(θi)=I+sinθi[Wi]×+(1cosθi)[Wi]×2. R(\theta_i) = \mathbf{I} + \sin\theta_i\,[W_i]_\times + (1-\cos\theta_i)\,[W_i]_\times^{\,2}.

4. 核心计算流程

4.1 正向运动学(FK)

我们可以把 FK 视为在一个骨骼链上,逐步叠加坐标系变换:

  • 每个关节不仅有一个”位置”,它还定义了一个坐标系.
  • 子关节的位置和方向,总是依附在父关节的坐标系里.
  • 父关节一旦动了,它的整个坐标系也跟着动,子关节就在新的坐标系里继续旋转.

核心公式:

Gi=Gparent(i)Ti G_i = G_{\text{parent}(i)} \cdot T_i GiG_i: 关于 ii 的全局变换矩阵 (global transform). Gparent(i)G_{\text{parent}(i)}: 父关节的全局变换. TiT_i: 关于 ii 的本地变换矩阵 (local transform).

为避免与 T(β,θ)T(\boldsymbol{\beta},\boldsymbol{\theta}) 混淆,本文仅在 FK 小节使用 TiT_i 表示”关节的本地变换”,与网格模板相关的量统一使用 Tˉ\bar{T}T(β,θ)T(\boldsymbol{\beta},\boldsymbol{\theta}) 记号.

本地变换矩阵 TiT_i

每个关节有两个信息:

  1. 旋转 (姿态):由 ωi\boldsymbol{\omega}_i(轴角向量)通过罗德里格斯公式变成旋转矩阵 R(ωi)R(\boldsymbol{\omega}_i).
  2. 平移 (骨骼长度/位置):第 ii 个关节在父关节坐标系中的位置 ji\boldsymbol{j}_i(常由绑定姿态/骨骼定义).
Ti=[R(ωi)ji01] T_i = \begin{bmatrix} R(\boldsymbol{\omega}_i) & \boldsymbol{j}_i \\ \mathbf{0}^\top & 1\\ \end{bmatrix} R(ωi)R(\boldsymbol{\omega}_i):描述旋转. ji\boldsymbol{j}_i:相对于父关节的偏移位置.

递推关系:

假设根节点 (骨盆) 的全局矩阵:

Groot=[R(ωroot)troot01] G_{\text{root}} = \begin{bmatrix} R(\boldsymbol{\omega}_{\text{root}}) & t_{\text{root}}\\ 0 & 1\\ \end{bmatrix}

那么,上臂的全局变换矩阵为:

Gupper_arm=GrootTupper_arm G_{\text{upper\_arm}} = G_{\text{root}} \cdot T_{\text{upper\_arm}}

前臂的全局变换矩阵为:

Glower_arm=Gupper_armTlower_arm G_{\text{lower\_arm}} = G_{\text{upper\_arm}} \cdot T_{\text{lower\_arm}}

手腕的全局变换矩阵为:

Gwrist=Glower_armTwrist G_{\text{wrist}} = G_{\text{lower\_arm}} \cdot T_{\text{wrist}}

4.2 线性混合蒙皮(LBS)

SMPL 的关键步骤之一.

可以把骨架(关节)想成木偶的”骨头”,把网格顶点想成木偶表面的”橡皮泥”.LBS 就是规定:当骨头动起来时,每个顶点该跟着哪些骨头,以多大比例一起动.

最核心的直觉是”加权平均的变换”:一个顶点同时由多个关节影响,每个关节给它一个变换,这些变换按照权重做线性混合,得到顶点的新位置.

符号约定:

  • ii:顶点索引,jj:关节索引(共 KK 个关节,SMPL 通常 K=24K=24).
  • wijw_{ij}:第 jj 个关节对第 ii 个顶点的影响权重,满足 wij0w_{ij}\ge 0j=1Kwij=1\sum_{j=1}^{K} w_{ij} = 1.
  • GjG_j:第 jj 个关节的全局变换矩阵(4×44\times 4,包含旋转和平移).
  • vˉi\bar{v}_i:模板网格上的顶点("绑定姿态/模板姿态")坐标.
  • viv_i:变形后的顶点坐标.

公式:

vi=j=1Kwij[Gj(θ,J)Bj(J)1]vˉi v_i = \sum_{j=1}^{K} w_{ij}\, \big[\, G_j(\boldsymbol{\theta}, \mathbf{J})\, B_j(\mathbf{J})^{-1} \,\big] \, \bar{v}_i

其中 BjB_j 是第 jj 个关节在绑定姿态下的变换矩阵,J\mathbf{J} 表示由 J(β)J(\boldsymbol{\beta}) 得到的关节位置集合.

实践中,蒙皮权重 W\mathcal{W} 由数据学习得到;对每个顶点按关节归一(jwij=1\sum_j w_{ij}=1)有助于数值稳定与体积保持.

变量释义小结:

  • KK:关节数量(SMPL 里通常为 2424).
  • wijw_{ij}:第 jj 个关节对第 ii 个顶点的影响权重(按顶点归一).
  • GjG_j:第 jj 个关节的全局变换矩阵(由 FK 得到).
  • BjB_j:第 jj 个关节在绑定姿态的全局变换矩阵.
  • vˉi\bar{v}_i:模板网格上的顶点坐标.
  • viv_i:变形后的顶点坐标.

4.3 姿态修正

作用:给每个关节加入”补偿形变”,让模型的表面更符合真实人体.

SMPL 将姿态引起的非线性形变线性化为一组姿态基的加权和:

BP(θ)=n=19K(Rn(θ)Rn(θ))Pn B_P(\boldsymbol{\theta}) = \sum_{n=1}^{9K} \big( R_n(\boldsymbol{\theta}) - R_n(\boldsymbol{\theta}^*) \big)\, \mathbf{P}_n

其中 Rn(θ)R_n(\boldsymbol{\theta}) 表示各关节的旋转矩阵按 3×33\times 3 展平后的第 nn 个分量,θ\boldsymbol{\theta}^* 为参考姿态(如 T-pose),Pn\mathbf{P}_n 是学习得到的姿态修正基.该项与形状无关,仅由姿态决定.

5. 完整模型公式

M(β,θ)=W(TP(β,θ),  J(β),  θ,  W) M(\boldsymbol{\beta}, \boldsymbol{\theta}) = W\big( T_P(\boldsymbol{\beta}, \boldsymbol{\theta}),\; J(\boldsymbol{\beta}),\; \boldsymbol{\theta},\; \mathcal{W} \big)

其中

TP(β,θ)=Tˉ+BS(β)+BP(θ) T_P(\boldsymbol{\beta}, \boldsymbol{\theta}) = \bar{T} + B_S(\boldsymbol{\beta}) + B_P(\boldsymbol{\theta}) W\mathcal{W} 为蒙皮权重矩阵(注意与函数 W()W(\cdot) 区分).

符号说明:

  • M(β,θ)M(\boldsymbol{\beta}, \boldsymbol{\theta}):给定形状与姿态后输出的网格顶点集合(通常记作 VR3NV \in \mathbb{R}^{3N}).
  • TP(β,θ)T_P(\boldsymbol{\beta}, \boldsymbol{\theta}):姿态与形状修正后的模板顶点,TP=Tˉ+BS(β)+BP(θ)T_P = \bar{T} + B_S(\boldsymbol{\beta}) + B_P(\boldsymbol{\theta}).
  • Tˉ\bar{T}:模板网格(参考姿态/平均形状)的顶点集合.
  • BS(β)B_S(\boldsymbol{\beta}):由形状参数驱动的 shape blend shapes,常等价于 kβkSk\sum_k \beta_k S_k 的线性组合.
  • BP(θ)B_P(\boldsymbol{\theta}):由姿态参数驱动的 pose blend shapes,基于各关节 Ri(θ)R_i(\boldsymbol{\theta}) 相对参考姿态的旋转偏差构造.
  • J(β)J(\boldsymbol{\beta}):从 T(β)T(\boldsymbol{\beta}) 回归得到的关节位置集合(joint regressor 输出).
  • θ\boldsymbol{\theta}:姿态参数(每个关节的轴角向量),在 SMPL 经典设置下维度为 7272(24×324\times3).
  • W\mathcal{W}:蒙皮权重矩阵(或按顶点组织的权重集合),其元素 wijw_{ij} 表示第 jj 个关节对第 ii 个顶点的影响,满足对每个顶点 jwij=1\sum_j w_{ij}=1.
  • W()W(\cdot):线性蒙皮函数(LBS),将 TPT_P 与关节全局变换 Gj(θ,J)G_j(\boldsymbol{\theta}, \mathbf{J}),绑定姿态 Bj(J)B_j(\mathbf{J}) 以及权重 W\mathcal{W} 结合,输出姿态后的顶点.常见实现为 vi=j=1Kwij[Gj(θ,J)Bj(J)1]vˉiv_i = \sum_{j=1}^{K} w_{ij}\,\big[\, G_j(\boldsymbol{\theta}, \mathbf{J})\, B_j(\mathbf{J})^{-1} \,\big] \, \bar{v}_i(齐次坐标形式).

其中 J(β)J(\boldsymbol{\beta}) 常写成线性回归形式:

J(β)=J+JSβ J(\boldsymbol{\beta}) = \mathcal{J} + \mathcal{J}_S\, \boldsymbol{\beta}

其中 J\mathcal{J} 为平均关节点位置,JS\mathcal{J}_S 为学习得到的关节回归矩阵.

一句话直观总结:把”长相”和”动作”先分别算好(TP(β,θ)T_P(\boldsymbol{\beta}, \boldsymbol{\theta})J(β)J(\boldsymbol{\beta})),用骨架把动作展开成各关节的全局变换,再用皮肤权重 W\mathcal{W} 将这些关节变换按比例混合到每个顶点上,得到最终的网格顶点 M(β,θ)M(\boldsymbol{\beta}, \boldsymbol{\theta}).


6. 参考文献

  1. Loper, M., Mahmood, N., Romero, J., Pons-Moll, G., & Black, M. J. (2015). SMPL: A Skinned Multi-Person Linear Model. ACM Transactions on Graphics, 34(6), 1–16. ACM DL

文章作者: ModestyN
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ModestyN !
评论
  目录