Conference

Compressed Skinning for Facial Blendshapes

Ladislav Kavan, John Doublestein, Martin Prazák, Matthew Cioffi, Doug Roble

Meta

一句话总结

本文提出一种基于近端算法(在 Adam 优化器中加入投影步)的蒙皮分解方法,把面部动画的 blendshape 烘焙成稀疏的线性混合蒙皮(LBS)表示,在保持与 Dem Bones 相当精度的同时,通过对变换系数施加稀疏约束实现显著的内存与运行时开销节省。

研究背景

高端影视级面部绑定常用超过 1000 个 blendshape,即使风格化角色也需要约 200~300 个(其中不少是弥补线性混合缺陷的校正形状)。这类模型在低端移动设备上实时播放代价高昂:每帧都要读取并混合大量系数。

线性混合蒙皮分解(skinning decomposition)是解决该问题的经典思路,把输入形状矩阵 \(A \in \mathbb{R}^{3S \times N}\) 近似分解为 \(A \approx BC\),其中 \(B \in \mathbb{R}^{3S \times 4P}\) 堆叠蒙皮变换(通常稠密),\(C \in \mathbb{R}^{4P \times N}\) 组合蒙皮权重与静止姿态(通常稀疏),\(P\) 为代理骨骼数。业界标杆 Dem Bones 采用交替优化(在变换与权重之间循环坐标下降)。但即便只用 40 个代理骨骼、300 个形状,也需存储 \(300 \times 40 = 12000\) 个变换,运行时每帧每角色都要读取混合,开销巨大。作者希望从头重构这一问题以压缩运行时计算。

方法

整体框架:离线预处理阶段求解蒙皮分解,得到权重 \(w_{i,j}\) 与变换 \(N_{k,j}\) 并保存;运行时从绑定(rig)拿到时变系数 \(c_k\),在 CPU 上合成每骨骼变换 \(M_j\),再连同静止姿态与权重送入 GPU 上的标准 LBS 着色器。

flowchart LR
  A["静止姿态 v0 + blendshapes vk"] --> B["离线优化\n(Adam + 投影)"]
  B --> C["稀疏变换 Nkj + 权重 wij"]
  C --> D["运行时: rig 输出系数 ck"]
  D --> E["CPU: Mj = I + Σ ck·Nkj"]
  E --> F["GPU: 线性混合蒙皮\nΣ wij·Mj·v0i"]

关键设计一:blendweight 到蒙皮变换的精确转换。经典 delta 形式的 blendshape 为 \(\hat{v}_{0,i} + \sum_{k=1}^{S} c_k(\hat{v}_{k,i} - \hat{v}_{0,i})\)。作者通过代数推导给出显式转换公式,令最终蒙皮变换为

\[M_j = I + \sum_{k=1}^{S} c_k N_{k,j}\]

即可让 LBS 结果与 blendshape 混合结果完全一致(前提是分解满足 \(\sum_j w_{i,j} N_{k,j} v_{0,i} = \hat{v}_{k,i} - \hat{v}_{0,i}\))。减去单位阵对应减去静止姿态:LBS 对单位变换返回静止姿态,而 blendshape 对零系数返回静止姿态。

关键设计二:变换表示。为保证 \(M_j\) 的线性混合正确,\(N_{k,j}\) 采用只含 3 个线性化旋转自由度与 3 个平移自由度的形式,该类变换在线性混合下封闭,运行时只需纯线性混合,无需四元数归一化等投影步骤,比旋转插值更快。

关键设计三:近端优化求解。优化目标与 Dem Bones 相同:

\[\min_{w_{i,j}, N_{k,j}} \sum_{i=1}^{N} \sum_{k=1}^{S} (E_{i,k})^p, \quad E_{i,k} = \lvert v_{k,i} - v_{0,i} - \sum_j w_{i,j} N_{k,j} v_{0,i} \rvert\]

