当前位置: 首页 > news >正文

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 中的设定
网格规模N=5023N=5023N=5023个顶点
关节数K=4K=4K=4,包括 neck、jaw 和两只 eyeballs
身份空间从 3800 个 CAESAR 头部扫描训练
总训练扫描论文称超过 33,000 个 scan;表达空间训练中注册了 69,000 帧,并采样 21,000 帧训练
常用维度identity 常用 90 或 300 维;expression 常用 100 维
论文出处ACM TOG / SIGGRAPH Asia 2017

这些数字的重点不只是规模。5023 个顶点其实不算高分辨率,真正要紧的是它们在所有样本之间有一致拓扑和一致语义。第 1200 个顶点、嘴角附近的区域、眼睑附近的顶点,在不同人、不同表情里应该对应同一种几何位置。没有这个 correspondence,PCA、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 skinning,J(β)J(\beta)J(β)是随头部形状变化的 joint regressor,W\mathcal{W}W是 skinning weight。

在进入 LBS 之前,模板会先叠加三类偏移:

TP(β,θ,ψ)=T+BS(β;S)+BP(θ;P)+BE(ψ;E) T_P(\beta, \theta, \psi)=T+B_S(\beta;S)+B_P(\theta;P)+B_E(\psi;E)TP(β,θ,ψ)=T+BS(β;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)=∑n=1∣β∣βnSn B_S(\beta;S)=\sum_{n=1}^{|\beta|}\beta_n S_nBS(β;S)=n=1ββnSn

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_shape=100n_shape=300或类似配置。维度不是越高越好,取决于任务:

使用场景更常见的选择原因
单图 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 形式。论文里K=4K=4K=4个关节是 neck、jaw 和两个 eyeballs,再加一个 global rotation,所以 pose 向量包含K+1K+1K+1个三维旋转向量。

为什么 jaw 要作为旋转关节,而不是让 expression blendshape 直接学“张嘴”?原因很直观:张嘴不是一个任意局部形变。下颌骨会绕关节旋转,牙齿、嘴唇、脸颊受它影响。FaceWarehouse 这类模型可以通过 expression basis 表示一些张嘴形状,但遇到大幅度开口时,线性表情基很容易变成局部拉扯。FLAME 把 jaw opening 放进 articulated pose,表达空间只负责剩下的非刚性残差。

Pose corrective blendshape 的形式是:

BP(θ;P)=∑n=19K(Rn(θ)−Rn(θ∗))Pn B_P(\theta;P)=\sum_{n=1}^{9K}(R_n(\theta)-R_n(\theta^*))P_nBP(θ;P)=n=19K(Rn(θ)Rn(θ))Pn

它不是直接对 axis-angle 线性,而是对旋转矩阵元素与 rest pose 的差做线性组合。这个设计继承了 SMPL:LBS 负责主要刚性运动,pose corrective 负责 LBS 的假象。纯 LBS 会让转头和张嘴显得像塑料蒙皮,corrective blendshape 则把训练数据里稳定出现的褶皱、拉伸和局部偏移补上。

眼球也值得单独说。很多早期 face model 要么没有眼球,要么把眼区当成闭合表面。FLAME 明确加入 eyeballs,论文也提到这能改善眼区 alignment,避免眼睑去解释眼球噪声。对现在的 talking head 来说,这一点仍然有现实意义:眼睑、眼球、gaze 如果混在一个模糊表情向量里,最后很容易出现“脸在动但眼睛假”的问题。

表情空间:FLAME 没有把表情硬绑定到 FACS

表情空间BEB_EBE同样是线性 blendshape:

BE(ψ;E)=∑n=1∣ψ∣ψnEn B_E(\psi;E)=\sum_{n=1}^{|\psi|}\psi_n E_nBE(ψ;E)=n=1ψψnEn

但它的训练方式和身份空间不同。身份空间来自静态身份差异;表情空间来自 4D expression sequences。论文使用 D3DFACS 和自采集序列,先把 pose 影响“unpose”掉,再用每个 subject 的 neutral expression 作为基准,计算 expression residual,最后对这些残差做 PCA。

这个细节很重要。FLAME 的 expression 不是人工定义的 AU 列表,也不是每个维度对应一个清晰语义动作。它是数据驱动的低维残差空间。优点是能覆盖训练数据里真实出现的联动表情,缺点是可解释性没那么强。你调第 7 个 expression coefficient,不一定能说它就是“AU12 嘴角上扬”。

