一、这篇方法想解决什么?
从单目视频、few-shot 图像,甚至单张图,快速重建一个可驱动的 3D 头部 Avatar。
它的整体思路是:
- 先学一个通用头部先验模型
- 这个先验里把“身份”和“表情”分开建模
- 对一个新人物,只需要:
- 先快速拟合身份
- 再轻微微调 Gaussian 参数
- 最后可以直接用一张脸图/一段视频来驱动表情
二、理解支柱
1. PSNR:评价重建质量的基石
- 核心逻辑: 通过计算均方误差(MSE)来衡量处理后图像与原图的“还原度”
- 分贝(dB)背后的意义:
- >40 dB: 肉眼难辨,质量极佳
- 30-40 dB: 质量良好,有轻微失真
- <20 dB: 图像基本不可用
2. identity 与 expression:这篇方法最核心的两个变量
identity code:表示“这个人是谁”
identity code 可以理解成:
“这个人长什么样”的压缩表示
它描述的是相对稳定的东西,比如:
- 脸型
- 五官比例
- 鼻子形状
- 下巴轮廓
- 头型
论文里用一个向量 zid 来表示身份:
它控制的是:
- 平均头如何变成某个人的头
- 这个人的基础外观特征
- 个体相关的几何差异
expression code:表示“这个人现在什么表情”
expression code 可以理解成:
“这个人当前表情状态”的压缩表示
比如:
- 平静
- 微笑
- 张嘴
- 皱眉
- 鼓腮
论文中它通常记作:
$$ z_{exp} $$它通过一个表情编码器从输入脸图中提取出来:
$$ z_{exp} = E_{exp}(I_{face}) $$所以可以简单理解为:
identity code决定“这个人是谁”expression code决定“这个人当前是什么表情”
3. 为什么要做特征解耦?
在模型训练中,最头疼的问题是**“身份”与“表情”的耦合(泄露)**。
- 痛点: AI 在学习“张三”的笑脸时,容易把张三的长相特征也当成了表情的一部分。导致把这个表情给“李四”时,李四长得越来越像张三。
- 解决思路: 利用控制变量法,迫使模型过滤掉外观干扰,提纯出更纯粹的表情编码。
三、技术背景:头部建模是怎么一路演进到 Gaussian 的?
头部建模经历了三代技术变革:
3DMM(网格时代)
- 给脸部戴上固定的“拓扑面具”
- 稳定,但死板
- 无法表现头发和皱纹细节
SDF 与 NeRF(隐式时代)
- 抛弃实体网格,用神经网络(MLP)模拟空间中的距离场(SDF)或光影场(NeRF)
- 细节惊人,但计算量巨大
3D Gaussian Splatting(高斯时代)
- GPHM 的核心表示
- 使用数百万个带颜色的椭球粒子(高斯点)来填充空间
- 优势: 兼顾了照片级的逼真度和极快的渲染速度
四、整体结构:为什么先 Mesh,再 Gaussian?
这篇方法不是一上来就直接做最终的 3D Gaussian Avatar,而是分成两个阶段。
1. Guiding Geometry Model:先把几何骨架搭起来
这一阶段主要学的是几何先验,输出的是 mesh:
- 顶点
V - 面片
F - 每个顶点的颜色/特征
C
它的作用更像是:
- 建立一个稳定的平均头部模板
- 学会如何用身份、表情、非脸运动来控制几何变形
- 给后面的 Gaussian 模型提供一个靠谱的初始化
2. 3D Gaussian Parametric Head Model:再把细节和渲染做出来
这一阶段最终输出的是一组 3D Gaussian 参数:
- 位置
X - 颜色
C - 尺度
S - 旋转
Q - 不透明度
A
这一阶段更偏向:
- 高质量渲染
- 外观细节表达
- 最终图像效果
3. 为什么不直接生成三维高斯头部模型?
原因主要有三点:
(1)Gaussian 表达强,但几何先验弱
如果一开始直接学 Gaussian,很容易出现:
- 点漂在表面内外
- 几何不稳定
- 局部乱飞
- 难收敛
(2)从零直接学 Gaussian,更容易把身份、表情、外观耦合在一起
模型可能会:
- 用颜色变化假装几何变化
- 用 opacity 或 scale 补偿结构错误
- 身份和表情混在一起
(3)Mesh 更适合做“骨架”和“模板”
所以这篇方法本质上是:
- Mesh 阶段负责搭骨架
- Gaussian 阶段负责做最终渲染
一句话总结:
先用结构化表示把头“搭起来”,再用更灵活的 Gaussian 表示把头“画漂亮”。
五、GPHM 的核心公式主线:基础模板 + 各种偏移
刚开始看公式会觉得很复杂,但其实它们大多数都在表达同一件事:
$$ \text{最终结果} = \text{基础模板} + \text{身份偏移} + \text{表情偏移} + \text{非脸区域偏移} $$比如 canonical 空间下的 mesh 顶点:
$$ V_{can} = V_0 + \delta V_{id} + \lambda_{exp}(V_0)\delta V_{exp} + \lambda_{nf}(V_0)\delta V_{nf} $$这条公式翻成人话就是:
V0:平均头模板δVid:身份带来的变化δVexp:表情带来的变化δVnf:非脸区域(脖子等)带来的变化λexp和λnf:控制哪些区域更该受表情影响,哪些区域更该受非脸运动影响
Gaussian 版本本质上只是把 mesh 顶点 V 换成了 Gaussian 点位置 X:
六、训练时怎么约束模型:Loss 设计
loss 的作用,就是把“生成得对不对”变成一个可优化的数值。
6.1 Guiding Geometry Model 的 loss
(1)最终图像重建损失
$$ L_{fine} = \|I_{fine} - I_{gt}\|_1 $$作用:让最终渲染图接近真实图。
(2)silhouette / mask 损失
$$ L_{sil} $$作用:让预测 mask 和真实 mask 对齐,保证头部整体轮廓正确。
(3)coarse RGB 对齐
$$ L_{coarse} = \|I_{coarse} - I_{gt}\|_1 $$作用:要求粗渲染阶段也要尽量像真实图,不能全靠后面的 refine network 修图。
(4)landmark loss
$$ L_{lmk} = \|P - P_{gt}\|_2 $$作用:给表情相关几何提供额外监督,保证鼻尖、嘴角、下巴等关键结构不要跑偏。
(5)regularization loss
$$ L_{reg} = \|\delta V_{exp}\|_2 + \|\delta V_{nf}\|_2 $$作用:限制表情/非脸形变别乱飞,减少身份与运动之间的耦合和冗余。
(6)Laplacian smooth
$$ L_{lap} $$作用:让 mesh 表面更平滑,防止表面长毛刺、断裂、噪声。
6.2 Gaussian 阶段的 loss
到了 Gaussian 阶段,重点从“结构稳定”转向“渲染质量和细节”,所以 loss 也变了。
保留:
LfineLcoarseLlmkLreg
新增:
- VGG perceptual loss
作用:提升视觉感知一致性和高频细节,让结果更真实。
6.3 一句话总结 loss 的设计逻辑
Lfine / Lcoarse:保证图像对Lsil:保证轮廓对Llmk:保证几何关键点对Lreg:保证运动别乱飞Llap:保证表面别长噪点Lvgg:保证细节和观感更好
七、从单目视频到头部 Avatar:具体怎么落地?
训练好 GPHM 之后,论文再把它用于具体一个人的单目视频重建。
整个过程分三步。
7.1 第一步:GPHM Fitting
目标:先快速拟合“这个人是谁”
输入可以是:
- 一段单目正脸视频
- 几张图(few-shot)
- 甚至单张图
预处理后得到:
- face image
- non-face image
- 头部位姿
然后随机初始化一个全局 identity code zid,只优化这个身份码。
这一阶段每次:
- 随机采样一帧
- 输入
zid + face image + non-face image - 渲染
Icoarse - refine 得到
Ifine
只用两个 loss:
LcoarseLfine
只优化身份码 100 次。
目的:
先在通用先验里找到“最像这个人”的那个身份位置。
7.2 第二步:Finetune 3D Gaussians
目标:把这个人的头像做精细
有了第一阶段拟合出的 zid 后,就能算出这个人的专属 Gaussian 参数:
XidCidSidQidAid
然后把这些参数直接当成可优化变量。
丢掉部分 identity 生成网络
因为这个人的 Gaussian 初始化已经拿到了,后续没必要再每次都通过 zid -> 网络 -> 高斯参数 这条链来生成,直接优化这些个体专属参数更省算力,也更适合精修。
再引入一个 fdyn
这个小网络专门建模:
个体特有的、随表情变化的动态细节
比如:
- 某个人微笑时苹果肌更明显
- 某个人张嘴时局部颜色/透明度变化不一样
它输出的是:
δCδSδQδA
也就是随着表情变化的属性偏移。
使用 Gaussian 阶段的完整 loss:
LfineLvggLcoarseLlmkLreg
7.3 第三步:Reenactment
目标:让这个人的 Avatar 被另一段视频驱动
给定驱动视频的一帧:
- 提取 face image
- 提取 non-face image
- face image 送进 expression encoder
- non-face image 送进 non-face motion encoder
得到:
- 表情码
- 非脸运动码
然后输入到 finetuned model,生成新的 Gaussian,再渲染出结果图。
这一套最大的优点是:
不需要再依赖 3DMM expression tracking。
旧方法常常要先估计 3DMM 表情参数,再用这些参数驱动。
而这篇方法是:
face image -> expression code -> 直接驱动
更端到端,也更灵活。
八、什么叫消融实验(Ablation Study)?
这是理解论文实验部分的关键概念。
1. 消融实验的本质
把方法中的某个部分去掉、替换掉或简化掉,再比较结果。
目的不是和别人的方法整体 PK,而是回答:
- 这个模块真的有用吗?
- 这个设计是不是多余的?
- 性能提升到底是谁带来的?
2. 它和普通对比实验的区别
普通对比实验
一般是:
- 我的方法 vs 别人的方法
目的是证明:
“我整体更强。”
消融实验
一般是:
- 有这个模块 vs 没这个模块
- 我的初始化 vs 另一个初始化
- Mesh vs Gaussian
- 有 SR vs 没 SR
目的是证明:
“我方法里的这个设计是有效的。”
3. 消融实验是不是控制变量?
是的,本质上就是控制变量思想:
- 尽量保持其他条件不变
- 只改一个因素
- 这样性能差异才更可信
九、这篇论文做了哪些消融实验?
论文在 4.2 里主要做了三类实验。
9.1 解耦实验(Disentanglement)
做法:
- 随机采样 2 个 identity code
- 随机采样 5 个 expression code
- 两两组合,生成 10 个头模型
- 排成一个二维表
怎么看这个二维表?
- 每一行:identity code 相同
说明是同一个人,只是表情不同 - 每一列:expression code 相同
说明表情相同,只是身份不同
目的
验证模型是否把 identity 和 expression 真正解耦。
结论
- 同一行看起来是同一个人,说明 identity 一致
- 同一列表情模式一致,说明 expression 一致
这说明模型的身份控制和表情控制分得比较开。
9.2 初始化消融(Ablation on Initialization)
论文比较了两种初始化:
方案 A:他们自己的初始化
用前面训练好的 guiding geometry model 来初始化 Gaussian。
方案 B:FLAME-based 初始化
先拟合 FLAME,再在 FLAME 表面附近采样点作为 Gaussian 初始位置。
FLAME 初始化的问题
论文发现,FLAME 初始化下很多 Gaussian 点会:
- 漂到真实表面里面
- 或者漂到真实表面外面
这会导致:
- 噪声
- 冗余
- 丢失高频细节
- 难以充分收敛
他们的方法为什么更好?
因为 guiding geometry 初始化能让 Gaussian 点:
- 更均匀地落在真实表面上
- 分布更合理
- 收敛更稳定
- 渲染更好
这说明前面的 mesh / guiding geometry 阶段不是摆设,而是真的在给 Gaussian 阶段“打地基”。
9.3 表示方式与超分模块消融(Representation & SR)
他们比较了四种设置:
MeshMesh + SRGaussianGaussian + SR
对应 PSNR:
- Mesh:15.7
- Mesh + SR:17.3
- Gaussian:27.0
- Gaussian + SR:29.3
这个实验说明了什么?
(1)Gaussian 的提升是决定性的
从 Mesh 到 Gaussian,PSNR 提升了 11 个点以上。
这说明:
真正的大提升来自表示方式从 mesh 换成了 Gaussian。
(2)SR 有帮助,但不是核心
- Mesh -> Mesh + SR:+1.6
- Gaussian -> Gaussian + SR:+2.3
说明:
SR 更像锦上添花,而不是雪中送炭。
没有 Gaussian,仅靠 SR 救不了太多;
有了 Gaussian,SR 才能进一步补细节。
十、总结:我对这篇方法的整体理解
如果用一句话概括这篇方法的设计哲学,我会说:
先用强结构先验把头“搭稳”,再用更灵活的 Gaussian 表示把头“做精”。
它的核心亮点不只是最终效果,而是整个设计非常有工程感:
- 先通用训练,再个体拟合
- 先低自由度粗对齐,再高自由度精修
- 先结构化几何初始化,再高质量 Gaussian 渲染
- 身份和表情分开建模,增强可控性
- 少数据也能拟合,不用每个人从零训
十一、对我自己的启发
1)不要一上来就扑向最终表示
最终表示再强,如果初始化和结构先验不稳,后面很容易训练崩。
2)先验模型 + 个体拟合,是很现实的路线
相比“每个对象从零训练”,先学一个强先验,再对具体人物快速拟合,会更适合真实场景。
3)身份和表情的解耦非常重要
如果这两者混在一起,模型虽然可能能重建训练数据,但控制能力和泛化能力都会很差。
4)消融实验很重要
不仅要看“结果好不好”,还要看:
- 为什么会好
- 哪个模块在起作用
- 提升来自哪里
这是读论文时特别值得学习的部分。
十二、结语
这篇工作让我更清楚地看到,做 3D 头部建模不是单纯“把一个模型训出来”那么简单,而是:
- 表示选择
- 几何先验
- 初始化策略
- 解耦建模
- 个体拟合
- 渲染细节
- 驱动控制
这些环节共同决定了最后效果。
对我来说,最重要的不是把每个公式背下来,而是理解它的主线:
先建立稳定的头部先验,再把身份、表情、非脸运动拆开控制,最后用 Gaussian 表示实现更高质量的个体 Avatar 重建与驱动。