SMPL:通过形状和姿态参数,精准还原3D人体形态,兼容动画与游戏渲染

SMPL: A Skinned Multi-Person Linear Model
PDF

图 1:SMPL 是一种逼真的人体形状和姿势学习模型,与现有渲染引擎兼容,允许
Animator 控件,并可用于研究目的。(左)SMPL 模型(橙色)拟合真实 3D 网格(灰色)。(右)Unity 5.0
游戏引擎屏幕截图显示了实时动画 CAESAR 数据集中的身体。

前言

想象一下,你正在设计一款3D动画游戏或制作一部特效电影,你需要一个会“动”的人体角色。这个角色不仅要具备真实的体型,还要在不同姿势下保持自然的动作,比如跑步、跳跃时身体各部分的形变,还得在挥手、扭头时表现出真实的“软组织”运动效果。然而,传统的3D人体模型要么形态不够逼真,要么制作起来费时费力,很难满足如今动画、游戏和特效产业对高质量、高效率的需求。

为了解决这些问题,研究者们提出了SMPL模型(Skinned Multi-Person Linear Model),这是一个通过形状参数姿态参数对人体进行描述的统计模型,能够精准还原不同体型和自然动作下的人体形态。SMPL不仅效果真实,而且兼容主流的动画和游戏渲染引擎,具备以下亮点:

  1. 简单高效:SMPL使用了一种标准的“线性蒙皮”(Linear Blend Skinning,LBS)技术,极大降低了计算复杂度,使人体动画能够快速渲染,同时兼容现有的工具链。
  2. 自然逼真:模型学习了大量真实人体3D扫描数据,能够捕捉身体在不同姿势下的自然形变,解决了传统模型在关节处出现的“拉扯”或“变形”问题。
  3. 可扩展性强:通过结合软组织动态(如皮肤晃动等)建模,SMPL不仅模拟了刚性骨骼运动,还能够表现体重不同的人体在剧烈运动时的柔软组织变形。
  4. 易于落地应用:SMPL模型的结构设计简单、标准,支持动画制作软件如Maya、Blender,以及游戏引擎如Unity、Unreal等,方便研究者和开发者直接使用。

前人工作

在这里插入图片描述

任务类别 方法类别 发展创新 模型名称 方法详情
人体建模与动画 传统线性蒙皮方法(浅绿色) 最早的骨骼驱动建模方法,使用骨骼控制网格变形,但在关节处产生“拉扯”和“弯折”问题。 Linear Blend Skinning (LBS) - 基于骨骼结构,将网格表面顶点与骨骼变换关联,顶点的形变由骨骼权重影响。
- 存在“拉扯”(taffy)和“弯折”(bowtie)变形问题。
改进线性蒙皮方法(深绿色) 为了解决LBS的关节变形问题,提出了多种修正方案,包括四元数、双四元数等优化变形技术。 Dual-Quaternion Skinning (DQS) - 使用双四元数取代传统线性变换,有效改善关节处的变形问题。
- 提高了变形效果,但不具备人体形状的学习能力。
自动化人体建模 自动绑定与蒙皮方法 为降低人工操作成本,自动推理骨骼、关节和权重,但未解决形状泛化和自然变形问题。 Auto-Rigging (De Aguiar等) - 输入网格集合,自动推理骨骼结构和绑定权重。
- 未引入形状学习,无法泛化到新的姿势和体型。
姿态与形状建模 关键姿势插值方法 通过插值不同姿势的形变数据,实现自然的过渡效果,但需要大量姿势数据且泛化能力弱。 Pose Space Deformation (PSD) - 存储关键姿势的形变数据,根据姿势空间的距离插值生成新姿势形变。
- 手动雕刻关键姿势形变,数据需求大。
低维形变学习方法 利用PCA等降维技术学习姿势与形状的关联,减少控制复杂度,但难以同时建模形状变化。 Kry等(2002), Kavan等(2009) - 通过PCA学习各关节的低维形变基,简化形变控制。
- 不适合处理大规模人体形态和动态软组织。
人体形态与动态建模 三角形形变方法(蓝色) 基于三角形变形捕捉姿态和形状的统计关系,具备高保真度,但与现有渲染工具兼容性差。 SCAPE, BlendSCAPE, Dyna - SCAPE:通过三角形变形建模姿态和形状的变化。
- BlendSCAPE:增加形状泛化能力。
- Dyna:引入软组织动态模拟。
基于顶点形变学习方法(红色、橙色) 通过统计学习方法从数据中自动捕捉顶点级的姿态与形状关系,模型简单高效且兼容性强。 SMPL (本论文) - 学习关键参数:形状参数、姿态参数与软组织动态。
- 线性形变:通过线性函数将姿态映射到顶点形变。
- 高效兼容:支持标准渲染引擎,易于部署到动画和游戏中。
动态软组织建模 基于动态变形模型 结合物理与统计方法,模拟软组织在运动过程中的自然晃动和动态变形,增强真实性。 Dynamic-SMPL (DMPL) - 在SMPL基础上引入动态软组织形变。
- 使用4D扫描数据,通过PCA学习动态形变模式。
- 形变与身体形态参数相关联。

SMPL模型:建模从模板到动态人体

概览

在这里插入图片描述

SMPL 模型的目标是通过形状参数( β ⃗ \vec{\beta} β )和姿势参数( θ ⃗ \vec{\theta} θ )来描述一个3D人体模型,并通过 线性混合皮肤(LBS) 方法对其进行变形。以下是 SMPL 模型 过程的表格化呈现,清晰地总结了图3中的四个阶段:

步骤 数学表示 描述 图示
(a) 基础网格 T ˉ , W T̄, W Tˉ,W - 模型的初始模板网格,五颜六色表示不同部位的混合权重
- 白色关节表示骨骼结构(24个关节)。
左侧的五彩人体模型
(b) 形状变换 T ˉ + B S ( β ) , J ( β ) T̄ + B_S(\beta), J(\beta) Tˉ+BS(β),J(β) - 加入 形状混合形状,通过形状向量 β \beta β 控制人体的胖瘦、高矮等体型变化。 第二个模型(个性化体型)
© 姿势变形 T P ( β , θ ) = T ˉ + B S ( β ) + B P ( θ ) T_P(\beta, \theta) = T̄ + B_S(\beta) + B_P(\theta) TP(β,θ)=Tˉ+BS(β)+BP(θ) - 添加 姿势混合形状,通过姿势向量 θ \theta θ 实现动作准备阶段的局部变形。
- 体现肌肉拉伸、关节扩展等细节。
第三个模型(准备劈叉)
(d) 蒙皮动画 W ( T P ( β , θ ) , J ( β ) , θ , W ) W(T_P(\beta, \theta), J(\beta), \theta, W) W(TP(β,θ),J(β),θ,W) - 应用 线性混合皮肤 (LBS) 或 双四元数皮肤 (DQBS) 方法,实现骨骼驱动顶点的流畅变形。 最右侧的劈叉姿势模型

SMPL 模型(Skinned Multi-Person Linear model)可以想象成一个“人体建模的魔术师”,它能把复杂的人体几何形状和动态动作转化为一组数学方程。我们可以用图3来理解这个魔术师的工作原理。就像 SCAPE 模型一样,SMPL 也把人体分解成两部分:“先天的”形状(identity-dependent shape)和“后天的”动态形状(pose-dependent shape)。但是,和 SCAPE 不同,SMPL 更加灵活,采用了一种基于顶点(也就是皮肤表面的点)的蒙皮(vertex-based skinning)方法,并且通过“纠正混合形状”(corrective blend shapes)来实现细腻的调整。可以想象,每个顶点就像是这幅人体画布上的一个像素点,而 SMPL 的魔术就在于让这些点既能固定在模板上,又能随关节旋转灵活地“跳舞”。

这个模型的起点是一个由艺术家制作的网格,包含 N = 6890 N = 6890 N=6890 个顶点和 K = 23 K = 23 K=23 个关节。这些顶点分布均匀,像是覆盖人体的一张细密的网,每个顶点都按照男性和女性通用的拓扑结构排列,具备空间分辨率可变性,还被分割成多个区域。图6就展示了这些区域是如何被初始权重和骨骼结构定义的。

SMPL 模型可以被拆解为以下几个部分,每一部分都完成了一个独特的“任务”:

首先,人体的平均模板形状 T ˉ ∈ R 3 N \bar{\mathbf{T}} \in \mathbb{R}^{3N} TˉR3N 是基础。这就像是人体的“初始画布”,是零姿态下所有 N N N 个顶点的位置。如图3(a)所示,这幅画布上的每个点会被后续的步骤进一步雕刻和调整。

接着,为了让顶点能够随关节旋转而动态调整,我们需要混合权重矩阵 W ∈ R N × K \mathcal{W} \in \mathbb{R}^{N \times K} WRN×K。可以想象, W \mathcal{W} W 就像是一组“橡皮筋”,每根橡皮筋连接一个顶点和多个关节,定义了每个关节对顶点的影响程度。