所以在工程里使用 FLAME expression 时,最好不要把每个维度当成可语义编辑的滑杆。更稳的用法是:

  1. 用优化或网络回归出一组ψ\psiψ
  2. 用它驱动 FLAME mesh 或作为 neural renderer 的 conditioning。
  3. 如果需要语义控制,再额外学习一个从 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 mm,90% 小于 0.5 mm。这个量级解释了为什么 FLAME 后来能成为很多方法的标准中间表示。它不是只在视觉上“差不多”,而是在大规模数据上做到了足够稳定的顶点对应。

当然,论文也诚实提到了 within-surface drift,尤其是额头、脸颊、脖子这类纹理或几何特征弱的区域。换句话说,FLAME 的 correspondence 很强,但不是完美 ground truth。今天用它做 benchmark 或 loss 的时候,这个误差源仍然存在。

和 Basel Face Model、FaceWarehouse 比,FLAME 赢在哪里

原论文把 FLAME 和 Basel Face Model(BFM)、FaceWarehouse(FW)做了同一优化框架下的比较。这里不要把结论理解成“FLAME 全面替代 BFM/FW”,更准确的说法是:FLAME 在可动画的头部建模上更完整,尤其是表达和 jaw pose。

身份拟合上,论文在 BU-3DFE neutral scans 上比较 scan-to-mesh distance。使用相近参数量时,FLAME 49 有 74% 的 scan vertices 距离低于 0.5 mm,BFM 50 是 69%,FW 是 67%。使用更多维度时,FLAME 198 达到 94%,BFM Full 是 92%;FLAME 300 达到 96%。

表情拟合上的差距更能说明问题。动态 expression test sequences 中,FW 有 50% 的 face-region vertices 距离低于 1.0 mm;FLAME 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.pdf
  • FLAME PyTorch official implementation: https://github.com/soubhiksanyal/FLAME_PyTorch
  • FLAME Universe resource list: https://github.com/TimoBolkart/FLAME-Universe
  • FLAME model license page: https://flame.is.tue.mpg.de/modellicense.html
http://www.gsyq.cn/news/1613813.html

相关文章:

  • E-Hentai下载器完整指南:如何快速批量下载并打包为ZIP文件
  • 泛微E-Office文件上传漏洞复现与安全加固指南
  • 上海长宁区有实体样板间可参观的老房翻新装修公司
  • 终极空洞骑士模组管理器Scarab:为什么你需要这款免费开源工具?
  • 暗黑2存档编辑器终极指南:10分钟掌握角色定制秘籍
  • 口碑好的江西单招机构哪家性价比高
  • 基于Si4731和TM4C129LNCZAD的可编程收音机系统设计
  • Ubuntu 16.04 部署 Concourse CI 实战指南
  • IMU与MCU在运动追踪系统中的选型与优化实践
  • 企业级高防DNS解析有什么用?
  • 盈利稳步增长!微算法科技(NASDAQ: MLGO)2025年净利润1.27亿元
  • 实战指南:6大核心功能构建浏览器原生Markdown阅读体验
  • 2026年6月蜀山区白领殷勤婚介
  • XUnity.AutoTranslator完整指南:打破语言障碍,畅玩全球Unity游戏
  • Anthropic推理链压缩层:降低状态熵,提升推理密度
  • 论文AI写作网站有哪些类型?4类网站全面解析
  • B站缓存视频终极转换指南:m4s-converter一键无损合并解决方案
  • 超实用跨平台歌词下载神器:ZonyLrcToolsX全攻略
  • Steam游戏自动破解终极指南:深度解析DRM绕过与离线运行架构
  • 信创云PACS解决方案:国产化云端医学影像系统部署与测试指南
  • B站m4s转MP4终极指南:如何一键无损合并缓存视频
  • 3步解决百度网盘提取码难题:智能解析工具让资源获取效率提升20倍
  • 服装供应链交付延期痛点分析:人工优化瓶颈与SCM数字化落地方案
  • SQL Server书签查找(Key Lookup)原理与覆盖索引优化实战
  • 生成式引擎优化(GEO)的理论基础与分类体系
  • 英雄联盟Akari助手:免费开源游戏效率工具完整指南,快速提升竞技水平
  • 智能制造中的过程优化与质量控制
  • 本地部署AI
  • 2026能深度定制的日历应用推荐:天乙日历如何兼顾亲友提醒、个人历生成与个人化管理?
  • 为什么92%的资深开发者已弃用纯手动Debug?:AI辅助调试工具实战手册,3小时重构故障定位流程