0%

FLAME

FLAME 模型公式

\[ M(\vec{\beta}, \vec{\theta}, \vec{\psi}) = W\big(T_P(\vec{\beta}, \vec{\theta}, \vec{\psi}),\; J(\vec{\beta}),\; \vec{\theta},\; \mathcal{W}\big) \]

这个公式的目的是通过形状、姿态和表情参数生成最终的 3D 面部模型。下面拆解每个部分。

1. β(Shape Parameters,形状参数)

  • \(\vec{\beta}\) 是形状参数,控制面部的个体差异(如脸型、性别等)。
  • 通常通过 PCA(主成分分析)表示不同的形状基向量,FLAME 通过调整 \(\vec{\beta}\) 来生成不同的脸型。

2. θ(Pose Parameters,姿态参数)

  • \(\vec{\theta}\) 表示头部和关节的姿态参数,控制模型的旋转、位置等姿态变化。
  • 通常使用旋转矩阵或四元数来表示头部和关节的角度变化,这些参数定义了模型骨骼的姿态。

3. ψ(Expression Parameters,表情参数)

  • \(\vec{\psi}\) 是表情参数,用于控制面部的动态表情,如微笑、皱眉等。
  • 类似于形状参数,表情参数通过预定义的基向量加权组合,控制不同的表情变化。

4. T_P(β, θ, ψ)(Deformation,变形函数)

  • 这是基于形状、姿态和表情参数对模型顶点的变形操作。它将原始顶点位置经过形状(\(\vec{\beta}\))、姿态(\(\vec{\theta}\))和表情(\(\vec{\psi}\))的综合影响进行调整。
  • \(T_P\) 通常结合几何变形和骨架变形,从而生成特定姿态和表情下的面部几何。

5. J(β)(Joint Regressor,关节回归器)

  • 关节回归器根据形状参数 \(\vec{\beta}\) 回归出模型的关节位置(骨架)。
  • \(J(\vec{\beta})\) 将面部网格顶点映射到骨架上的关节,用于姿态和变形的控制。

6. W(Linear Blend Skinning,线性混合蒙皮)

  • \(W\) 表示线性混合蒙皮(LBS),用于根据关节的旋转姿态 \(\vec{\theta}\) 对网格顶点进行插值变形。
  • LBS 通过骨架上的权重 \(\mathcal{W}\) 控制各顶点如何随着关节旋转而移动。这是 3D 角色动画中常用的技术,用于实现姿态的平滑变化。

7. 𝒲(Skinning Weights,蒙皮权重)

  • 这是每个顶点和关节之间的权重矩阵,用于定义每个顶点受哪些关节影响,以及影响的程度。
  • 这些权重控制了每个顶点如何根据关节姿态变化进行变形。

公式整体流程

  1. 首先,利用形状参数、姿态参数和表情参数计算出面部顶点的变形 \(T_P(\vec{\beta}, \vec{\theta}, \vec{\psi})\)
  2. 然后,回归出关节位置 \(J(\vec{\beta})\),基于形状的不同得到不同的骨架关节位置。
  3. 最后,利用线性混合蒙皮函数 \(W\),结合关节位置、姿态和蒙皮权重 \(\mathcal{W}\),对网格顶点进行平滑变形,生成最终的 3D 面部模型。

为什么还需要全局变换

尽管 \(T_P(\vec{\beta}, \vec{\theta}, \vec{\psi})\) 包含了姿态参数,它描述的是面部的局部变化(如关节的旋转和顶点的形状变形),但这还不足以生成完整的 3D 面部模型——生成最终模型需要把这些局部变化与整个模型的全局姿态结合起来。

全局变换指模型在整个场景中的位置和方向,由以下两部分完成:

  • 骨架关节位置的变换:需要考虑模型整体的骨架如何相对于场景坐标系移动和旋转。也就是说,尽管头部在颈部的局部坐标系中旋转了,但还需要知道整个模型(头部、颈部、身体)如何在全局空间中运动。
  • 线性混合蒙皮(LBS):通过 LBS 把局部变换与全局变换结合起来,实现面部或身体各部位的平滑移动。例如头部相对于颈部的旋转、躯干相对于地面的旋转等,这些全局变换通过骨架系统和关节回归器 \(J(\vec{\beta})\) 来计算。