然后,形状混合函数 B S ( β ⃗ ) : R ∣ β ⃗ ∣ ↦ R 3 N B_S(\vec{\beta}): \mathbb{R}^{|\vec{\beta}|} \mapsto \mathbb{R}^{3N} BS(β ):Rβ R3N 接手了这幅画布,它根据输入的形状参数 β ⃗ \vec{\beta} β 调整人体的身份特征。你可以把它想象成雕塑家用工具精细刻画每个人独特的体型(例如高矮胖瘦),如图3(b)所示。公式上,它可以表示为:
B S ( β ⃗ ) = ∑ n = 1 ∣ β ⃗ ∣ β n S n B_S(\vec{\beta}) = \sum_{n=1}^{|\vec{\beta}|} \beta_n \mathbf{S}_n BS(β )=n=1β βnSn
其中, S n \mathbf{S}_n Sn 是形状偏移的主成分, β n \beta_n βn 是形状参数。

与此同时,关节预测函数 J ( β ⃗ ) : R ∣ β ⃗ ∣ ↦ R 3 K J(\vec{\beta}): \mathbb{R}^{|\vec{\beta}|} \mapsto \mathbb{R}^{3K} J(β ):Rβ R3K 用来预测每个关节的位置。关节的定义不仅与整体体型相关,还与模板顶点 T ˉ \bar{\mathbf{T}} Tˉ 和形状偏移 B S ( β ⃗ ) B_S(\vec{\beta}) BS(β ) 有关,公式为:
J ( β ⃗ ) = J ( T ˉ + B S ( β ⃗ ) ) J(\vec{\beta}) = J(\bar{\mathbf{T}} + B_S(\vec{\beta})) J(β )=J(Tˉ+BS(β ))
其中 J J J 是一个线性回归矩阵,用于将顶点回归为关节位置。图3(b)中的白点正是这些被预测的关节。

接下来,姿势混合函数 B P ( θ ⃗ ) : R ∣ θ ⃗ ∣ ↦ R 3 N B_P(\vec{\theta}): \mathbb{R}^{|\vec{\theta}|} \mapsto \mathbb{R}^{3N} BP(θ ):Rθ R3N 开始登场。它负责处理由姿势参数 θ ⃗ \vec{\theta} θ 带来的动态变形。可以理解为:当你抬手或者弯腰时,身体的肌肉和软组织会产生形变,而 B P B_P BP 就是通过计算这些变化的细节来补偿模型中的不足。它的数学形式是:
B P ( θ ⃗ ) = ∑ n = 1 9 K ( R n ( θ ⃗ ) − R n ( θ ⃗ ∗ ) ) P n B_P(\vec{\theta}) = \sum_{n=1}^{9K} \big( R_n(\vec{\theta}) - R_n(\vec{\theta}^*) \big) \mathbf{P}_n BP(θ )=n=19K(Rn(θ )Rn(θ ))Pn
其中, R n ( θ ⃗ ) R_n(\vec{\theta}) Rn(θ ) 是姿势旋转矩阵, P n \mathbf{P}_n Pn 是与姿势相关的偏移量。如图3©所示,这一步让模型更贴近现实动态。

最终,所有的调整都会被累加在一起,形成一个“修正的模板”:
T P ( β ⃗ , θ ⃗ ) = T ˉ + B S ( β ⃗ ) + B P ( θ ⃗ ) T_P(\vec{\beta}, \vec{\theta}) = \bar{\mathbf{T}} + B_S(\vec{\beta}) + B_P(\vec{\theta}) TP(β ,θ )=Tˉ+BS(β )+BP(θ )
这个修正后的模板通过标准的线性混合蒙皮函数 W ( ⋅ ) W(\cdot) W() 进一步调整,公式为:
M ( β ⃗ , θ ⃗ ) = W ( T P ( β ⃗ , θ ⃗ ) , J ( β ⃗ ) , θ ⃗ , W ) M(\vec{\beta}, \vec{\theta}) = W\big( T_P(\vec{\beta}, \vec{\theta}), J(\vec{\beta}), \vec{\theta}, \mathcal{W} \big) M(β ,θ )=W(TP(β ,θ ),J(β ),θ ,W)
这里, W ( ⋅ ) W(\cdot) W() 定义了每个顶点如何随着关节的旋转进行平滑变换,最终得到变形后的顶点位置。如图3(d)所示,模型的最终结果是一个完全“活起来”的人体网格。

总的来说,SMPL 模型的魔力在于将每个顶点“绑定”到关节,并通过形状参数和姿势参数灵活调整网格形状。这个过程就像是让一个3D人体从静止状态进入动态世界,每个细节都经过数学公式的严格定义,既有“雕刻体型”的精准,也有“动态表演”的灵活!

Blend Skinning:人体真实物理特性建模

想象一下,我们要让一个数字人体模型动起来,比如做个瑜伽动作或舞蹈的劈叉。这不是简单的“拉动关节”,而是需要考虑人体的真实物理特性——关节的层次关系、肌肉的拉伸、皮肤的平滑过渡。这就是 Blend Skinning(线性混合皮肤) 的工作,它让数字人体看起来像个活人,而不是僵硬的木偶。

Blend Skinning 的核心思想是:人体的每个顶点(也就是皮肤表面的某个点)受到多个关节的影响,这种影响用权重来表示。同时,顶点的位置变化由关节的旋转和位移共同决定。


1. 关节旋转矩阵的生成

要让身体动起来,首先得让关节能旋转。数学上,我们用 Rodrigues 公式来实现从轴角表示(axis-angle representation)到旋转矩阵的转换:

exp ⁡ ( ω ⃗ j ) = I + ω ˉ ^ j sin ⁡ ( ∥ ω ⃗ j ∥ ) + ω ˉ ^ j 2 ( 1 − cos ⁡ ( ∥ ω ⃗ j ∥ ) ) \exp(\vec{\omega}_j) = \mathcal{I} + \widehat{\bar{\omega}}_j \sin(\|\vec{\omega}_j\|) + \widehat{\bar{\omega}}_j^2 (1 - \cos(\|\vec{\omega}_j\|)) exp(ω j)=I+ωˉ jsin(ω j)+ωˉ j2(1cos(ω j))

在这里, ω ⃗ j \vec{\omega}_j ω j 表示第 j j j 个关节的旋转, ω ˉ ^ j \widehat{\bar{\omega}}_j ωˉ j 是单位向量的反对称矩阵, I \mathcal{I} I 是单位矩阵。这个公式让我们能够从简单的旋转描述生成精确的关节旋转矩阵。

在代码中,这一步通过以下实现:

rot_mats = batch_rodrigues(pose.view(-1, 3)).view(batch_size, -1, 3, 3)
  • 形象比喻:如果把每个关节的旋转看成是转动一个玩具陀螺,那么 batch_rodrigues 就是帮助我们计算出陀螺转动时的精确姿态。
  • 技术解读pose 是包含所有关节旋转信息的张量,我们通过 batch_rodrigues 将它转换为每个关节的旋转矩阵 $ \exp(\vec{\omega}_j) $。

2. 计算关节的世界变换

一个关节的旋转不仅会影响它自身,还会层层影响其子关节。这种层次关系用一个公式描述:

G k ( θ ⃗ , J ) = ∏ j ∈ A ( k ) [ exp ⁡ ( ω ⃗ j ) j j 0 1 ] G_k(\vec{\theta}, \mathbf{J}) = \prod_{j \in A(k)} \begin{bmatrix} \exp(\vec{\omega}_j) & \mathbf{j}_j \\ \mathbf{0} & 1 \end{bmatrix} Gk(θ ,J)=jA(k)[exp(ω j)0jj1]

公式中,$ G_k $ 是第 k k k 个关节的世界变换矩阵, j j \mathbf{j}_j jj 是第 j j j 个关节的位置, A ( k ) A(k) A(k) 表示 k k k 的祖先关节集合。

代码实现如下:

J_transformed, A = batch_rigid_transform(rot_mats, J, parents, dtype=dtype)
  • 形象比喻:想象一个关节系统是一个树状结构,每个父关节的动作都会传递给子关节。batch_rigid_transform 就是在模拟这种“连锁反应”。
  • 技术解读rot_mats 是每个关节的旋转矩阵,J 是关节的位置,parents 定义了关节的层次结构。通过这个函数,我们得到了所有关节的世界坐标 J_transformed 和刚性变换矩阵 A

3. 线性混合皮肤的权重

线性混合皮肤的核心是让一个顶点同时受到多个关节的影响,每个关节的影响力由权重 w k , i w_{k,i} wk,i 决定:

t ˉ i ′ = ∑ k = 1 K w k , i G k ′ ( θ ⃗ , J ) t ˉ i \bar{\mathbf{t}}_i' = \sum_{k=1}^K w_{k,i} G_k'(\vec{\theta}, \mathbf{J}) \bar{\mathbf{t}}_i tˉi=k=1Kwk,iGk(θ ,J)tˉi

在这里:

  • K K K 是关节数;
  • w k , i w_{k,i} wk,i 是权重,表示第 i i i 个顶点受到第 k k k 个关节影响的程度;
  • G k ′ G_k' Gk 是关节的世界变换矩阵。

对应代码如下:

W = lbs_weights.unsqueeze(dim=0).expand([batch_size, -1, -1])
T = torch.matmul(W, A.view(batch_size, num_joints, 16)).view(batch_size, -1, 4, 4)
  • 形象比喻:权重 w k , i w_{k,i} wk,i 就像橡皮筋,把顶点和关节连接在一起。橡皮筋的松紧程度决定了关节对顶点的拉拽力度。
  • 技术解读lbs_weights 是权重矩阵,A 是刚性变换矩阵。通过矩阵乘法,我们得到了每个顶点的变换矩阵 T

4. 顶点的最终变换

最终,每个顶点的位置由以下公式给出:

t ˉ i ′ = ∑ k = 1 K w k , i G k ′ ( θ ⃗ , J ) ( t ˉ i + b S , i ( β ⃗ ) + b P , i ( θ ⃗ ) ) \mathbf{\bar{t}}_i' = \sum_{k=1}^K w_{k,i} G_k'(\vec{\theta}, \mathbf{J}) (\bar{\mathbf{t}}_i + \mathbf{b}_{S,i}(\vec{\beta}) + \mathbf{b}_{P,i}(\vec{\theta})) tˉi=k=1Kwk,iGk(θ ,J)(tˉi+bS,i(β )+bP,i(θ ))

公式的含义是:每个顶点不仅受到关节旋转的影响,还会叠加形状变形 b S , i \mathbf{b}_{S,i} bS,i 和姿势变形 b P , i \mathbf{b}_{P,i} bP,i

对应代码如下:

homogen_coord = torch.ones([batch_size, v_posed.shape[1], 1], dtype=dtype, device=device)
v_posed_homo = torch.cat([v_posed, homogen_coord], dim=2)
v_homo = torch.matmul(T, torch.unsqueeze(v_posed_homo, dim=-1))
verts = v_homo[:, :, :3, 0]
  • 形象比喻:如果顶点是皮肤上的某个点,那么这个点的位置会被关节拉拽,同时还会因为肌肉运动(姿势变形)和个体差异(形状变形)而移动。
  • 技术解读v_posed 是经过形状和姿势变形的顶点,T 是变换矩阵。我们将顶点转为齐次坐标后,通过矩阵变换计算出最终的顶点位置 verts

总结:Blend Skinning 的数学与实现

Blend Skinning 是让人体模型从“静止的雕像”变成“会动的数字人”的关键。它通过以下步骤完成:

  1. 关节旋转矩阵的计算:用 Rodrigues 公式生成关节的旋转。
  2. 关节的层次变换:通过刚性变换模拟关节之间的传递关系。
  3. 权重影响的叠加:用权重矩阵表示顶点与关节的联系。
  4. 顶点的最终变换:结合关节变换、形状变形和姿势变形,计算出顶点的新位置。

Blend Skinning 既体现了人体运动的物理规律,也为数字动画提供了可实现的计算方案,最终让虚拟人物自然流畅地动了起来。

Shape Blend Shapes: 赋予模型“个性”的形状变换

想象一下,我们手中有一个由6890个点组成的“人体黏土模型”,这是一个基础的“零姿态”人体模板 T ˉ \bar{\mathbf{T}} Tˉ。这个模板是每个人体模型的起点,但它还没有“灵魂”,因为它没有个性化的形状特征。Shape Blend Shapes 的任务就是通过一组形状参数 β ⃗ \vec{\beta} β 来“雕刻”这个模板,使它变成我们希望的人体形状。


1. 数学公式:将形状参数融入基础模型

B S ( β ⃗ ; S ) = ∑ n = 1 ∣ β ⃗ ∣ β n S n B_S(\vec{\beta};\mathcal{S}) = \sum_{n=1}^{|\vec{\beta}|} \beta_n \mathbf{S}_n BS(β ;S)=n=1β βnSn

这个公式是 Shape Blend Shapes 的核心,它表示一个形状偏移 B S ( β ⃗ ; S ) B_S(\vec{\beta}; \mathcal{S}) BS(β ;S),它是形状参数 β ⃗ \vec{\beta} β 和一组形状基 S \mathcal{S} S 的线性组合。每个形状基 S n \mathbf{S}_n Sn 可以被看作“雕刻工具”,而 β n \beta_n βn 就是这个工具的力度。通过组合多个工具,我们可以“雕刻”出一个独特的个体化人体形状。

  • β ⃗ = [ β 1 , β 2 , … , β ∣ β ⃗ ∣ ] \vec{\beta} = [\beta_1, \beta_2, \ldots, \beta_{|\vec{\beta}|}] β =[β1,β2,,ββ ]:控制个体形状特征的参数,比如一个人是高瘦还是矮胖。
  • S n \mathbf{S}_n Sn:每个形状基代表了人体形状变化的一个主要方向,比如肩膀宽度、腿长等。

最终,这些偏移量加到基础模型 T ˉ \bar{\mathbf{T}} Tˉ 上,塑造出具体的个体形状。


2. 对应代码:将数学公式转化为计算

为了将这个公式变成代码实现,以下几行是关键:

v_shaped = v_template + blend_shapes(betas, shapedirs)

让我们拆开来理解:

  • v_template 是基础模型 T ˉ \bar{\mathbf{T}} Tˉ,表示零姿态下的人体形状。
  • betas 是形状参数 β ⃗ \vec{\beta} β ,控制每个形状基的权重。
  • shapedirs 是形状基矩阵 S \mathcal{S} S,其中每一列是一个形状基 S n \mathbf{S}_n Sn

这段代码中最重要的部分是 blend_shapes 函数,它的核心功能是实现公式中的线性组合:

blend_shape = torch.einsum('bl,mkl->bmk', [betas, shapedirs])

我们来看这里的核心计算:

  • torch.einsum 是一个高效的线性代数操作工具,'bl,mkl->bmk' 的含义是:
    1. b b b:批次大小,表示多个输入样本。
    2. l l l:形状参数的维度( ∣ β ⃗ ∣ |\vec{\beta}| β )。
    3. m × k m \times k m×k:人体模型的点数和空间维度( 3 N 3N 3N)。

通过这个操作, β ⃗ \vec{\beta} β S \mathcal{S} S 进行矩阵乘法,结果是每个样本的形状偏移量 B S ( β ⃗ ; S ) B_S(\vec{\beta}; \mathcal{S}) BS(β ;S)


3. 将形状偏移与基础模型结合

在得到形状偏移 B S ( β ⃗ ; S ) B_S(\vec{\beta}; \mathcal{S}) BS(β ;S) 后,我们需要将其加到模板形状上:

T P ( β ⃗ , θ ⃗ ) = T ˉ + B S ( β ⃗ ) T_P(\vec{\beta}, \vec{\theta}) = \bar{\mathbf{T}} + B_S(\vec{\beta}) TP(β ,θ )=Tˉ+BS(β )

代码中对应这一步是:

v_shaped = v_template + blend_shape

这一步通过简单的加法,将基础形状和形状偏移结合,生成了具有个体特征的模型 v_shaped。可以想象,v_template 是一个“基础黏土块”,而 blend_shape 是我们用来雕刻它的“工具”。最终的 v_shaped 是一个有独特特征的人体模型。


总结:人体模型的“个性化定制”

假设我们有一个工厂,生产“人体模型”。这个工厂的原材料是一个标准模板 T ˉ \bar{\mathbf{T}} Tˉ,而 Shape Blend Shapes 就是给这个模板注入个性化特征的“雕刻师”。每一个形状基 S n \mathbf{S}_n Sn 就像一组不同的雕刻工具,比如:

  • 一个工具专注于“改变肩膀宽度”。
  • 一个工具负责“拉长双腿”。
  • 另一个工具会“增大头部”。

然后,每个工具的力度由 β ⃗ \vec{\beta} β 控制,工具力度越大,模型就会在该方向上变化更多。

通过线性组合这些工具的效果,我们最终得到了一个属于“某个人”的个性化人体模型。

姿态形变(Pose Blend Shapes):让模型“动”起来

在 SMPL 模型中,姿态形变(Pose Blend Shapes)是一项非常核心的技术,它可以用来模拟人体在不同姿态下,由于关节旋转而引发的非刚性形变,即关节旋转如何变成顶点的移动。简单来说,假如人体是一块柔软的橡胶布,关节的旋转不仅会带来骨骼的运动,还会引起肌肉、皮肤的拉伸或褶皱,而姿态形变就是用数学和代码让这些细节生动地体现在模型上。

姿态形变的数学公式是:

B P ( θ ⃗ ; P ) = ∑ n = 1 9 K ( R n ( θ ⃗ ) − R n ( θ ⃗ ∗ ) ) P n B_P(\vec{\theta}; \mathcal{P}) = \sum_{n=1}^{9K}(R_n(\vec{\theta}) - R_n(\vec{\theta}^*))\mathbf{P}_n BP(θ ;P)=n=19K(Rn(θ )Rn(θ ))Pn

这句话的意思是:我们计算关节旋转矩阵 R n ( θ ⃗ ) R_n(\vec{\theta}) Rn(θ ) 和基准姿态(也叫“零姿态”)旋转矩阵 R n ( θ ⃗ ∗ ) R_n(\vec{\theta}^*) Rn(θ ) 之间的差异,用这个差异来调整一组预定义的“形变模版”(也就是 P n \mathbf{P}_n Pn),最终生成每个顶点的姿态偏移 B P ( θ ⃗ ; P ) B_P(\vec{\theta}; \mathcal{P}) BP(θ ;P)

  • R n ( θ ⃗ ) R_n(\vec{\theta}) Rn(θ ) 是通过关节的轴角参数(轴角表示法)计算出来的旋转矩阵。
  • R n ( θ ⃗ ∗ ) R_n(\vec{\theta}^*) Rn(θ ) 是基准姿态下的旋转矩阵,一般是单位矩阵(意味着无旋转)。
  • P n \mathbf{P}_n Pn 是每个关节对应的姿态形变基,它记录了关节旋转对每个顶点的具体影响。
  • 9K 是 SMPL 模型中所有关节的旋转矩阵元素总数,K 是关节数(通常为 23 个)。

