FLAME 技术详解:3D 人脸模型里的“骨架、身份和表情”到底怎么拆开

发布时间:2026/7/1 10:14:51

FLAME 技术详解:3D 人脸模型里的“骨架、身份和表情”到底怎么拆开 FLAME 技术详解3D 人脸模型里的“骨架、身份和表情”到底怎么拆开很多 3D 头像、说话人脸、Gaussian head avatar 论文里都会出现 FLAME。它有点像人脸版的 SMPL不是追求直接生成最漂亮的脸而是给头部提供一个低维、可拟合、可动画的参数化几何底座。这篇文章不把 FLAME 当成一个“人脸模型名词”粗略介绍而是拆它的建模选择为什么要同时有 shape、pose、expression为什么 jaw/neck/eyeballs 要显式关节化为什么 expression blendshape 不能简单等价于 FACS为什么现在的 neural avatar / 3DGS 论文还喜欢拿 FLAME 做驱动空间或正则项。如果只记一句话FLAME 的价值不在于 5023 个顶点有多精细而在于它把头部几何拆成了一个可优化的因子化模型。身份形状、颈部/下颌/眼球姿态、非刚性表情各有自己的参数空间最后通过线性 blendshape 和 LBS 合成网格。这种拆法在深度模型之前就很工程化后来反而成了很多神经渲染方法的接口。FLAME 解决的不是“生成一张脸”而是“稳定地拟合一颗头”FLAME 的原论文是 Tianye Li、Timo Bolkart、Michael J. Black、Hao Li、Javier Romero 在 SIGGRAPH Asia 2017 发表的Learning a model of facial shape and expression from 4D scans。论文开头的动机很实际高端 facial animation 可以做到非常真实但需要大量人工低端 3D face model 容易拟合、可用于消费级传感器却表达力不够。FLAME 试图取中间路线。它从大量对齐的 3D/4D 扫描中学习一个参数化头部模型保留传统图形管线能用的形式网格、关节、blend skinning、blendshape。这样它可以被优化器拟合到 2D landmark、3D scan、单目视频或神经渲染系统里而不是只作为一个黑箱生成器。几个基本数字先放在这里项目FLAME 中的设定网格规模N5023N5023N5023个顶点关节数K4K4K4包括 neck、jaw 和两只 eyeballs身份空间从 3800 个 CAESAR 头部扫描训练总训练扫描论文称超过 33,000 个 scan表达空间训练中注册了 69,000 帧并采样 21,000 帧训练常用维度identity 常用 90 或 300 维expression 常用 100 维论文出处ACM TOG / SIGGRAPH Asia 2017这些数字的重点不只是规模。5023 个顶点其实不算高分辨率真正要紧的是它们在所有样本之间有一致拓扑和一致语义。第 1200 个顶点、嘴角附近的区域、眼睑附近的顶点在不同人、不同表情里应该对应同一种几何位置。没有这个 correspondencePCA、blendshape、参数拟合都无从谈起。参数化公式先加偏移再做蒙皮FLAME 的整体形式可以写成M(β,θ,ψ)W(TP(β,θ,ψ),J(β),θ,W) M(\beta, \theta, \psi) W(T_P(\beta, \theta, \psi), J(\beta), \theta, \mathcal{W})M(β,θ,ψ)W(TP​(β,θ,ψ),J(β),θ,W)其中MMM输出3N3N3N维的顶点坐标。β\betaβ是 identity shape 参数θ\thetaθ是 pose 参数ψ\psiψ是 expression 参数。WWW是标准 linear blend skinningJ(β)J(\beta)J(β)是随头部形状变化的 joint regressorW\mathcal{W}W是 skinning weight。在进入 LBS 之前模板会先叠加三类偏移TP(β,θ,ψ)TBS(β;S)BP(θ;P)BE(ψ;E) T_P(\beta, \theta, \psi)TB_S(\beta;S)B_P(\theta;P)B_E(\psi;E)TP​(β,θ,ψ)TBS​(β;S)BP​(θ;P)BE​(ψ;E)这行公式几乎就是 FLAME 的核心。它把“一个人长什么样”“头和下巴怎么转”“脸部肌肉带来的非刚性形变”分开处理TTT是 zero pose 下的模板网格。BSB_SBS​是身份 shape blendshape主要解释头型、脸型、鼻梁、颧骨等人与人之间的静态差异。BPB_PBP​是 pose corrective blendshape用来修补纯 LBS 无法解释的形变例如张嘴时脸颊被拉伸、转头时颈部褶皱变化。BEB_EBE​是 expression blendshape用来解释与关节旋转无关的表情残差例如皱眉、眯眼、嘴角运动。这也解释了为什么 FLAME 和“纯 PCA 3DMM”不太一样。传统 3DMM 往往把脸看成一个线性 shape/texture 空间FLAME 则更像 SMPL 的头部版本在统计形状模型外面接了可动画的骨架和 pose correction。对后来的 tracking 和 avatar 来说这比单纯的静态 face PCA 更好用。身份空间为什么是β\betaβ以及 90 维和 300 维怎么理解身份空间BSB_SBS​是线性的BS(β;S)∑n1∣β∣βnSn B_S(\beta;S)\sum_{n1}^{|\beta|}\beta_n S_nBS​(β;S)n1∑∣β∣​βn​Sn​SnS_nSn​是 PCA 学出来的正交基βn\beta_nβn​是对应系数。论文用 3800 个来自 US 和 European CAESAR 数据库的注册头部训练身份空间其中包括 2100 个女性扫描和 1700 个男性扫描。由于 CAESAR 原本是全身扫描作者需要先把头部区域从 SMPL 注册中抽出来再调整拓扑、处理嘴和眼睛的洞、加入眼球。论文在 compactness / generalization / specificity 上评估了身份空间。一个常被引用的结论是90 个 identity components 可以解释约 98% 的数据变化300 个 components 基本覆盖 100%。因此你会在不少代码里看到n_shape100、n_shape300或类似配置。维度不是越高越好取决于任务使用场景更常见的选择原因单图 3D face reconstruction较低到中等维度避免从少量 landmark 里过拟合脸型高质量 monocular tracking较高维度视频约束更多可以拟合局部身份细节neural avatar / 3DGS 正则中等维度 residualFLAME 给粗几何神经场负责细节表情驱动迁移身份固定主要调 expression/pose保持人脸身份一致一个实用判断是如果输入监督只有 2D landmark过高的 shape 维度很容易把深度和局部细节“想象”出来如果你有多视角、深度、视频或可微渲染的 photometric loss高维 shape 才有更充分的约束。姿态空间jaw、neck、eyeballs 是 FLAME 和普通 3DMM 的分水岭FLAME 的 pose 参数θ\thetaθ使用 axis-angle 形式。论文里K4K4K4个关节是 neck、jaw 和两个 eyeballs再加一个 global rotation所以 pose 向量包含K1K1K1个三维旋转向量。为什么 jaw 要作为旋转关节而不是让 expression blendshape 直接学“张嘴”原因很直观张嘴不是一个任意局部形变。下颌骨会绕关节旋转牙齿、嘴唇、脸颊受它影响。FaceWarehouse 这类模型可以通过 expression basis 表示一些张嘴形状但遇到大幅度开口时线性表情基很容易变成局部拉扯。FLAME 把 jaw opening 放进 articulated pose表达空间只负责剩下的非刚性残差。Pose corrective blendshape 的形式是BP(θ;P)∑n19K(Rn(θ)−Rn(θ∗))Pn B_P(\theta;P)\sum_{n1}^{9K}(R_n(\theta)-R_n(\theta^*))P_nBP​(θ;P)n1∑9K​(Rn​(θ)−Rn​(θ∗))Pn​它不是直接对 axis-angle 线性而是对旋转矩阵元素与 rest pose 的差做线性组合。这个设计继承了 SMPLLBS 负责主要刚性运动pose corrective 负责 LBS 的假象。纯 LBS 会让转头和张嘴显得像塑料蒙皮corrective blendshape 则把训练数据里稳定出现的褶皱、拉伸和局部偏移补上。眼球也值得单独说。很多早期 face model 要么没有眼球要么把眼区当成闭合表面。FLAME 明确加入 eyeballs论文也提到这能改善眼区 alignment避免眼睑去解释眼球噪声。对现在的 talking head 来说这一点仍然有现实意义眼睑、眼球、gaze 如果混在一个模糊表情向量里最后很容易出现“脸在动但眼睛假”的问题。表情空间FLAME 没有把表情硬绑定到 FACS表情空间BEB_EBE​同样是线性 blendshapeBE(ψ;E)∑n1∣ψ∣ψnEn B_E(\psi;E)\sum_{n1}^{|\psi|}\psi_n E_nBE​(ψ;E)n1∑∣ψ∣​ψn​En​但它的训练方式和身份空间不同。身份空间来自静态身份差异表情空间来自 4D expression sequences。论文使用 D3DFACS 和自采集序列先把 pose 影响“unpose”掉再用每个 subject 的 neutral expression 作为基准计算 expression residual最后对这些残差做 PCA。这个细节很重要。FLAME 的 expression 不是人工定义的 AU 列表也不是每个维度对应一个清晰语义动作。它是数据驱动的低维残差空间。优点是能覆盖训练数据里真实出现的联动表情缺点是可解释性没那么强。你调第 7 个 expression coefficient不一定能说它就是“AU12 嘴角上扬”。所以在工程里使用 FLAME expression 时最好不要把每个维度当成可语义编辑的滑杆。更稳的用法是用优化或网络回归出一组ψ\psiψ。用它驱动 FLAME mesh 或作为 neural renderer 的 conditioning。如果需要语义控制再额外学习一个从 AU、文本、音频情绪到ψ\psiψ的映射。这也是很多 speech-driven 3D talking head 工作的做法。音频模型不直接预测每个顶点而是预测 FLAME topology 上的 mesh motion 或 FLAME-like expression coefficients再通过额外网络补充个性化细节。训练数据和注册FLAME 真正费功夫的地方在 correspondence参数化模型看起来简洁但训练它最麻烦的部分不是 PCA而是把大量扫描注册到同一个模板拓扑上。论文的 temporal registration pipeline 大致分三步model-only registration、coupled registration、texture-based refinement。model-only fit 保持在模型空间内比较稳定但细节不够coupled alignment 允许模板离开模型空间更贴合扫描texture-based refinement 利用纹理误差改善嘴、鼻、眉毛等区域的对齐减少 surface sliding。作者还采用 alternating registration先用初始模型注册数据再从注册结果训练更好的 FLAME再用新模型重新注册循环改进。这个过程听起来绕但它解决的是统计模型训练里的经典鸡生蛋问题想训练模型需要对齐数据想对齐数据又需要一个模型做正则。论文报告了一些注册质量数字。对 D3DFACS 和自采集序列的 69,000 帧注册结果面部区域排除眼球后60% 的顶点 median distance 小于 0.2 mm90% 小于 0.5 mm。这个量级解释了为什么 FLAME 后来能成为很多方法的标准中间表示。它不是只在视觉上“差不多”而是在大规模数据上做到了足够稳定的顶点对应。当然论文也诚实提到了 within-surface drift尤其是额头、脸颊、脖子这类纹理或几何特征弱的区域。换句话说FLAME 的 correspondence 很强但不是完美 ground truth。今天用它做 benchmark 或 loss 的时候这个误差源仍然存在。和 Basel Face Model、FaceWarehouse 比FLAME 赢在哪里原论文把 FLAME 和 Basel Face ModelBFM、FaceWarehouseFW做了同一优化框架下的比较。这里不要把结论理解成“FLAME 全面替代 BFM/FW”更准确的说法是FLAME 在可动画的头部建模上更完整尤其是表达和 jaw pose。身份拟合上论文在 BU-3DFE neutral scans 上比较 scan-to-mesh distance。使用相近参数量时FLAME 49 有 74% 的 scan vertices 距离低于 0.5 mmBFM 50 是 69%FW 是 67%。使用更多维度时FLAME 198 达到 94%BFM Full 是 92%FLAME 300 达到 96%。表情拟合上的差距更能说明问题。动态 expression test sequences 中FW 有 50% 的 face-region vertices 距离低于 1.0 mmFLAME 49 是 67%FLAME 90 是 73%FLAME 300 是 75%。论文中的可视化也显示FW 对大幅度张嘴更吃力因为它缺少像 FLAME 这样显式的 jaw articulation。BFM 的一个特点是细节看起来可能更“真实”因为它带有高频形状细节。但论文指出这些高频细节不一定来自当前 scan可能是训练集中其他人的细节被 hallucinate 到拟合结果上。FLAME 网格较低分辨率视觉上少了一些皮肤级细节但几何拟合反而更准确。这个取舍很像现在的 mesh prior vs neural residual粗模型负责稳定结构细节交给纹理、displacement、NeRF 或 Gaussian。为什么 2026 年还会看到 FLAME如果你只看生成效果FLAME 当然不像现代 diffusion 或 3DGS avatar 那么“显眼”。但很多新方法仍然绕不开它原因是它提供了一个可解释、低维、可微、跨数据集可对齐的头部坐标系。在 FLAME Universe 里官方维护了大量基于 FLAME 的代码、数据集和论文列表包括 DECA、EMOCA、MICA、GaussianAvatars、SplattingAvatar、FaceFormer、VOCA、MultiTalk 等。它们使用 FLAME 的方式不完全一样有的直接回归 FLAME parameters有的把 mesh topology 当作监督目标有的把 FLAME fitted mesh 作为 Gaussian 或 neural field 的可动画 scaffold。我更倾向于把 FLAME 看成一个“几何协议”。它不负责解决所有问题但它让不同系统可以在同一个头部参数空间里交换信息reconstruction 系统输出 identity / expression / pose。speech animation 系统预测时间序列 mesh 或 expression。neural rendering 系统把 FLAME mesh 当作 deformation cage。dataset 通过 FLAME topology 做跨主体、跨序列对齐。这也是 FLAME 的局限所在。它的 topology 和表达空间把复杂脸部运动压进了一个固定低维模型里。头发、牙齿、舌头、皮肤皱纹、眼部湿润反光、极端表情下的局部折叠都不是 FLAME 的强项。现代 avatar 方法通常会在 FLAME 外面再学 residual、texture space、displacement map、Gaussian offsets 或 neural deformation field。实践中怎么用 FLAME别把它当万能真值用 FLAME 做项目时最容易踩的坑有三个。第一FLAME 参数不是天然语义干净的控制器。尤其 expression PCA 维度是数据驱动的不是 AU 字典。直接手调ψ\psiψ往往会得到奇怪联动。要做可控编辑最好在 FLAME 参数之上再建一个语义层。第二FLAME fitting 很依赖观测约束。只用 2D landmark 能得到一个合理头部但深度、脸型局部细节、眼区状态都可能不稳定。加入 photometric loss、多帧一致性、可微渲染或多视角约束会显著改善结果但也会引入光照、遮挡、纹理漂移等新问题。第三FLAME mesh 是中低分辨率结构先验不是最终 photorealistic asset。很多项目失败是因为期待它直接给出真实头像细节。更合理的管线是FLAME 估计粗几何和运动后端用 texture/displacement/neural renderer 补齐高频外观。一个典型 PyTorch 项目流程大概是gitclone https://github.com/soubhiksanyal/FLAME_PyTorchcdFLAME_PyTorch python setup.pyinstallmkdirmodel python main.py运行 demo 前需要先到 FLAME 官网注册并同意 license把下载到的模型文件放入model/。官方 PyTorch README 提到该实现原先使用 Python 3.7并在 PyTorch 1.4 上测试。现在复现时通常需要自己处理依赖版本。另一个现实问题是模型文件需要在 FLAME 官网注册并同意 license 后下载不能只靠 GitHub 仓库完成安装。2025 年 11 月官网发布了 FLAME 2023 Open Model采用 CC-BY-4.0 Open Model License旧版本仍需注意对应 license 范围。一个更直观的 mental model可以把 FLAME 想成三层identity beta - 这个人静态长什么样 pose theta - 头、下巴、眼球怎么转 expression psi - 关节解释不了的脸部非刚性变化 ↓ T shape offset pose corrective expression offset ↓ linear blend skinning ↓ 5023-vertex head mesh这个 mental model 比背公式更有用。看到一篇论文说“we use FLAME parameters as conditioning”你应该立刻问它用的是哪一层identity 固定了吗pose 是 ground truth tracking 还是网络预测expression 是 FLAME PCA 还是 mesh vertex displacement有没有在 FLAME 外面学 residual这些问题比“用了 FLAME 所以几何正确”更关键。FLAME 只是把问题拆开不会自动保证每个拆出来的变量都被估计对。小结FLAME 的生命力来自工程边界感FLAME 到今天仍然常见不是因为它最精细而是因为它足够稳定、低维、可微、可拟合并且和传统图形管线兼容。它承认自己只是一个中低分辨率头部模型于是把身份、姿态、表情拆清楚让后面的优化器或神经网络继续往上叠。这也是它对今天 avatar / talking head 研究的启发一个好的 prior 不一定要生成所有细节。很多时候它只需要给系统一个可靠的坐标系让身份别漂、下巴别乱、眼睛别假、表情别完全失控。剩下的真实感可以交给更强的渲染模型去补。参考资料FLAME official website: https://flame.is.tue.mpg.de/Li et al.,Learning a model of facial shape and expression from 4D scans, ACM TOG / SIGGRAPH Asia 2017: https://download.is.tue.mpg.de/flame/flame_paper.pdfFLAME PyTorch official implementation: https://github.com/soubhiksanyal/FLAME_PyTorchFLAME Universe resource list: https://github.com/TimoBolkart/FLAME-UniverseFLAME model license page: https://flame.is.tue.mpg.de/modellicense.html

相关新闻