线性混合蒙皮为什么重要

LBS 是连接局部变换和全局变换的关键步骤。它通过结合局部变换(如 \(T_P\) 的输出)和全局变换(如骨架的姿态),确保所有局部变形都能在全局坐标系下正确呈现。

  1. 局部旋转与全局旋转的结合:LBS 允许把局部关节旋转与全局骨架旋转结合起来。即使面部在局部坐标系中完成了变形,仍需要把这些变形映射到全局空间,才能正确显示整个模型在 3D 空间中的位置和姿态。
  2. 关节处的平滑变形:LBS 通过关节权重 \(\mathcal{W}\) 把局部关节的变形传递到网格顶点上,使得关节处的变形过渡不会显得生硬,而是对整个模型产生连锁影响。

FLAME Expression Coefficients vs. Blendshape Coefficients

FLAME 的 expression 系数和 Apple ARKit 的系数都用于描述面部的表情变化,但它们在结构、表示方法和应用层面上存在显著差异。

1. 基础模型与维度数量

FLAME 表情系数

  • 基于数据驱动的 3D 人脸模型,使用 PCA 等降维方法从大量面部扫描中提取表情基向量。
  • 表情系数数量较少,典型值大约在 10 到 50 个维度,通过这些维度的线性组合生成不同表情。这些维度描述的是表情的整体变化,而不是每块局部肌肉的具体变化。

Apple ARKit 系数

  • ARKit 使用 BlendShapes 系统,提供对面部的精细控制。它的表情系数直接对应面部不同区域的表情动作单元,如眉毛提升、眼睛张开、嘴巴微笑等。
  • ARKit 提供 52 个 blendshape 系数,每个系数独立控制特定的面部肌肉动作,因此每个系数与具体的面部区域直接相关。

2. 控制的层级

FLAME

  • 基于 PCA 的全局面部控制,并非局部控制。这意味着一个 FLAME 表情系数可能同时影响多个面部区域,从而产生相对复杂的表情。
  • 由于表情基向量是从大量数据中提取的,FLAME 的表情系数表示的是面部整体形变模式。它适合生成逼真的 3D 人脸模型,但控制粒度相对较粗。

ARKit

  • 基于 BlendShape,提供的是局部控制,每个系数独立控制一个面部动作单元(类似 FACS 表情编码系统中的 AU)。
  • 这种局部控制允许开发者精细调整面部的每个区域,从而在实时表情捕捉中获得更自然、流畅的结果。

3. 使用场景与应用

FLAME

  • 主要用于静态或动态 3D 人脸建模,适合需要高精度、真实感的场景,如 3D 面部重建、动画制作和面部表情捕捉系统。由于形状和表情参数是从庞大的 3D 数据集中学习而来,在拟合个性化人脸和生成逼真表情方面表现优越。
  • 表情系数更多基于数据驱动的模型生成,在不需要实时的情况下描述复杂的面部形变。

ARKit

  • 表情系数是为实时面部跟踪动画设计的。通过前置摄像头捕捉用户表情,ARKit 能实时生成相应的表情系数,并应用到虚拟角色(如 Animoji)或 AR 体验中。
  • 实时性和局部控制能力使其非常适合在手机、平板等设备上使用,尤其是游戏、娱乐和 AR 应用。

4. 数据表示方式

FLAME

  • 表情参数从 3D 扫描数据中提取,表示全局的形变模式,通常是连续值。通过 PCA 等降维技术简化表情控制,减少参数数量,但每个参数可能控制多个面部区域的复杂变化。
  • 表情参数可以是负值或正值,表示不同方向的面部形变。

ARKit

  • BlendShape 系数是归一化值,范围在 0 到 1 之间,表示每个表情动作的强度。0 表示该区域没有变化,1 表示该区域处于最大表情状态,是对特定区域的线性插值。
  • 系数通常是非负的,因为它们表示某个局部区域的动作大小。

5. 本质区别