核心思想是:用关节旋转的差异来驱动顶点的变化,同时保证在零姿态下(例如站立姿态),这些变化为零。

  1. 计算旋转矩阵

公式的第一步是将轴角参数 θ ⃗ \vec{\theta} θ 转换为旋转矩阵 R ( θ ⃗ ) R(\vec{\theta}) R(θ )。这是用 Rodrigues 公式完成的,代码实现如下:

rot_mats = batch_rodrigues(pose.view(-1, 3)).view([batch_size, -1, 3, 3])
  • 公式背景:Rodrigues 公式用来将轴角表示法转换为旋转矩阵:
    exp ⁡ ( ω ⃗ ) = I + ω ˉ ^ sin ⁡ ( ∥ ω ⃗ ∥ ) + ω ˉ ^ 2 ( 1 − cos ⁡ ( ∥ ω ⃗ ∥ ) ) \exp(\vec{\omega}) = \mathcal{I} + \widehat{\bar{\omega}} \sin(\|\vec{\omega}\|) + \widehat{\bar{\omega}}^2 (1 - \cos(\|\vec{\omega}\|)) exp(ω )=I+ωˉ sin(ω )+ωˉ 2(1cos(ω ))

    • ω ⃗ \vec{\omega} ω :轴角向量。
    • ω ˉ ^ \widehat{\bar{\omega}} ωˉ :向量的反对称矩阵。
    • I \mathcal{I} I:单位矩阵。
  • 代码实现batch_rodrigues 是实现该公式的核心函数,它将批量输入的姿态参数(轴角表示法)转换为旋转矩阵,并返回形状为 [ b a t c h _ s i z e , K , 3 , 3 ] [batch\_size, K, 3, 3] [batch_size,K,3,3] 的旋转矩阵。


  1. 计算姿态差异

接下来,我们需要计算关节当前姿态和基准姿态的差异:

pose_feature = (rot_mats[:, 1:, :, :] - ident).view([batch_size, -1])
  • 公式对应:这里的 ( R n ( θ ⃗ ) − R n ( θ ⃗ ∗ ) ) (R_n(\vec{\theta}) - R_n(\vec{\theta}^*)) (Rn(θ )Rn(θ )) 直接体现在代码中,rot_mats 是当前关节旋转矩阵,ident 是基准姿态矩阵(通常是单位矩阵 I \mathcal{I} I)。
  • 代码功能:这一步将旋转矩阵的差异展平(view 操作),以便后续的线性组合。

  1. 姿态形变偏移

公式的下一步是将姿态差异与姿态形变基矩阵 P \mathcal{P} P 结合,得到每个顶点的偏移量:

pose_offsets = torch.matmul(pose_feature, posedirs).view(batch_size, -1, 3)
  • 公式对应:这一行代码实现了:
    B P ( θ ⃗ ; P ) = ∑ n = 1 9 K ( R n ( θ ⃗ ) − R n ( θ ⃗ ∗ ) ) P n B_P(\vec{\theta}; \mathcal{P}) = \sum_{n=1}^{9K}(R_n(\vec{\theta}) - R_n(\vec{\theta}^*))\mathbf{P}_n BP(θ ;P)=n=19K(Rn(θ )Rn(θ ))Pn

    • pose_feature ( R n ( θ ⃗ ) − R n ( θ ⃗ ∗ ) ) (R_n(\vec{\theta}) - R_n(\vec{\theta}^*)) (Rn(θ )Rn(θ ))
    • posedirs P \mathcal{P} P,表示姿态形变基矩阵,每列是一个姿态偏移向量 P n \mathbf{P}_n Pn
  • 代码结果pose_offsets 是形状为 [ b a t c h _ s i z e , N , 3 ] [batch\_size, N, 3] [batch_size,N,3] 的张量,其中 N N N 是顶点数量(6890)。每个顶点都被赋予了一个姿态相关的偏移量。


  1. 将姿态偏移与基础形状相加

最后一步是将姿态偏移 B P ( θ ⃗ ; P ) B_P(\vec{\theta}; \mathcal{P}) BP(θ ;P) 加到基础形状上,生成带有姿态信息的模型:

v_posed = pose_offsets + v_shaped
  • 公式对应:最终的模型形状可以表示为:
    T P ( β ⃗ , θ ⃗ ) = T ˉ + B S ( β ⃗ ) + B P ( θ ⃗ ) T_P(\vec{\beta}, \vec{\theta}) = \bar{\mathbf{T}} + B_S(\vec{\beta}) + B_P(\vec{\theta}) TP(β ,θ )=Tˉ+BS(β )+BP(θ )

    • T ˉ \bar{\mathbf{T}} Tˉ:模板形状。
    • B S ( β ⃗ ) B_S(\vec{\beta}) BS(β ):形状偏移。
    • B P ( θ ⃗ ) B_P(\vec{\theta}) BP(θ ):姿态偏移。
  • 代码功能v_shaped 是基础形状,包含了形状偏移 B S ( β ⃗ ) B_S(\vec{\beta}) BS(β )。通过加上姿态偏移 p o s e o f f s e t s pose_offsets poseoffsets,生成了带有姿态变化的形状 v p o s e d v_posed vposed

总结:可以把姿态形变看作是“雕刻橡皮泥”的过程。基础形状 v _ s h a p e d v\_shaped v_shaped 就像是一块静态的人体橡皮泥,而姿态偏移 p o s e _ o f f s e t s pose\_offsets pose_offsets 是雕刻工具,通过关节旋转矩阵的变化,在不同部位进行“雕刻”。

比如,当一个人抬起手臂时:

  • 关节的旋转会通过 R ( θ ⃗ ) − R ( θ ⃗ ∗ ) R(\vec{\theta}) - R(\vec{\theta}^*) R(θ )R(θ ) 捕捉到。
  • 姿态形变基矩阵 P \mathcal{P} P 会对每个顶点的移动方向和幅度做出定义。
  • 最终生成的 v _ p o s e d v\_posed v_posed 就是抬起手臂后的动态形状。

通过这种方式,SMPL 模型可以在姿态变化时表现出真实的肌肉和皮肤形变,让人体模型看起来更加逼真和自然!

关节位置计算(Joint Locations):模型骨骼的精准“定位”

在SMPL模型中,关节的位置是人体骨骼的基石。可以想象,关节就像模型骨架上的“铆钉”,这些铆钉决定了整个骨骼系统的结构。如果关节位置不准确,模型的骨骼就会错位,进而导致网格表面的变形变得奇怪,动作看起来僵硬甚至扭曲。为了确保关节精确地定位在正确的位置,SMPL通过以下数学公式,将关节位置定义为形状参数 β ⃗ \vec{\beta} β 的函数:

J ( β ⃗ ; J , T ˉ , S ) = J ( T ˉ + B S ( β ⃗ ; S ) ) J(\vec{\beta};\mathcal{J},\mathbf{\bar{T}},\mathcal{S}) = \mathcal{J}(\mathbf{\bar{T}} + B_S(\vec{\beta};\mathcal{S})) J(β ;J,Tˉ,S)=J(Tˉ+BS(β ;S))

公式的核心思想是:

  1. 首先通过模板形状 T ˉ \mathbf{\bar{T}} Tˉ 和形状偏移 B S ( β ⃗ ; S ) B_S(\vec{\beta};\mathcal{S}) BS(β ;S) 计算人体网格的顶点位置。
  2. 然后用一个预训练的关节回归矩阵 J \mathcal{J} J,把这些顶点的位置映射为关节的位置 J ( β ⃗ ) J(\vec{\beta}) J(β )
  3. 关节的位置直接依赖于人体的个体化形状(由 β ⃗ \vec{\beta} β 决定)。

1. 个体化形状:用形状参数“雕刻”模板形状

关节位置的计算依赖于每个人体的具体形状,因此第一步是用形状参数 β ⃗ \vec{\beta} β 对模板形状 T ˉ \mathbf{\bar{T}} Tˉ 进行调整:

T ˉ + B S ( β ⃗ ; S ) \mathbf{\bar{T}} + B_S(\vec{\beta};\mathcal{S}) Tˉ+BS(β ;S)

公式中, B S ( β ⃗ ; S ) B_S(\vec{\beta};\mathcal{S}) BS(β ;S) 是形状偏移,它描述了模板形状如何根据参数 β ⃗ \vec{\beta} β 被“雕刻”成特定个体的形状。代码中,这一步由以下实现:

v_shaped = v_template + blend_shapes(betas, shapedirs)
  • v_template 是模板形状 T ˉ \mathbf{\bar{T}} Tˉ,相当于一个标准的零姿态人体模型。
  • blend_shapes(betas, shapedirs) 计算形状偏移 B S ( β ⃗ ; S ) B_S(\vec{\beta};\mathcal{S}) BS(β ;S)。其中:
    • betas 是形状参数 β ⃗ \vec{\beta} β ,控制人体特征,比如高矮、胖瘦。
    • shapedirs 是形状基矩阵 S \mathcal{S} S,每列表示一种形状变化的方向,比如肩膀宽度或腿长。

这一步相当于用一组形状基对模板进行调整,就像一个雕塑家根据模型参数为每个人的身体定制独特的形状。


2. 关节位置:从顶点位置“提取”骨骼节点

得到个体化形状后,下一步是通过回归矩阵 J \mathcal{J} J 从这些顶点位置中提取关节位置。公式如下:

J ( β ⃗ ) = J ( T ˉ + B S ( β ⃗ ; S ) ) J(\vec{\beta}) = \mathcal{J}(\mathbf{\bar{T}} + B_S(\vec{\beta};\mathcal{S})) J(β )=J(Tˉ+BS(β ;S))

代码实现对应为:

J = vertices2joints(J_regressor, v_shaped)
  • J_regressor 对应回归矩阵 J \mathcal{J} J,它通过学习大量人体数据确定哪些顶点对每个关节位置有影响,以及这些影响的权重。
  • vertices2joints 函数通过矩阵乘法,将关节回归矩阵 J \mathcal{J} J 和个体化顶点位置 v s h a p e d v_shaped vshaped 相结合,计算关节位置。

假设 J \mathcal{J} J 是一个 K × N K \times N K×N 的矩阵,其中 K K K 是关节数量(23个), N N N 是顶点数量(6890个),每个关节的位置是其周围顶点位置的加权和。这种方式可以确保关节的位置随着个体化形状而动态调整。

形象解读:人体模型的关节“对准”过程

可以将人体模型想象成一个由弹性网格组成的“橡皮人”,而关节就像网格中的“铆钉”,每个铆钉的位置需要精准地放置。这个过程包括两步:

  1. 先根据形状参数 β ⃗ \vec{\beta} β 调整“橡皮人”的形状(通过模板形状和形状偏移)。
  2. 再通过回归矩阵 J \mathcal{J} J 从网格顶点中找出铆钉的位置。

例如,一个肩膀宽的人,网格调整后,肩膀的铆钉自然会更靠外;而一个身材瘦小的人,铆钉会贴近中心。这样的动态调整使得模型在不同个体上都能保持骨骼结构的合理性。

SMPL模型:从静态模板到动态人体

想象一下,我们有一个基础的静态人体模板模型 T ˉ \bar{\mathbf{T}} Tˉ。它就像一块等待被雕刻的“黏土”。通过 SMPL 模型,我们可以根据不同的形状参数 β ⃗ \vec{\beta} β 和姿态参数 θ ⃗ \vec{\theta} θ ,将这块黏土“雕刻”成任意个体化、动态化的人体。这一过程依靠一系列精妙的数学公式和线性代数操作来实现。

SMPL模型的完整公式为:

M ( β ⃗ , θ ⃗ ; Φ ) = W ( T P ( β ⃗ , θ ⃗ ; T ˉ , S , P ) , J ( β ⃗ ; J , T ˉ , S ) , θ ⃗ , W ) M(\vec{\beta}, \vec{\theta}; \Phi) = W\left(T_P(\vec{\beta}, \vec{\theta}; \bar{\mathbf{T}}, \mathcal{S}, \mathcal{P}), J(\vec{\beta}; \mathcal{J}, \bar{\mathbf{T}}, \mathcal{S}), \vec{\theta}, \mathcal{W}\right) M(β ,θ ;Φ)=W(TP(β ,θ ;Tˉ,S,P),J(β ;J,Tˉ,S),θ ,W)

这里:

  • T P ( β ⃗ , θ ⃗ ) T_P(\vec{\beta}, \vec{\theta}) TP(β ,θ ):结合形状和姿态的顶点位置。
  • J ( β ⃗ ) J(\vec{\beta}) J(β ):根据形状参数计算的关节位置。
  • W W W:线性混合皮肤(LBS)函数,用于将顶点围绕关节进行旋转和平滑变形。
  • Φ = { T ˉ , W , S , J , P } \Phi = \{\bar{\mathcal{T}}, \mathcal{W}, \mathcal{S}, \mathcal{J}, \mathcal{P}\} Φ={Tˉ,W,S,J,P}:模型的全部参数,包括模板形状、混合权重、形状基、关节回归矩阵和姿态形变基。

最终,每个顶点的位置通过以下公式计算:

t i ′ = ∑ k = 1 K w k , i G k ′ ( θ ⃗ , J ( β ⃗ ) ) t P , i ( β ⃗ , θ ⃗ ; T ˉ , S , P ) \mathbf{t}_i^{\prime} = \sum_{k=1}^K w_{k,i} G_k^{\prime}(\vec{\theta}, J(\vec{\beta})) \mathbf{t}_{P,i}(\vec{\beta}, \vec{\theta}; \bar{\mathbf{T}}, \mathcal{S}, \mathcal{P}) ti=k=1Kwk,iGk(θ ,J(β ))tP,i(β ,θ ;Tˉ,S,P)

这里的 t P , i \mathbf{t}_{P,i} tP,i 是形状和姿态变形后的顶点位置。


1. 刚性变换矩阵 G k ′ ( θ ⃗ , J ( β ⃗ ) ) G_k^{\prime}(\vec{\theta}, J(\vec{\beta})) Gk(θ ,J(β )):实现旋转的骨架

每个关节的刚性变换由姿态参数 θ ⃗ \vec{\theta} θ 和关节位置 J ( β ⃗ ) J(\vec{\beta}) J(β ) 决定:

G k ′ ( θ ⃗ , J ( β ⃗ ) ) = G k ( θ ⃗ , J ( β ⃗ ) ) G k ( θ ⃗ ∗ , J ( β ⃗ ) ) − 1 G_k^{\prime}(\vec{\theta}, J(\vec{\beta})) = G_k(\vec{\theta}, J(\vec{\beta})) G_k(\vec{\theta}^*, J(\vec{\beta}))^{-1} Gk(θ ,J(β ))=Gk(θ ,J(β ))Gk(θ ,J(β ))1

代码实现如下:

J_transformed, A = batch_rigid_transform(rot_mats, J, parents, dtype=dtype)
  • rot_mats 是通过 Rodrigues 公式计算的旋转矩阵 R ( θ ⃗ ) R(\vec{\theta}) R(θ )
  • J 是关节位置 J ( β ⃗ ) J(\vec{\beta}) J(β )
  • parents 定义了关节的层次关系,例如肩膀是肘部的父关节。

这一步生成的刚性变换矩阵 G k ′ G_k^{\prime} Gk 用于顶点的线性混合皮肤变形。


2. 线性混合皮肤 W W W:平滑的顶点变形

每个顶点的位置通过线性混合皮肤公式计算:

t i ′ = ∑ k = 1 K w k , i G k ′ ( θ ⃗ , J ( β ⃗ ) ) t P , i \mathbf{t}_i^{\prime} = \sum_{k=1}^K w_{k,i} G_k^{\prime}(\vec{\theta}, J(\vec{\beta})) \mathbf{t}_{P,i} ti=k=1Kwk,iGk(θ ,J(β ))tP,i

代码实现如下:

W = lbs_weights.unsqueeze(dim=0).expand([batch_size, -1, -1])
T = torch.matmul(W, A.view(batch_size, num_joints, 16)).view(batch_size, -1, 4, 4)
homogen_coord = torch.ones([batch_size, v_posed.shape[1], 1], dtype=dtype, device=device)
v_posed_homo = torch.cat([v_posed, homogen_coord], dim=2)
v_homo = torch.matmul(T, torch.unsqueeze(v_posed_homo, dim=-1))
verts = v_homo[:, :, :3, 0]
  • lbs_weights 是混合权重矩阵 W \mathcal{W} W,表示每个顶点受哪些关节的影响及其权重。
  • A 是关节的刚性变换矩阵 G k ′ G_k^{\prime} Gk
  • v_posed 是形状和姿态变形后的顶点位置 T P ( β ⃗ , θ ⃗ ) T_P(\vec{\beta}, \vec{\theta}) TP(β ,θ )

最终计算得到的 verts 是经过关节旋转和平滑变形后的顶点位置。


生动形象的总结
可以将SMPL模型看作是一个“人体工厂”,它接收输入的形状参数 β ⃗ \vec{\beta} β 和姿态参数 θ ⃗ \vec{\theta} θ ,通过以下几个步骤完成对人体模型的“定制”:

  1. 骨架旋转:利用刚性变换矩阵模拟关节旋转。
  2. 皮肤平滑变形:通过线性混合皮肤生成最终的动态人体网格。
    这一切最终让一块“静态的黏土”变成一个“灵活的数字人”,既能体现个性化特征,又能流畅地运动,精准还原人体的动态行为。

训练