默认 \(p=2\)。作者不采用交替方案,而是用 Adam 优化,并在每步后追加投影步来满足约束:权重的单位和约束通过归一化实现;非负与空间稀疏(每顶点至多 \(K\) 个非零权重)通过 torch.topk 保留最大的 \(K\) 个并清零负值实现,该投影不参与自动微分。

核心贡献——「压缩蒙皮」:在 \(C\) 稀疏(经典特征)之外,对 \(B\) 也施加稀疏约束,仅保留其绝对值最大的 \(L\) 个元素(全局预算,允许负值),实验中通常取 \(L=6000\)(对应约 1000 个变换),不到 Dem Bones 变换数的 10%,却仍能达到相似甚至更好的精度。此外还提供高精度(HD)拟合:把范数改为 \(L_{12}\) 近似无穷范数以最小化最大误差,恢复皱纹等细节。全部实现基于 PyTorch,用高斯噪声初始化即可,无需复杂的谱聚类或 k-means 初始化。

实验结果

主实验在 40 代理骨骼、影响数 \(K=8\) 设置下,将本方法(限制 \(B\) 非零数 6000)与 Dem Bones 比较,误差单位为毫米(人头尺寸):

模型 顶点数 形状数 本方法变换数/MXE/MAE Dem Bones 变换数/MXE/MAE
Aura 5944 267 1000 / 5.82 / 0.0384 10680 / 5.65 / 0.0391
Jupiter 5944 319 1000 / 8.26 / 0.0297 12760 / 7.64 / 0.0263
Proteus 23735 287 1000 / 4.8 / 0.03 11480 / 6.23 / 0.0305
Bowen 23735 253 1000 / 5.99 / 0.0339 10120 / 10.75 / 0.0459
Proteus HD 23735 287 57400 / 0.06 / 0.0147 57400 / 3.45 / 0.0174

本方法用约十分之一的变换数即达到相当或更低误差。稀疏存储带来约 5~7 倍内存节省;在 Snapdragon 652 上变换混合有约 2~3 倍加速,把混合耗时降到与 rig 求值相当。HD 设置(\(p=12\)、200 骨骼)使最大误差比 Dem Bones 低 50 倍以上。在 Windows PC(RTX 3080)上显示 40 个角色时,本方法约 252 FPS,快于 Dem Bones(180 FPS)与 Unity 原生 blendshape(185 FPS),约 1.4 倍。

亮点与局限

亮点:把深度学习一阶优化器(Adam)与近端投影结合,绕开了交替优化的复杂初始化,实现极其灵活——改损失函数只需一行代码;首次对蒙皮变换矩阵 \(B\) 引入稀疏约束(「压缩蒙皮」),在几乎不损精度的前提下大幅压缩运行时开销;给出 blendweight 到蒙皮变换的显式精确转换公式;实现紧凑且完全基于标准 LBS,可复用现有着色器、文件格式与工具链。

局限:一阶优化预处理时间较长(单 A6000 GPU 上数分钟,HD 设置达 2.5 小时),而 Dem Bones 仅需约一分钟 CPU 时间;运行时需在 CPU 上额外做一次稀疏矩阵向量乘来合成变换;GPU 蒙皮着色器需支持任意变换矩阵(刚性变换不够);rig 被当作黑盒处理,可能仍有优化空间。

延伸思考

作者提出的顶点重要性加权是自然延伸:眼球、口腔内部通常不可见,可降低这些区域精度、把预算集中到鼻唇沟等显著区域。另一个方向是把蒙皮分解与 rig 函数的神经网络近似联合优化,可能进一步释放效率,但需要改造 rig 求值机制。更广义地看,这种「用深度学习优化器 + 投影算子求解带约束的经典图形学分解问题」的范式,具备迁移到其他受约束几何压缩任务的潜力——把非凸约束的处理从精巧的专用求解器转移到通用自动微分框架,降低了实验与改造成本。