BlendShape(如 ARKit 使用的)具体表示面部某个局部区域的动作,是针对局部面部肌肉或动作单元的控制。例如单独的 BlendShape 系数可能控制嘴巴张开的程度、眉毛抬起的程度或眼睛眯起的程度。这些局部动作的系数可以组合起来生成更复杂的整体表情。

FLAME 的 expression 参数则更像是一个整体表情基向量。每个表情系数代表从数据集中学习到的整体面部表情模式,例如一个基可能对应微笑,另一个对应皱眉。通过调整这些参数的权重,可以生成整体的表情变化。

小结

BlendShape(局部动作) FLAME Expression(整体表情)
控制粒度 精细,针对面部特定部位(眼睛、嘴巴、眉毛等)的局部动作 全局,描述整个面部的形变模式
功能 通过多个系数组合生成复杂表情,例如「嘴巴张开」+「眉毛抬起」组合出「惊讶」 每个系数代表一个整体表情的基向量,如「微笑」或「愤怒」,通过线性组合生成不同表情
表示 每个系数仅影响局部区域的动作 每个系数影响整个面部的形状和姿态

Pose Blendshape 解释

1. 姿态旋转函数 R(θ)

\(R(\vec{\theta})\) 是从姿态参数 \(\vec{\theta}\) 映射到旋转矩阵向量的函数。具体来说,它把输入的姿态参数(通常是关节的旋转)转换成多个关节的旋转矩阵元素。这里的 \(\vec{\theta}\) 表示面部、头部或眼睛的姿态。

\[ \mathbb{R}^{|\vec{\theta}|} \to \mathbb{R}^{9K} \]

这表示从姿态参数的空间(通常是四元数或旋转角度)映射到每个关节的旋转矩阵元素空间。每个旋转矩阵是 \(3\times3\),因此每个关节有 9 个元素,而 \(K\) 代表关节的数量。

2. 姿态 BlendShape 方程 B_P(θ; 𝒫)

\(B_P(\vec{\theta}; \mathcal{P})\) 表示基于姿态参数 \(\vec{\theta}\) 的姿态 BlendShape 函数,其结果用于描述在特定姿态下 3D 模型的顶点如何偏移:

\[ B_P(\vec{\theta}; \mathcal{P}) = \sum_{n=1}^{9K} \left( R_n(\vec{\theta}) - R_n(\vec{\theta}^*) \right) P_n \]

该公式通过对每个关节旋转矩阵元素的变化加权求和来计算姿态 BlendShape:

  • \(R_n(\vec{\theta})\)\(\vec{\theta}\) 对应的第 \(n\) 个旋转矩阵元素。
  • \(R_n(\vec{\theta}^*)\):标准(默认/初始)姿态下的第 \(n\) 个旋转矩阵元素。
  • \(P_n \in \mathbb{R}^{3N}\):每个旋转矩阵元素对应的形变向量,描述在特定姿态下模型顶点的偏移量。每个 \(P_n\) 是一个顶点偏移向量,表示位移的方向和大小。

姿态空间 \(\mathcal{P} = [P_1, \cdots, P_{9K}]\) 是包含所有姿态 BlendShape 的矩阵,维度为 \(\mathbb{R}^{3N \times 9K}\),定义了所有姿态变换下模型顶点的偏移。

3. 姿态 BlendShape 的线性与非线性性质

姿态 BlendShape 对旋转矩阵 \(R\) 是线性的,但由于从 \(\vec{\theta}\) 到旋转矩阵的映射是非线性的(比如四元数到旋转矩阵的映射),因此整个函数相对于 \(\vec{\theta}\) 是非线性的。

4. 总结

  • 这个公式的核心是描述如何通过姿态参数 \(\vec{\theta}\) 控制模型顶点的位置变化。
  • \(B_P(\vec{\theta}; \mathcal{P})\) 表示在当前姿态 \(\vec{\theta}\) 下模型的顶点偏移。这个偏移由旋转矩阵相对于初始姿态的变化,以及每个关节对应的形变向量 \(P_n\) 共同决定。
  • 此公式广泛用于 3D 人体与人脸建模(如 FLAME、SMPL)和动画中,用于模拟不同姿态对模型的形变效果。