训练阶段 数据集 参数 优化目标 正则化项
姿势参数训练 多姿势数据集(Multi-Pose Dataset):1786个注册数据(891个女性,895个男性) { J , W , P } \{J, W, P\} {J,W,P},主体特定的 { T ^ i P , J ^ i P } \{\hat{\mathcal{T}}_i^P, \hat{\mathcal{J}}_i^P\} {T^iP,J^iP},姿势参数 θ ⃗ j \vec{\theta}_j θ j 最小化顶点重建误差: E D ( T ^ P , J ^ P , W , P , Θ ) E_D(\hat{\mathbf{T}}^{P}, \hat{\mathbf{J}}^{P}, W, P, \Theta) ED(T^P,J^P,W,P,Θ) 对称性正则化 E Y ( J ^ P , T ^ P ) E_Y(\hat{\mathbf{J}}^P, \hat{\mathbf{T}}^P) EY(J^P,T^P),惩罚 J ^ P \hat{\mathbf{J}}^P J^P T ^ P \hat{\mathbf{T}}^P T^P 的左右不对称性
在这里插入图片描述
关节回归优化 J ^ i P = J T ^ i P \hat{\mathbf{J}}_i^P = J \hat{\mathbf{T}}_i^P J^iP=JT^iP 关节位置正则化 E J ( T ^ P , J ^ P ) E_J(\hat{\mathbf{T}}^P, \hat{\mathbf{J}}^P) EJ(T^P,J^P)
姿势依赖混合形状正则化 E P ( P ) = ∣ P ∣ F 2 E_P(P) = |P|_F^2 EP(P)=PF2 混合权重正则化 E W ( W ) = ∣ W − W 1 ∣ F 2 E_W(W) = |W - W_1|_F^2 EW(W)=WW1F2
总能量: E ∗ ( T ^ P , J ^ P , Θ , W , P ) = E D + λ Y E Y + λ J E J + λ P E P + E W E_{*}(\hat{\mathbf{T}}^{P}, \hat{\mathbf{J}}^{P}, \Theta, W, P) = E_D + \lambda_Y E_Y + \lambda_J E_J + \lambda_P E_P + E_W E(T^P,J^P,Θ,W,P)=ED+λYEY+λJEJ+λPEP+EW
形状参数训练 多形状数据集(Multi-Shape Dataset):1700个男性数据和2100个女性数据 形状参数 { T ˉ , S } \{\bar{\mathbf{T}}, S\} {Tˉ,S},姿势标准化后的注册数据 Π ^ j S \hat{\Pi}_j^S Π^jS 姿势标准化: T ^ j S = arg ⁡ min ⁡ T ^ ∣ W ( T ^ + B P ( θ ⃗ j ; P ) , J T ^ , θ ⃗ j , W ) − V j S ∣ 2 \hat{\text{T}}_j^S = \arg\min_{\hat{\text{T}}} |W(\hat{\text{T}} + B_P(\vec{\theta}_j; P), J \hat{\text{T}}, \vec{\theta}_j, W) - \mathbf{V}_j^S|^2 T^jS=argT^minW(T^+BP(θ j;P),JT^,θ j,W)VjS2 PCA 计算姿势标准化形状:通过 PCA 提取形状基
在这里插入图片描述
形状混合形状:$$B_S(\vec{\beta}; S) = \sum_{n=1}^{ \vec{\beta} } \beta_n \mathbf{S}_n$$
优化策略 姿势与形状模型 Φ = { T ˉ , W , S , J , P } \Phi = \{\bar{\mathcal{T}}, W, S, J, P\} Φ={Tˉ,W,S,J,P} 优化 { T ^ P , J ^ P , W , P , Θ } \{\hat{\mathbf{T}}^P, \hat{\mathbf{J}}^P, W, P, \Theta\} {T^P,J^P,W,P,Θ},交替进行姿势与形状训练 梯度下降法优化目标:使用自动微分(Chumpy框架)进行梯度计算,进行模型训练 非负最小二乘法(NLLS):优化关节回归矩阵 J J J(保证权重非负且相加为1)
学习 J J J 来预测新主体的关节位置 正则化:防止过拟合,通过数据项加权来调节正则化项

姿态参数训练:让静态人体模型“动”起来的优化艺术

想象一下,我们要从一个静态的人体模板出发,将它变成一个能够动态动作的数字人体。这个过程不仅需要优化骨骼的“骨架”(关节位置 J \mathcal{J} J),还需要决定每个关节如何控制周围的“皮肤”(混合权重 W \mathcal{W} W)以及关节旋转如何影响皮肤的变形(姿态形变基矩阵 P \mathcal{P} P)。SMPL 模型的姿态参数训练,就是在数学优化的框架下实现这个转变的关键一步。


1. 数据项 E D E_D ED:数据驱动的网格对齐

训练的核心目标是让模型生成的网格和真实的注册网格尽可能一致。为此,我们定义了数据项 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 ( θ ⃗ j ; P ) , J ^ s ( j ) P , θ ⃗ j , W ) ∥ 2 E_D(\mathbf{\hat{T}}^P, \mathbf{\hat{J}}^P, \mathcal{W}, \mathcal{P}, \Theta) = \sum_{j=1}^{P_{\mathrm{reg}}} \|\mathbf{V}_j^P - W(\mathbf{\hat{T}}_{s(j)}^P + B_P(\vec{\theta}_j; \mathcal{P}), \mathbf{\hat{J}}_{s(j)}^P, \vec{\theta}_j, \mathcal{W})\|^2 ED(T^P,J^P,W,P,Θ)=j=1PregVjPW(T^s(j)P+BP(θ j;P),J^s(j)P,θ j,W)2

  • V j P \mathbf{V}_j^P VjP:注册网格(真实数据)中顶点的位置。
  • W W W:线性混合皮肤函数,结合关节位置和混合权重,生成动态网格。
  • T ^ s ( j ) P \mathbf{\hat{T}}_{s(j)}^P T^s(j)P:静止模板网格顶点。
  • B P ( θ ⃗ j ; P ) B_P(\vec{\theta}_j; \mathcal{P}) BP(θ j;P):姿态偏移,由姿态参数 θ ⃗ j \vec{\theta}_j θ j 和姿态形变基矩阵 P \mathcal{P} P 计算。
  • J ^ s ( j ) P \mathbf{\hat{J}}_{s(j)}^P J^s(j)P:主体的关节位置。

这部分的核心思想是“对齐”:将真实的网格和模型生成的网格在三维空间中匹配起来。通过最小化两者之间的误差,模型会自动调整姿态参数 θ ⃗ j \vec{\theta}_j θ j、模板顶点 T ^ P \mathbf{\hat{T}}^P T^P、关节位置 J ^ P \mathbf{\hat{J}}^P J^P 和全局参数 W , P \mathcal{W}, \mathcal{P} W,P

生动解读:可以将这个过程想象成“拼图游戏”,真实网格是一幅完成的图,而模型的生成网格是未完成的拼图。数据项 E D E_D ED 是指南,它引导模型将每块拼图精确放置在正确的位置。


2. 对称性正则化 E Y E_Y EY:为模型引入解剖学先验

人体是左右对称的,但训练数据可能存在一些偏差或不完全对称的情况。为了纠正这种不对称性,SMPL 模型引入了对称性正则化项:

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(\mathbf{\hat{J}}^P, \mathbf{\hat{T}}^P) = \sum_{i=1}^{P_{\mathrm{subj}}} \lambda_U \|\mathbf{\hat{J}}_i^P - U(\mathbf{\hat{J}}_i^P)\|^2 + \|\mathbf{\hat{T}}_i^P - U(\mathbf{\hat{T}}_i^P)\|^2 EY(J^P,T^P)=i=1PsubjλUJ^iPU(J^iP)2+T^iPU(T^iP)2

  • U ( ⋅ ) U(\cdot) U():对输入进行镜像翻转,计算左右对称性。
  • λ U \lambda_U λU:对称性约束的权重(通常为 100)。

这一正则化项的目标是强制模型生成左右对称的网格和关节位置,尤其是那些难以直接观测的关节(如脊椎)会因此变得更平滑、更直观。

生动解读:想象你在一面镜子前调整自己的站姿,左右对称让你看起来更“舒服”。同样的,对称性约束让模型的结构更符合人体解剖学规律。


3. 关节回归正则化 E J E_J EJ:从网格到骨架的桥梁

关节回归矩阵 J \mathcal{J} J 是连接人体表面(网格)和内部骨架(关节)的关键参数。为了确保预测的关节位置合理,SMPL 模型使用了以下正则化项:

E J = ∑ i = 1 P s u b j ∥ J I T ^ i P − J ^ i P ∥ 2 E_J = \sum_{i=1}^{P_{\mathrm{subj}}} \|\mathcal{J}_I \mathbf{\hat{T}}_i^P - \mathbf{\hat{J}}_i^P\|^2 EJ=i=1PsubjJIT^iPJ^iP2

  • J I \mathcal{J}_I JI:初始关节回归矩阵,通常通过平均分割计算得到。
  • T ^ i P \mathbf{\hat{T}}_i^P T^iP:模板网格顶点。
  • J ^ i P \mathbf{\hat{J}}_i^P J^iP:实际的关节位置。

这个正则化项约束了关节位置必须是模板顶点的加权平均,并且加权结果需要落在人体表面的凸包内。

生动解读:可以将关节回归矩阵想象成一个“导航系统”,它通过人体表面的地标(顶点),计算出骨骼(关节)的位置。这个正则化项的作用是确保导航的结果始终准确,并且不会偏离“道路”。


4. 姿态形变基正则化 E P E_P EP:控制关节旋转引发的变形

姿态形变基矩阵 P \mathcal{P} P 描述了关节旋转如何引起顶点的非刚性偏移。然而,如果偏移过大,可能会导致模型生成异常的形变。为此,模型引入了以下正则化项:

E P ( P ) = ∥ P ∥ F 2 E_P(\mathcal{P}) = \|\mathcal{P}\|_F^2 EP(P)=PF2

  • ∥ ⋅ ∥ F \|\cdot\|_F F:Frobenius 范数,用于约束矩阵的整体大小。

这一正则化项通过限制 P \mathcal{P} P 的大小,让模型更加稳定地处理关节旋转的复杂变形。

生动解读:姿态形变基可以看作是“弹簧”,它负责处理关节旋转带来的拉伸和挤压。正则化项的作用类似于给弹簧加了一个“限位器”,防止弹簧被拉得太长或压得太短。


5. 混合权重正则化 E W E_W EW:平滑关节对顶点的影响

在这里插入图片描述

