一、这篇方法想解决什么?

从单目视频、few-shot 图像,甚至单张图,快速重建一个可驱动的 3D 头部 Avatar。

它的整体思路是:

  1. 先学一个通用头部先验模型
  2. 这个先验里把“身份”和“表情”分开建模
  3. 对一个新人物,只需要:
    • 先快速拟合身份
    • 再轻微微调 Gaussian 参数
  4. 最后可以直接用一张脸图/一段视频来驱动表情

二、理解支柱

1. PSNR:评价重建质量的基石

  • 核心逻辑: 通过计算均方误差(MSE)来衡量处理后图像与原图的“还原度”
  • 分贝(dB)背后的意义:
    • >40 dB: 肉眼难辨,质量极佳
    • 30-40 dB: 质量良好,有轻微失真
    • <20 dB: 图像基本不可用

2. identity 与 expression:这篇方法最核心的两个变量

identity code:表示“这个人是谁”

identity code 可以理解成:

“这个人长什么样”的压缩表示

它描述的是相对稳定的东西,比如:

  • 脸型
  • 五官比例
  • 鼻子形状
  • 下巴轮廓
  • 头型

论文里用一个向量 zid 来表示身份:

$$ z_{id} $$

它控制的是:

  • 平均头如何变成某个人的头
  • 这个人的基础外观特征
  • 个体相关的几何差异

expression code:表示“这个人现在什么表情”

expression code 可以理解成:

“这个人当前表情状态”的压缩表示

比如:

  • 平静
  • 微笑
  • 张嘴
  • 皱眉
  • 鼓腮

论文中它通常记作:

$$ z_{exp} $$

它通过一个表情编码器从输入脸图中提取出来:

$$ z_{exp} = E_{exp}(I_{face}) $$

所以可以简单理解为:

  • identity code 决定“这个人是谁”
  • expression code 决定“这个人当前是什么表情”

3. 为什么要做特征解耦?

在模型训练中,最头疼的问题是**“身份”与“表情”的耦合(泄露)**。

  • 痛点: AI 在学习“张三”的笑脸时,容易把张三的长相特征也当成了表情的一部分。导致把这个表情给“李四”时,李四长得越来越像张三。
  • 解决思路: 利用控制变量法,迫使模型过滤掉外观干扰,提纯出更纯粹的表情编码。

三、技术背景:头部建模是怎么一路演进到 Gaussian 的?

头部建模经历了三代技术变革:

  1. 3DMM(网格时代)

    • 给脸部戴上固定的“拓扑面具”
    • 稳定,但死板
    • 无法表现头发和皱纹细节
  2. SDF 与 NeRF(隐式时代)

    • 抛弃实体网格,用神经网络(MLP)模拟空间中的距离场(SDF)或光影场(NeRF)
    • 细节惊人,但计算量巨大
  3. 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

$$ X_{can} = X_0 + \delta X_{id} + \lambda_{exp}(X_0)\delta X_{exp} + \lambda_{nf}(X_0)\delta X_{nf} $$

六、训练时怎么约束模型: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 也变了。

保留:

  • Lfine
  • Lcoarse
  • Llmk
  • Lreg

新增:

  • VGG perceptual loss
$$ L_{vgg} $$

作用:提升视觉感知一致性和高频细节,让结果更真实。

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:

  • Lcoarse
  • Lfine

只优化身份码 100 次。

目的:

先在通用先验里找到“最像这个人”的那个身份位置。

7.2 第二步:Finetune 3D Gaussians

目标:把这个人的头像做精细

有了第一阶段拟合出的 zid 后,就能算出这个人的专属 Gaussian 参数:

  • Xid
  • Cid
  • Sid
  • Qid
  • Aid

然后把这些参数直接当成可优化变量。

丢掉部分 identity 生成网络

因为这个人的 Gaussian 初始化已经拿到了,后续没必要再每次都通过 zid -> 网络 -> 高斯参数 这条链来生成,直接优化这些个体专属参数更省算力,也更适合精修。

再引入一个 fdyn

这个小网络专门建模:

个体特有的、随表情变化的动态细节

比如:

  • 某个人微笑时苹果肌更明显
  • 某个人张嘴时局部颜色/透明度变化不一样

它输出的是:

  • δC
  • δS
  • δQ
  • δA

也就是随着表情变化的属性偏移。

使用 Gaussian 阶段的完整 loss:

  • Lfine
  • Lvgg
  • Lcoarse
  • Llmk
  • Lreg

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)

他们比较了四种设置:

  1. Mesh
  2. Mesh + SR
  3. Gaussian
  4. Gaussian + 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 重建与驱动。