图 (a) 展示了初始的分割结果,即将人体网格划分为若干部分。每个部分用不同的颜色表示,例如头部、手臂、腿等。分割的依据是人体解剖学的逻辑,将网格顶点划归到对应的骨骼部分。白色小点表示每个关节的初始中心位置。这些位置是通过分割区域边界的平均值计算得到的。

图 (b) 展示了从离散分割扩散得到的初始混合权重。通过扩散算法,离散的分割区域逐渐形成平滑的过渡,这些过渡区域决定了一个顶点受到多个关节影响的程度。混合权重矩阵 W \mathcal{W} W 决定了每个关节对顶点变形的影响强度。如果权重分布过于稀疏或过于集中,可能会导致模型生成不自然的网格。为此,引入了以下正则化项:
E W ( W ) = ∥ W − W I ∥ F 2 E_W(\mathcal{W}) = \|\mathcal{W} - \mathcal{W}_I\|_F^2 EW(W)=WWIF2

  • W I \mathcal{W}_I WI:初始混合权重矩阵,基于网格分割计算得到。

这一项约束了混合权重的变化范围,确保权重分布更加合理和平滑。

生动解读:混合权重矩阵可以想象成“化妆刷”,它决定了每个关节对周围顶点的影响力。正则化项确保化妆刷的“刷痕”平滑而自然,而不会留下“生硬的边界”。


6. 总优化目标:数据驱动与先验约束的结合

所有数据项和正则化项的组合形成了最终的优化目标函数:

E total = E D + λ Y E Y + λ J E J + λ P E P + E W E_{\text{total}} = E_D + \lambda_Y E_Y + \lambda_J E_J + \lambda_P E_P + E_W Etotal=ED+λYEY+λJEJ+λPEP+EW

  • E D E_D ED:驱动模型拟合真实数据。
  • E Y , E J , E P , E W E_Y, E_J, E_P, E_W EY,EJ,EP,EW:通过几何和物理先验约束模型行为,避免过拟合。

深度解读:这个目标函数在数据驱动(从注册网格学习)和先验约束(对称性、物理合理性)之间找到了平衡点。正是这种结合,使得 SMPL 模型能够在训练时实现精准拟合,同时保持生成的模型稳定且具有通用性。


7. 关节回归矩阵的优化:预测新人体的骨架

在这里插入图片描述

左图中展示的是初始化的关节推断结果。假设顶点对关节的影响是局部的,即一个关节的影响主要集中在靠近该关节的顶点上。网格表面上的顶点通过彩色线条连接到不同的关节。这些线条反映了每个顶点对关节的影响范围,显示了哪些区域的顶点会影响哪些关节。

右图展示了经过优化后的关节回归结果。优化后的模型中,关节位置由稀疏的顶点集合线性组合得到,只有少数顶点显著地影响特定关节的位置。关节回归矩阵 J \mathcal{J} J 是模型扩展性的重要部分。通过非负最小二乘法优化 J \mathcal{J} J,并加入以下约束:

  1. 权重非负:确保关节由表面顶点决定。
  2. 权重和为1:限制关节位置始终位于人体表面的凸包内。

这些约束确保了模型能够准确预测新的个体关节位置,同时保持结果的物理合理性。

形状参数训练:从多样的人体形状中提炼出核心变化

在SMPL模型的构建中,形状参数训练不仅仅是一次简单的数学分解,而是将复杂的人体几何与统计学结合,创造出一个能够精准描述人体形状的模型。这个过程就像一个“雕刻家”,它从原始数据中提取核心特征,去除冗余,最终打造出一个简洁、优雅的人体形状空间。


1. 形状空间的构建:从混乱到有序

形状空间是SMPL模型的基础,它由两个元素定义:均值形状 T ˉ \bar{\mathbf{T}} Tˉ 和主形状方向 S \mathcal{S} S。简单来说, T ˉ \bar{\mathbf{T}} Tˉ 是“平均人体形状”,而 S \mathcal{S} S 则是描述形状变化的“方向”。这些方向来源于多形状数据库,通过主成分分析(PCA)提取。

公式如下:

B S ( β ⃗ ) = T ˉ + ∑ n = 1 ∣ β ⃗ ∣ β n S n B_S(\vec{\beta}) = \bar{\mathbf{T}} + \sum_{n=1}^{|\vec{\beta}|} \beta_n \mathbf{S}_n BS(β )=Tˉ+n=1β βnSn

  • β ⃗ \vec{\beta} β :形状参数,用于控制形状主成分的权重。
  • S n \mathbf{S}_n Sn:每个主成分方向,描述了对应的顶点偏移。

可以把它想象成一个调色板, β ⃗ \vec{\beta} β 就像画笔,调整不同的主成分,就能“画出”不同的人体形状。这种分解方式允许我们用少量的参数捕捉复杂的人体形状变化。


2. 姿势归一化:让形状“站直”

在人体数据中,形状和姿势通常是混在一起的。如果不处理,不同的手臂抬高、腿部弯曲等姿势会干扰对形状的描述。因此,我们需要姿势归一化,将所有形状数据变换到“零姿势”(标准站立姿势)下。

姿势归一化的第一步是估计注册数据的姿势参数 θ ⃗ j \vec{\theta}_j θ j。这个过程的目标是找到一个姿势,使模型预测的边缘(即相邻顶点的连线)与实际数据中的边缘最接近:

θ ⃗ j = arg ⁡ min ⁡ θ ⃗ ∑ e ∥ W e ( T ^ μ P + B P ( θ ⃗ ; P ) , J ^ μ P , θ ⃗ , W ) − V j , e S ∥ 2 \vec{\theta}_j = \arg\min_{\vec{\theta}} \sum_e \|W_e(\mathbf{\hat{T}}_\mu^P + B_P(\vec{\theta}; \mathcal{P}), \mathbf{\hat{J}}_\mu^P, \vec{\theta}, \mathcal{W}) - \mathbf{V}_{j,e}^S\|^2 θ j=argθ mineWe(T^μP+BP(θ ;P),J^μP,θ ,W)Vj,eS2

  • W e W_e We:描述边缘变换的线性混合皮肤函数。
  • V j , e S \mathbf{V}_{j,e}^S Vj,eS:注册数据中实际的边缘。

这个优化过程就像在调整一组关节,让整个身体的边缘与目标形状对齐。

接下来,根据已知的姿势参数 θ ⃗ j \vec{\theta}_j θ j,优化出归一化的形状 T ^ j S \mathbf{\hat{T}}_j^S T^jS

T ^ j S = arg ⁡ min ⁡ T ^ ∥ W ( T ^ + B P ( θ ⃗ j ; P ) , J T ^ , θ ⃗ j , W ) − V j S ∥ 2 . \mathbf{\hat{T}}_j^S = \arg\min_{\hat{\mathbf{T}}} \|W(\hat{\mathbf{T}} + B_P(\vec{\theta}_j; \mathcal{P}), \mathcal{J}\hat{\mathbf{T}}, \vec{\theta}_j, \mathcal{W}) - \mathbf{V}_j^S\|^2. T^jS=argT^minW(T^+BP(θ j;P),JT^,θ j,W)VjS2.

这一步的本质是找到一个形状,当它按照给定的姿势被“摆放”时,能够尽可能贴合训练数据。


3. 为什么要在顶点空间中执行PCA?

传统方法(例如SCAPE)在三角形变形空间中执行PCA,但SMPL选择直接在顶点空间中操作。这种选择背后有两个重要的原因:

  • 顶点空间的欧几里得性质:顶点的坐标直接定义在三维欧几里得空间中,进行PCA能够自然地捕捉形状变化。而三角形变形空间并不具备这种几何一致性。
  • 数据一致性:顶点差异直接对应于数据拟合中的误差项,使得优化和分析更直观。

通过在顶点空间执行PCA,SMPL模型能够在更少的主成分下捕捉更多的形状变化。这种方法不仅更加高效,还减少了冗余信息。


4. 主成分的直观表现:从抽象到具象

在这里插入图片描述

图8 展示了前三个形状主成分的变化对人体形状的影响:

  • PC1:影响身体的整体比例,比如从苗条到宽厚。
  • PC2:调整上下半身的比例,例如增加胸部宽度和减少腿部厚度。
  • PC3:局部变化,细化躯干的形状和轮廓。

每个主成分的变化不仅影响形状,还会带动关节位置的变化(红点)。通过主成分分析,关节位置和形状变形之间的线性关系被显式地学习出来,使模型能够在生成新形状时同时调整关节位置。


5. 为什么SMPL的形状建模更高效?

在这里插入图片描述

这张图展示了SMPL模型和BlendSCAPE模型在形状参数建模上的核心区别。具体来说,它比较了两种模型在解释人体形状变化时,随着形状主成分数量增加所解释的累积方差比例。这背后隐藏着一个重要问题:一个人体建模方法需要多少参数才能有效地捕捉人体形状的变化?


1. SMPL的高效性:快速收敛的累积方差

从图中可以看出,SMPL模型(蓝色和红色曲线)相对于BlendSCAPE模型(虚线)表现出显著的效率优势:

  • 在前10个主成分内,SMPL模型已经解释了超过90%的方差。
  • 对于BlendSCAPE,虽然累积方差也逐渐增长,但即使使用30个主成分,其解释的方差仍未达到SMPL的水平。

这种差异表明,SMPL模型在捕捉人体形状变化时,能够用更少的形状主成分更高效地覆盖更多的形状变化。这种高效性对于实际应用来说是一个重要的优点,因为它减少了存储需求,同时提高了计算速度。


2. 性别差异对比:男性与女性的累积方差曲线

在SMPL模型中,男性和女性数据的曲线几乎重合(蓝线与红线)。这说明SMPL在处理不同性别的数据时,形状参数具有相似的效率,体现了模型的通用性。

相比之下,BlendSCAPE中男性和女性的数据分布有一定差异(虚线与点线的分布稍有分离),说明在不同性别上,BlendSCAPE可能需要更复杂的建模方式,难以统一。


3. 为什么SMPL比BlendSCAPE更高效?

SMPL的效率优势来自于以下几个技术特点:

  • 顶点空间建模:SMPL直接在顶点位置空间中执行PCA,而BlendSCAPE则在三角形变形空间中操作。顶点位置空间更符合欧几里得几何特性,使得PCA分解更加自然且精确。
  • 姿势归一化:SMPL在建模形状时严格去除了姿势的影响。这样,形状参数只反映人体本身的形状变化,而不会混入姿势带来的偏差。
  • 优化目标一致性:SMPL在训练过程中,其数据误差项和方差分解都基于顶点空间,因此模型能够更直接地拟合训练数据。

评估

1. 模型泛化能力的定义与重要性

模型泛化能力指的是,模型能够适应新人的新姿势。这项评估考察的是模型同时在形状(shape blend shapes)和姿势(pose blend shapes)上的表现。具体来说:

  • 形状泛化:模型需要根据新的人的注册网格调整形状参数 β ⃗ \vec{\beta} β 和姿势参数 θ ⃗ \vec{\theta} θ ,使生成的人体形状尽可能匹配数据。
  • 姿势泛化:在固定某个个体的形状参数 β ⃗ \vec{\beta} β 的情况下,优化姿势参数 θ ⃗ \vec{\theta} θ ,使模型能够准确地适配该个体在不同姿势下的网格。

通过这两种测试,可以验证模型是否能够正确地将人体的形状和姿势分开建模。换句话说,理想的模型不需要重新调整形状参数也可以很好地适应新姿势。


2. 使用的测试数据与方法

在这里插入图片描述

测试使用了公开的Dyna数据集中的120个注册网格(来自4位女性和2位男性)。这些网格涵盖了多种身体形状和姿势,并且与SMPL模型的模板对齐,但没有被用作训练数据。

测试方法

  • 在模型泛化测试中,对每个网格优化形状参数 β ⃗ \vec{\beta} β 和姿势参数 θ ⃗ \vec{\theta} θ ,以最小化顶点之间的平方距离。
  • 在姿势泛化测试中,固定形状参数 β ⃗ \vec{\beta} β ,仅优化姿势参数 θ ⃗ \vec{\theta} θ ,使模型适应相同个体的其他姿势网格。

模型的性能通过计算模型生成的顶点与测试网格顶点之间的平均绝对距离(mean absolute vertex-to-vertex distance)来衡量。


3. SMPL模型的评估与对比

  • SMPL-LBS与SMPL-DQBS的对比

    • SMPL-LBS(线性混合皮肤)和SMPL-DQBS(双四元数混合皮肤)在模型泛化能力和姿势泛化能力上的表现几乎相同。
    • 令人意外的是,SMPL-LBS在姿势泛化测试中略优于SMPL-DQBS。这可能是因为LBS的简单性反而有助于模型适应新姿势。
    • 这表明用户可以选择较为简单且计算更快的LBS模型,而不必担心精度的显著下降。
  • 与BlendSCAPE的对比

    • SMPL模型在所有测试中均优于BlendSCAPE,尽管两者的误差差异较小(约为0.5毫米)。
    • BlendSCAPE使用了更复杂的三角形变形空间,但这种方法在处理顶点误差时表现不如SMPL。这进一步证明了SMPL在顶点空间建模上的优势。

4. LBS的局限性

  • 标准LBS模型的表现

    在这里插入图片描述

    • 在图11的测试中,标准LBS(没有姿势混合形状)产生了更高的误差。这是因为LBS无法正确建模由于姿势变化引起的非刚性变形。

    在这里插入图片描述

    • 在图12中,固定形状参数 β ⃗ \vec{\beta} β 后,LBS的表现进一步恶化。这清楚地表明LBS在处理姿势依赖的变形时存在局限性。
  • Pose Blend Shapes的重要性

    • LBS模型的主要问题在于,它无法独立处理姿势引起的表面变形,而SMPL通过引入姿势混合形状有效地解决了这一问题。
    • 即使在没有重新训练的情况下,SMPL-LBS模型也能显著优于标准LBS,这说明姿势混合形状在校正姿势依赖变形方面的关键作用。

讨论


1. 模型成功的核心要素

  • 高质量的训练数据
    SMPL模型成功的关键之一是使用了大量高质量的注册模板网格。这些数据覆盖了多种身体形状和姿势,为学习关节位置预测器提供了充分的支持。数据的多样性确保模型能够在不同体型和姿势下表现稳定。

  • 参数的联合训练
    模型通过最小化顶点重建误差来联合优化所有参数,包括模板形状、混合权重、关节回归器以及形状、姿势和动态混合形状。模型的简单性成为优势,使其能够在大规模数据上高效训练。


2. 与其他方法的对比

  • 与散点数据插值方法的对比
    SMPL模型通过从大量训练网格中学习混合形状,而不是依赖散点数据插值方法(如径向基函数,RBF)。

    • 线性函数的优势
      SMPL的混合形状权重是关节旋转矩阵元素的线性函数。这种函数的支持范围更广,相较于RBF方法能够更好地泛化到任意姿势。此外,线性形式使得模型在游戏引擎中运行更快,而不需要预计算权重。
      • 稳定性
        由于旋转矩阵的元素是有约束的(比如单位长度的列),即使在训练集外泛化,模型也不会产生“发散”现象。
  • 与SCAPE模型的对比
    SCAPE模型同样将变形分解为形状和姿势变形,但它使用三角形变形乘法而非顶点空间的加法。

    • 不足
      SCAPE中,较大的身体形状会导致更大的姿势相关变形,即使这些变形并未针对不同体型学习。实验表明,SCAPE对新形状的泛化能力较差。
    • SMPL的优越性
      顶点空间的加法模型能够最小化训练顶点和模型之间的均方误差,确保长距离关系的保留,而SCAPE更关注局部关系,忽略了全局一致性。

3. 为什么没有被更早实现

尽管SMPL模型在概念上是对混合皮肤技术的自然扩展,但其独特之处在于混合形状的权重是关节旋转矩阵元素的线性函数,而不是直接基于姿势参数 θ ⃗ ~ \tilde{\vec{\theta}} θ ~。这是SMPL性能的关键,因为直接使用 θ ⃗ ~ \tilde{\vec{\theta}} θ ~ 会导致模型在泛化时出现错误。
此外,SMPL的简单性使得它能够从大量数据中学习,而之前的方法(如Allen等人[2006]的工作)由于数据不足和初始化困难,在泛化能力上表现欠佳。


4. 实验与探索

  • 姿势混合形状权重驱动方式的对比
    研究了用其他特征(如原始姿势参数 θ ⃗ \vec{\theta} θ ,其简单多项式,以及正弦/余弦函数)来驱动姿势混合形状权重的可能性。然而,这些方法的效果均不如关节旋转矩阵元素的线性函数。

    • 例如,直接使用 θ ⃗ \vec{\theta} θ 存在严重局限性,因为其值在 − π -\pi π π \pi π 之间变化。例如,颈部的旋转会导致收缩,需要额外的混合形状来抵消LBS的这种错误变形,而简单的线性权重无法解决这种双向旋转问题。
  • 与离散姿势插值方法的对比
    SMPL的混合形状函数与离散姿势插值方法(如WPSD)有显著不同。离散插值需要大量的关键姿势来覆盖整个姿势空间,这在运行时会降低动画的效率。相比之下,SMPL仅需学习少量线性权重即可高效泛化到任意姿势。


5. 模型的局限性

  • 与体型无关的姿势偏移
    SMPL模型中的姿势相关偏移(pose-dependent offsets)并未与体型直接关联。尽管模型在不考虑体型的情况下表现良好,但如果用于非现实的动画角色(如比例差异较大的婴儿和成人),则可能失效。

    • 改进方向
      将体型参数 β ⃗ \vec{\beta} β 与关节旋转矩阵 R ∗ ( θ ⃗ ) R^*(\vec{\theta}) R(θ ) 结合,预测混合形状权重,可能是解决这一问题的潜在方法。
  • 未涵盖的动态特性
    当前模型仅依赖关节角度和体型参数,未能捕捉呼吸、面部运动、肌肉紧张等动态变化。这些特性可以通过额外的混合形状学习(如DMPL模型)来补充。

  • 部分参数的人工定义
    模型中一些参数(如模板的分区、网格拓扑和零姿态)是手动定义的。这些参数理论上可以通过学习自动生成,但对模型性能的提升可能有限。


6. 未来工作

  • 减少姿势混合形状数量
    通过对混合形状进行PCA降维,可以减少模型参数,提升渲染速度。

  • 动态数据的直接学习
    将动态混合形状的元素直接学习,而不是通过PCA方法,可能会进一步提升模型精度。

  • 适配其他数据类型
    将SMPL模型拟合到动作捕捉标记数据、深度数据或视频中,为模型的实际应用提供更大的灵活性。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