LivePortrait
Portrait Animation 要解决的问题是:给定一张静态源肖像图像作为外观参考,用驱动视频中的头部姿态、表情、眼睛和嘴部运动,把源肖像「活起来」。这是一条从 FOMM #Siarohin-et-al.-2019 到 Face Vid2vid #Wang-et-al.-2021 延续下来的隐式关键点技术路线,但 2024 年扩散模型主导了生成质量的话语权——FADM #Zeng-et-al.-2023、AniPortrait #Wei-et-al.-2024、X-Portrait #Xie-et-al.-2024 等方法在视觉效果上不断刷新上限。
LivePortrait 的通讯作者 Jianzhu Guo 来自快手 KwaiVGI 团队,此前在 3D 人脸分析领域(3DDFA 系列)有深厚积累 #Guo-et-al.-2024。团队的研究思路是:扩散模型虽然质量好,但计算昂贵且缺乏精确可控性——比如「把动画贴回原图」这样的产品级需求(D-ID 等商业肖像动画产品已经验证了这个需求)在扩散框架下难以实现。因此,LivePortrait 选择不跟随扩散主流,而是深度挖掘隐式关键点框架的潜力,在计算效率、可控性和生成质量之间取得工程平衡。
论文摘要给出的三个关键数字:训练数据扩到约 6900 万高质量帧;推理在 RTX 4090 + PyTorch 上达到 12.8ms;官方释放了推理代码和模型 #Guo-et-al.-2024。这意味着 LivePortrait 更像一个「工程系统论文」:贡献不只在网络结构,而在数据、训练策略、控制模块、推理流程和开源落地之间形成闭环。
论文声称的核心贡献有两点 #Guo-et-al.-2024:(i) 构建了一个坚实的隐式关键点驱动肖像动画框架,显著提升了生成质量和泛化能力;(ii) 设计了 stitching 模块和两个 retargeting 模块(眼睛、嘴唇),以可忽略的计算开销实现了精确可控性。
扩散方法的三个结构性瓶颈
2024 年的 Portrait Animation 领域,扩散方法在质量上确实领先——X-Portrait #Xie-et-al.-2024 和 MegActor #Yang-et-al.-2024 直接用原始驱动视频做条件,跳过了中间运动表示,获得了很高的生成保真度。但扩散路线有三个结构性问题:
第一,推理效率。扩散需要多步去噪,即使蒸馏到少步推理,FLOPs 仍远高于隐式关键点方法。论文没有给出与 baseline 的定量推理速度对比,但明确指出扩散方法「通常计算昂贵」#Guo-et-al.-2024。LivePortrait 在 RTX 4090 + 原生 PyTorch 上达到 12.8ms/帧,而扩散方法通常需要数百毫秒。
第二,时间一致性。论文在实验中指出,扩散方法的前景和背景时间一致性不如非扩散方法,原因是扩散模型的高方差性 #Guo-et-al.-2024。Figure 6 展示了具体案例:FADM 的动画中雕像消失、AniPortrait 出现行人般的异常背景运动、MegActor 的红横幅消失、X-Portrait 衣服图案变化。
第三,可控性。这是 LivePortrait 最核心的差异化。扩散方法无法实现 stitching(将动画贴回原图而不产生肩部错位),也无法独立控制眼睛和嘴唇的开合程度。这不是调参问题,而是架构决定的——扩散的生成过程是端到端的,没有可以插入局部控制的接口。
| 方法 | 框架 | 运动表示 | 生成质量 | 效率 | Stitching | 眼部控制 | 唇部控制 |
|---|---|---|---|---|---|---|---|
| FOMM / Face Vid2vid / DaGAN / MCNet / TPSM | 非扩散 | 隐式关键点 | ★★★ | 快 | ✗ | ✗ | ✗ |
| FADM | 扩散 | 隐式关键点 + 3DMM | ★★★ | 慢 | ✗ | ✗ | ✗ |
| AniPortrait / Face Adapter | 扩散 | 显式关键点 / mask | ★★★★ | 慢 | ✗ | ✗ | ✗ |
| X-Portrait | 扩散 | 原始驱动图像 | ★★★★★ | 慢 | ✗ | ✗ | ✗ |
| MegActor | 扩散 | 原始驱动图像 | ★★★★ | 慢 | ✗ | ✗ | ✗ |
| LivePortrait | 非扩散 | 隐式关键点 | ★★★★ | 快 | ✓ | ✓ | ✓ |
上表是论文 Table 1 的总结。可以看到,LivePortrait 是唯一同时具备「快速推理」和「拼接 + 眼部 + 唇部三重控制」的方法。其他非扩散方法虽然快,但完全没有可控性;扩散方法虽然质量高,但既慢又不可控。
隐式关键点路线的遗留问题
既然隐式关键点路线效率好,为什么之前没有人做到 LivePortrait 的效果?因为 face vid2vid 这条路线有三个遗留问题:
(1) 微表情驱动不足。原始 face vid2vid 无法生动驱动眨眼、眼球运动等微表情——生成肖像的眼球方向被绑定到头部姿态并与之平行 #Guo-et-al.-2024。这是因为微表情在无监督方式下难以学习,隐式关键点缺少对应的监督信号。
(2) 跨身份驱动退化。当小眼睛的人驱动大眼睛的人时,驱动闭眼运动太弱,无法把目标人物的眼睛完全闭合。这是原始隐式关键点框架没有考虑的跨身份场景。
(3) 贴回原图错位。动画在 256×256 的裁剪空间中生成,贴回原图时,驱动帧的肩部位置和源图的肩部位置不同,导致肩部、脖子和背景边界产生明显错位。这使得动画只能用于裁剪空间,无法处理全身或多人的原图。
LivePortrait 针对这三个问题分别给出了解法:landmark-guided 优化解决微表情,retargeting 模块解决跨身份控制,stitching 模块解决贴回错位。这些解法的设计思路是本章后续的核心。
继承的骨架:Face Vid2vid 的核心模块
LivePortrait 以 Face Vid2vid #Wang-et-al.-2021 为基座。原始框架包含:外观特征提取器 $\mathcal{F}$、canonical 隐式关键点检测器 $\mathcal{L}$、头部姿态估计网络 $\mathcal{H}$、表情形变估计网络 $\Delta$、warping 模块 $\mathcal{W}$ 和生成器 $\mathcal{G}$。$\mathcal{F}$ 把源图像映射为 3D 外观特征体 $f_s$;运动侧提取 canonical keypoints、head pose、expression deformation 和 translation;$\mathcal{W}$ 根据源/驱动关键点变形特征体;$\mathcal{G}$ 输出目标帧。
隐式关键点(Implicit Keypoints)
这里的关键点不是人脸 2D landmark 的直接替代,而是一个紧凑的中间运动表征。它通过 canonical keypoints $x_{c,s} \in \mathbb{R}^{K \times 3}$、旋转 $R$、尺度 $s$、表情形变 $\delta$ 和平移 $t$ 组合出源关键点与驱动关键点,再交给 warping module 做特征变形。从 MLP 输出维度可推算 $K \approx 21$(原文未直接写明 K 值)。
Stage I 六大增强
论文在 face vid2vid 的骨架上做了六项关键增强 #Guo-et-al.-2024:
(1) 高质量数据策划
训练数据包括公开数据集(VoxCeleb、MEAD、RAVDESS、AAHQ)和大量私有数据(4K 肖像视频、200 小时 talking head 视频、LightStage 数据集)。数据处理流程:长视频切分为不超过 30 秒的 clip → 用 face tracking / recognition 确保单人 → 用 KVQ 质量评估工具过滤低质量片段。最终从 92M 帧过滤到 69M 帧,来自约 18.9K 个身份和 60K 张静态风格化肖像 #Guo-et-al.-2024。
(2) 混合图像-视频训练
仅在真实肖像视频上训练的模型对风格化肖像(如 anime)泛化差。而风格化肖像视频非常稀缺(仅约 1.3K clips,来自不到 100 个身份),但高质量风格化肖像图像较为丰富(约 60K 张,每张代表一个独特身份)。论文将单张图像视为一帧的视频片段参与训练,这种混合策略显著提升了模型对风格化肖像的泛化能力 #Guo-et-al.-2024。
(3) 网络架构升级
论文将原始分离的三个网络($\mathcal{L}$、$\mathcal{H}$、$\Delta$)统一合并为单一模型 $\mathcal{M}$,以 ConvNeXt-V2-Tiny #Woo-et-al.-2023 为骨干网络,直接联合预测 canonical keypoints、head pose、expression deformation、scale 和 translation。这一设计减少了模块间信息传递损耗,同时提升推理效率。
生成器 $\mathcal{G}$ 采用 SPADE decoder #Park-et-al.-2019(比 face vid2vid 原始 decoder 更强大),并将 warped feature volume $f_s$ 精心地送入 SPADE decoder——特征体的每个通道作为一张 semantic map 参与生成。在 $\mathcal{G}$ 的最后插入一层 PixelShuffle #Shi-et-al.-2016,将输出分辨率从 256×256 上采样到 512×512,兼顾训练效率与输出清晰度。
(4) 可缩放运动变换
Face Vid2vid 原始变换忽略了 scale factor:
这导致 scaling 被吸收进 expression deformation $\delta$,增加训练难度。LivePortrait 引入显式 scale factor:
可缩放运动变换
其中 $s_s$ 和 $s_d$ 分别是源和驱动输入的 scale factor。注意此变换不同于 scale orthographic projection $x = s \cdot ((x_c + \delta)R) + t$——后者会导致学到的 $\delta$ 过于灵活,在跨身份驱动时产生纹理闪烁。当前变换是「灵活性」与「可驱动性」之间的刻意折中 #Guo-et-al.-2024。
(5) Landmark-guided 隐式关键点优化
原始 face vid2vid 无法生动驱动微表情。论文归因于:微表情在无监督方式下难以学习。解决方案是引入 2D landmarks 作为监督信号——从眼睛和嘴唇区域选取 N=10 个关键点,使用 Wing loss #Feng-et-al.-2018 约束隐式关键点的前两维与 landmark 对齐:
Wing loss 对小误差更敏感(相比于 L2 loss 在零点附近梯度恒定),适合微表情这类小幅运动。该损失同时施加在 source 和 driving 关键点上 #Guo-et-al.-2024。
(6) 级联损失
第一阶段总训练目标包含 8 项损失:
Stage I 总训练目标
其中 $\mathcal{L}_E$(关键点等变性)、$\mathcal{L}_L$(关键点先验)、$\mathcal{L}_H$(头部姿态)、$\mathcal{L}_\Delta$(形变先验)继承自 face vid2vid;$\mathcal{L}_{P,cascade}$ 和 $\mathcal{L}_{G,cascade}$ 是在全局、面部、唇部三个区域分别施加的 perceptual 和 GAN 损失(对应三个从零训练的判别器 $\mathcal{D}_{global}$、$\mathcal{D}_{face}$、$\mathcal{D}_{lip}$);$\mathcal{L}_{faceid}$ 使用 ArcFace #Deng-et-al.-2019 提取的身份嵌入保持源图像身份;$\mathcal{L}_{guide}$ 是上文的 landmark-guided 损失。
这个级联设计——全局 + 面部 + 唇部三层判别——是 LivePortrait 表情和口型质量的关键。face 和 lip 区域由 2D semantic landmarks 定义,确保局部纹理细节被精确优化。
Stage II:Stitching 与 Retargeting 模块
第二阶段不再动基础生成链路,而是冻结 $\mathcal{F}$、$\mathcal{M}$、$\mathcal{W}$ 和 $\mathcal{G}$,只训练三个轻量 MLP 模块 #Guo-et-al.-2024。论文的一个核心经验发现是:紧凑隐式关键点可以有效表示一种 implicit blendshapes——不像 3DMM blendshape 那样有显式语义维度,但可以通过小型 MLP 学到「眼睛更开一点」「嘴巴闭合一点」「肩部贴回源图」这样的局部 deformation offset。
三个模块的具体设计:
Stitching module $\mathcal{S}$(4 层 MLP [126, 128, 128, 64, 65]):接收源/驱动隐式关键点,预测 driving keypoints 的 deformation offset $\Delta_{st} \in \mathbb{R}^{K \times 3}$。它的目的不是让脸更像,而是让生成头像贴回原始图像空间时肩膀、脖子、背景边界不产生明显错位。训练时故意使用 cross-id motion 增加难度,以提升跨身份 stitching 泛化 #Guo-et-al.-2024。
Eyes retargeting module $\mathcal{R}_{eyes}$(6 层 MLP [66, 256, 256, 128, 128, 64, 63]):接收源隐式关键点、源 eyes-open 条件和随机 driving eyes-open scalar $c_{d,eyes} \in [0, 0.8]$,预测 $\Delta_{eyes}$。解决「小眼睛驱动大眼睛时闭眼不完整」的跨身份问题。
Lip retargeting module $\mathcal{R}_{lip}$(4 层 MLP [65, 128, 128, 64, 63]):类似设计,可独立控制嘴唇开合,也支持将输入源图先规范到闭嘴状态便于后续驱动。
LivePortrait 采用两阶段训练策略。Stage I 从零训练完整基础模型——appearance extractor $\mathcal{F}$、motion extractor $\mathcal{M}$、warping module $\mathcal{W}$、decoder $\mathcal{G}$ 全部可训练;Stage II 冻结这四个模块的所有参数,只训练 stitching 和两个 retargeting 的小 MLP。这种设计的动机是:基础模型负责「会动」,小 MLP 负责「贴得稳、眼嘴可控」——解耦后可以独立迭代控制能力而不重训基础模型 #Guo-et-al.-2024。
训练数据策展
训练数据来源分为公开数据集和私有数据两部分。公开数据包括 VoxCeleb、MEAD、RAVDESS 以及风格化图像数据集 AAHQ。私有数据包括:4K 分辨率肖像视频(覆盖各种姿态和表情)、200 小时 talking head 视频、LightStage 数据集,以及若干风格化肖像视频和图像 #Guo-et-al.-2024。
数据处理流程高度工程化,分为四个步骤:(1) 将长视频切分为不超过 30 秒的 clip;(2) 使用 face tracking 和 face recognition 确保每个 clip 只包含一个人;(3) 使用 KVQ 质量评估工具过滤低质量片段;(4) 最终从 92M 原始帧过滤到 69M 帧,来自约 18.9K 个身份和 60K 张静态风格化肖像 #Guo-et-al.-2024。这个过滤比例(92M→69M,淘汰约 25%)说明团队对数据质量的控制非常严格。
混合图像-视频训练是数据策略的关键创新。仅在真实肖像视频上训练的模型对风格化肖像(如 anime)泛化差,而风格化肖像视频非常稀缺(仅约 1.3K clips,来自不到 100 个身份),但高质量风格化肖像图像较为丰富(约 60K 张,每张代表一个独特身份,提供多样化的身份信息)。论文将单张图像视为一帧的视频片段参与训练——这种「以图补视频」的策略显著提升了模型对风格化肖像的泛化能力 #Guo-et-al.-2024。
Stage I:基础模型从零训练
第一阶段训练时,$\mathcal{F}$(appearance extractor,2D CNN + 金字塔池化)、$\mathcal{M}$(motion extractor,ConvNeXt-V2-Tiny 骨干)、$\mathcal{W}$(warping module)和 $\mathcal{G}$(SPADE decoder)全部从零开始训练 #Guo-et-al.-2024。训练目标是 8 项级联损失的加权和:
Stage I 总训练目标
其中前四项继承自 face vid2vid:$\mathcal{L}_E$(关键点等变性)、$\mathcal{L}_L$(关键点先验)、$\mathcal{L}_H$(头部姿态)、$\mathcal{L}_\Delta$(形变先验)。后四项是 LivePortrait 新增的关键增强:
- $\mathcal{L}_{P,cascade}$:在全局、面部、唇部三个区域分别施加的感知损失
- $\mathcal{L}_{G,cascade}$:由三个从零训练的判别器 $\mathcal{D}_{global}$、$\mathcal{D}_{face}$、$\mathcal{D}_{lip}$ 组成的级联 GAN 损失,face 和 lip 区域由 2D semantic landmarks 定义
- $\mathcal{L}_{faceid}$:使用 ArcFace #Deng-et-al.-2019 提取身份嵌入,保持源图像身份
- $\mathcal{L}_{guide}$:landmark-guided 损失,用 N=10 个眼睛和嘴唇区域 2D landmarks + Wing loss 约束微表情
这个级联设计——全局 + 面部 + 唇部三层判别——是 LivePortrait 表情和口型质量的关键。三层区域不是随意划分的:face 和 lip 的边界由 2D semantic landmarks 精确定义,确保局部纹理细节被对应的判别器精确优化。Stage I 在 8 块 NVIDIA A100 GPU 上训练约 10 天,batch size 设为 104,使用 Adam 优化器(lr=2×10⁻⁴, β₁=0.5, β₂=0.999),输入为 256×256 对齐裁剪,输出为 512×512 #Guo-et-al.-2024。
Stage II:冻结基础,训练控制模块
第二阶段冻结 $\mathcal{F}$、$\mathcal{M}$、$\mathcal{W}$ 和 $\mathcal{G}$ 的所有参数,只训练三个轻量 MLP。论文的核心经验发现是:紧凑隐式关键点可以有效表示一种 implicit blendshapes——不像 3DMM blendshape 那样有显式语义维度,但可以通过小型 MLP 学到「眼睛更开一点」「嘴巴闭合一点」「肩部贴回源图」这样的局部 deformation offset #Guo-et-al.-2024。Stage II 仅需约 2 天即可完成。
三个模块的训练各有巧思。Stitching 模块训练时故意使用 cross-id motion(而非 same-id motion),增加训练难度以提升跨身份 stitching 泛化——模型必须学会在「驱动运动来自另一个人」的情况下仍将肩部对齐到源图。Stitching 的损失函数由肩部一致性像素损失和 L1 正则组成:
其中 $M^{st}$ 是 mask 掉非肩部区域的算子,$I_{p,recon}$ 是自重建图像作为锚点——这确保 stitching 只修改肩部区域的 deformation,不影响面部表情和外观。Eyes 和 lip retargeting 的损失结构类似,额外加入条件损失确保预测的 eyes-open / lip-open 与目标值一致 #Guo-et-al.-2024:
其中 $c^p$ 是网络预测的 eyes-open / lip-open scalar,$c_d$ 是目标值,$w_{cond}$ 和 $w_{reg}$ 分别是条件损失和正则项的权重。Eyes retargeting 的训练输入是源隐式关键点 $x_s$、源 eyes-open 条件元组 $c_{s,eyes}$ 和随机驱动 eyes-open scalar $c_{d,eyes} \in [0, 0.8]$;Lip retargeting 类似 #Guo-et-al.-2024。
| 项目 | 披露状态 | 值 / 说明 |
|---|---|---|
| Stage I 硬件 | 已披露 | 8 NVIDIA A100 GPUs |
| Stage I 时间 | 已披露 | 约 10 天,从零训练 |
| Stage II 硬件 | 已披露 | 8 NVIDIA A100 GPUs(推测与 Stage I 一致) |
| Stage II 时间 | 已披露 | 约 2 天,参数冻结仅训 MLP |
| Stage I 可训练模块 | 已披露 | $\mathcal{F}$, $\mathcal{M}$, $\mathcal{W}$, $\mathcal{G}$(全部从零训练) |
| Stage II 冻结模块 | 已披露 | $\mathcal{F}$, $\mathcal{M}$, $\mathcal{W}$, $\mathcal{G}$(全部冻结) |
| 输入 crop | 已披露 | 256×256 aligned crop |
| 输出分辨率 | 已披露 | 512×512(PixelShuffle 上采样) |
| Batch size | 已披露 | 104(全局) |
| 优化器 | 已披露 | Adam, lr=2×10⁻⁴, β₁=0.5, β₂=0.999 |
| Stitching MLP | 已披露 | 4 层 [126, 128, 128, 64, 65] |
| Eyes retargeting MLP | 已披露 | 6 层 [66, 256, 256, 128, 128, 64, 63] |
| Lip retargeting MLP | 已披露 | 4 层 [65, 128, 128, 64, 63] |
| Landmark N | 已披露 | 10(眼睛和嘴唇区域) |
| 判别器 | 已披露 | 3 个从零训练:$\mathcal{D}_{global}$, $\mathcal{D}_{face}$, $\mathcal{D}_{lip}$ |
| 训练数据 | 部分披露 | 69M 帧(92M 过滤后)/ 18.9K 身份,含私有 LightStage |
| 训练数据来源 | 部分披露 | 公开:VoxCeleb, MEAD, RAVDESS, AAHQ;私有:4K 视频, 200h talking head, LightStage |
| Stitching 训练数据 | 已披露 | cross-id motion(非 same-id),增加训练难度 |
| Eyes 训练条件范围 | 已披露 | $c_{d,eyes} \in [0, 0.8]$ |
| 完整 loss 权重 | 未披露 | $w_{reg}^{st}$ 等超参数未给出具体值 |
| 学习率调度 | 未披露 | 原文未明确给出 schedule 类型及 warmup |
| 训练代码 | 未披露 | 官方 GitHub 仅提供推理代码和预训练权重 |
推理阶段,首先从源图像提取特征体 $f_s = \mathcal{F}(I_s)$ 和 canonical keypoints $x_{c,s} = \mathcal{M}(I_s)$。给定驱动视频序列 $\{I_{d,i} | i=0, \ldots, N-1\}$,逐帧提取 motion 参数 $s_{d,i}, \delta_{d,i}, t_{d,i}, R_{d,i} = \mathcal{M}(I_{d,i})$ 以及条件 $c_{d,eyes,i}$ 和 $c_{d,lip,i}$ #Guo-et-al.-2024。核心是相对运动变换——以驱动视频第一帧为锚点,将绝对运动转为相对运动:
推理时的相对运动变换
这个公式的关键设计:(a) 尺度部分 $s_s \cdot s_{d,i}/s_{d,0}$ 将驱动尺度归一化到源尺度;(b) 旋转部分 $R_{d,i}R_{d,0}^{-1}R_s$ 先消除驱动首帧的旋转偏移,再叠加源旋转;(c) 表情部分 $\delta_s + \delta_{d,i} - \delta_{d,0}$ 保留源表情基准,叠加驱动相对变化;(d) 平移部分 $t_s + t_{d,i} - t_{d,0}$ 同理。注意官方代码中 $t_z$ 被强制置零(t_new[..., 2].fill_(0)),因为肖像动画在正交投影假设下运行,深度方向平移无意义 #LivePortrait-Code。
推理算法:三分支控制逻辑
计算完相对运动变换后,根据三个控制开关 $\alpha_{st}$、$\alpha_{eyes}$、$\alpha_{lip}$(取值 0 或 1)决定如何组合 stitching 和 retargeting 模块。论文给出了 Algorithm 1 的三分支逻辑 #Guo-et-al.-2024:
Algorithm 1:推理时的关键点更新
分支一($\alpha_{st}=0, \alpha_{eyes}=0, \alpha_{lip}=0$):不使用任何控制模块,$x'_{d,i} = x_{d,i}$。这是最简单的纯运动迁移模式。
分支二($\alpha_{st}=1, \alpha_{eyes}=0, \alpha_{lip}=0$):仅启用 stitching,$\Delta_{st,i} = \mathcal{S}(x_s, x_{d,i})$,$x'_{d,i} = x_{d,i} + \Delta_{st,i}$。肩部被对齐到源图裁剪空间。
分支三($\alpha_{eyes}=1$ 或 $\alpha_{lip}=1$):启用 retargeting,$\Delta_{eyes,i} = \mathcal{R}_{eyes}(x_s; c_{s,eyes}, c_{d,eyes,i})$,$\Delta_{lip,i} = \mathcal{R}_{lip}(x_s; c_{s,lip}, c_{d,lip,i})$,$x'_{d,i} = x_s + \alpha_{eyes} \Delta_{eyes,i} + \alpha_{lip} \Delta_{lip,i}$。注意此时以 $x_s$ 为基准而非 $x_{d,i}$。若同时 $\alpha_{st}=1$,再叠加 stitching:$x'_{d,i} \mathrel{+}= \Delta_{st,i}$。
最终预测图像 $I_{p,i} = \mathcal{D}(\mathcal{W}(f_s; x_s, x'_{d,i}))$。关键点是 eyes 和 lip 的 deformation offsets 彼此解耦,可以线性叠加——即使两个 retargeting 模块独立训练 #Guo-et-al.-2024。
推理硬件与性能
论文报告的推理速度为 12.8 ms/帧(约 78 FPS),测试硬件为 单块 NVIDIA RTX 4090 GPU,使用原生 PyTorch 推理(无需 TensorRT 加速)#Guo-et-al.-2024。官方推理代码默认启用 FP16 半精度(flag_use_half_precision=True),在保持生成质量的同时进一步降低显存占用和推理延迟 #LivePortrait-Code。
输入分辨率为 256×256 的对齐裁剪(aligned crop),输出分辨率为 512×512(通过 PixelShuffle 上采样)。源图像最大边长限制为 1280 像素(source_max_dim=1280),确保 paste-back 到原始图像空间时不因分辨率过大而内存溢出 #LivePortrait-Code。官方代码还支持 macOS Apple Silicon(MPS 后端),但速度约为 RTX 4090 的 1/20 #LivePortrait-GitHub。
官方代码的完整推理流程
官方 GitHub 仓库是论文的 official PyTorch implementation #LivePortrait-GitHub。通过分析 live_portrait_pipeline.py 的 execute 方法,完整的推理流程可分为五个阶段 #LivePortrait-Code:
(1) 加载源输入:支持源图像和源视频两种输入。源图像经过 face detection → crop → resize 到 256×256;源视频则逐帧处理。同时提取 source landmarks 用于后续的 eyes-open / lip-open 条件计算。
(2) 处理驱动信息:驱动输入可以是视频文件或预提取的 motion template(.pkl 文件)。若是视频,先 crop 到 256×256,逐帧提取 motion 参数(scale、R、exp、t)和 eyes-open / lip-open 条件,序列化为 motion template 并缓存为 .pkl。这一步的工程价值在于:同一个 driving motion 可以缓存复用于不同源图,同时保护隐私——不需要传输驱动视频本身,只需传递抽象化的运动参数 #LivePortrait-GitHub。
(3) 准备 paste-back:当 flag_pasteback=True 且 flag_stitching=True 时,预先计算 paste-back 所需的 mask——将裁剪空间的生成结果映射回原始图像空间,用 mask 做边界融合,消除裁剪边界的硬切痕迹 #LivePortrait-Code。
(4) 逐帧动画:推理的核心循环。对每一帧驱动帧 $i$:(a) 缓存第一帧的 $R_{d,0}$ 和 motion 作为相对运动锚点;(b) 根据 flag_relative_motion 计算相对运动变换;(c) 根据 driving_option 选择驱动模式——pose-friendly(默认)以姿态为主,expression-friendly 以表情为主,后者通过 motion_multiplier 动态调整不同区域运动强度;(d) 根据 stitching / retargeting 开关执行 Algorithm 1 的三分支逻辑;(e) 调用 warping module $\mathcal{W}$ 和 decoder $\mathcal{G}$ 生成预测帧;(f) 若启用 paste-back,将生成结果映射回原始图像空间 #LivePortrait-Code。
(5) 后处理与输出:将生成帧序列编码为视频(默认 mp4,CRF=15,FPS=25),支持从源视频或驱动视频自动提取音频并合成到输出视频。最终输出两个文件:纯动画结果和「驱动帧 | 源帧 | 生成结果」三栏对比视频 #LivePortrait-Code。
此外,代码还提供 animation_region 控制动画作用区域——all(全部)、exp(仅表情)、pose(仅姿态)、lip(仅嘴唇关键点)、eyes(仅眼部关键点),实现比论文更精细的区域控制。当源输入是视频时(v2v 模式),还支持 Kalman 平滑(driving_smooth_observation_variance=3e-7)减少逐帧 jitter #LivePortrait-Code。
| 推理配置项 | 默认值 | 说明 |
|---|---|---|
| 推理硬件 | RTX 4090 | 单 GPU,原生 PyTorch(无 TensorRT) |
| 推理速度 | 12.8 ms/帧 | 约 78 FPS |
| 半精度 | FP16 | flag_use_half_precision=True |
| 输入分辨率 | 256×256 | 对齐裁剪(aligned crop) |
| 输出分辨率 | 512×512 | PixelShuffle 上采样 |
| 源图最大边长 | 1280 px | source_max_dim |
| 相对运动 | 开启 | flag_relative_motion=True |
| Stitching | 开启 | flag_stitching=True |
| Paste-back | 开启 | flag_pasteback=True |
| Lip 归一化 | 开启 | flag_normalize_lip=True |
| Eyes retargeting | 关闭 | flag_eye_retargeting=False |
| Lip retargeting | 关闭 | flag_lip_retargeting=False |
| Driving option | pose-friendly | 可选 expression-friendly |
| Animation region | all | 可选 exp / pose / lip / eyes |
| Driving multiplier | 1.0 | 运动强度缩放因子 |
| 平滑强度 | 3e-7 | driving_smooth_observation_variance(v2v 模式) |
| 输出 FPS | 25 | output_fps |
| 视频 CRF | 15 | 输出视频质量 |
| Motion template | 支持 | .pkl 缓存,保护隐私 |
| macOS Apple Silicon | 支持 | MPS 后端,约 RTX 4090 的 1/20 |
driving_option 和 animation_region 的设计则让推理接口具备「只动嘴不动头」「只动表情不动姿态」等精细控制能力,远超论文正文描述的简单 0/1 开关。扩展应用
论文附录展示了多个扩展应用:(a) 多人动画——stitching 使一张合照中的每个人可以分别动画;(b) 音频驱动——用 Whisper 编码音频,transformer 回归运动参数;(c) 动物泛化——微调少量动物数据即可用人类视频驱动猫和狗(去掉 head pose loss、lip GAN loss 和 faceid loss);(d) 肖像视频编辑——只替换源视频的头部区域,保留身体其他部分,通过表情平滑 $0.5 \cdot (\delta_{d,i} + \delta_{d,i+1})$ 减少抖动 #Guo-et-al.-2024。
Self-reenactment:全面领先
Self-reenactment(源=驱动身份)在 TalkingHead-1KH(35 个视频)和 VFHQ(50 个视频)上评测。对比方法包括 5 个非扩散方法(FOMM、Face Vid2vid、DaGAN、MCNet、TPSM)和 3 个扩散方法(FADM、AniPortrait、X-Portrait)。
| 方法 | TalkingHead-1KH | VFHQ | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| PSNR↑ | SSIM↑ | LPIPS↓ | L₁↓ | CSIM↑ | MAE°↓ | PSNR↑ | SSIM↑ | LPIPS↓ | L₁↓ | CSIM↑ | MAE°↓ | |
| FOMM | 31.07 | 0.762 | 0.120 | 0.042 | 0.881 | 10.17 | 30.59 | 0.710 | 0.141 | 0.051 | 0.870 | 10.93 |
| Face Vid2vid | 30.84 | 0.774 | 0.094 | 0.043 | 0.877 | 10.81 | 30.52 | 0.725 | 0.113 | 0.050 | 0.878 | 11.15 |
| DaGAN | 31.37 | 0.790 | 0.097 | 0.039 | 0.880 | 11.87 | 30.70 | 0.732 | 0.126 | 0.048 | 0.875 | 11.21 |
| MCNet | 32.00 | 0.804 | 0.102 | 0.035 | 0.888 | 10.90 | 31.35 | 0.754 | 0.121 | 0.043 | 0.885 | 9.66 |
| TPSM | 31.29 | 0.797 | 0.099 | 0.040 | 0.885 | 9.60 | 31.03 | 0.748 | 0.118 | 0.047 | 0.888 | 9.82 |
| FADM | 30.21 | 0.770 | 0.105 | 0.048 | 0.871 | 11.45 | 30.09 | 0.718 | 0.125 | 0.054 | 0.871 | 11.75 |
| AniPortrait | 31.47 | 0.714 | 0.092 | 0.047 | 0.855 | 12.08 | 30.90 | 0.672 | 0.107 | 0.054 | 0.857 | 14.24 |
| X-Portrait | 31.27 | 0.719 | 0.101 | 0.049 | 0.877 | 9.23 | 30.58 | 0.648 | 0.131 | 0.063 | 0.872 | 9.38 |
| LivePortrait | 32.01 | 0.819 | 0.066 | 0.035 | 0.913 | 7.05 | 31.56 | 0.765 | 0.080 | 0.042 | 0.912 | 6.70 |
Cross-reenactment:多数指标领先,但不回避弱点
Cross-reenactment(源≠驱动身份)是更困难的场景,源肖像来自 FFHQ 数据集前 50 张图像。论文诚实地报告了结果——并非所有指标都第一:
| 方法 | TalkingHead-1KH | VFHQ | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| FID↓ | CSIM↑ | AED↓ | APD↓ | MAE°↓ | FID↓ | CSIM↑ | AED↓ | APD↓ | MAE°↓ | |
| FOMM | 90.81 | 0.306 | 0.793 | 0.041 | 18.39 | 94.16 | 0.201 | 0.737 | 0.034 | 18.63 |
| Face Vid2vid | 82.91 | 0.369 | 0.829 | 0.056 | 20.27 | 83.89 | 0.236 | 0.789 | 0.047 | 19.99 |
| DaGAN | 81.11 | 0.294 | 0.764 | 0.041 | 21.02 | 82.63 | 0.197 | 0.711 | 0.033 | 20.69 |
| MCNet | 89.32 | 0.286 | 0.716 | 0.038 | 17.07 | 89.97 | 0.191 | 0.655 | 0.033 | 17.36 |
| TPSM | 80.54 | 0.329 | 0.749 | 0.039 | 17.44 | 77.59 | 0.220 | 0.670 | 0.029 | 16.81 |
| FADM | 95.40 | 0.376 | 0.816 | 0.053 | 18.83 | 98.25 | 0.247 | 0.781 | 0.044 | 18.98 |
| AniPortrait | 47.87 | 0.373 | 0.913 | 0.045 | 19.71 | 70.81 | 0.254 | 0.902 | 0.050 | 20.11 |
| X-Portrait | 60.80 | 0.584 | 0.839 | 0.107 | 20.93 | 58.67 | 0.588 | 0.846 | 0.123 | 22.59 |
| LivePortrait | 58.04 | 0.391 | 0.677 | 0.033 | 14.79 | 56.42 | 0.261 | 0.648 | 0.027 | 13.35 |
消融实验:Stitching 与 Retargeting 的价值
论文对三个控制模块分别做了消融验证 #Guo-et-al.-2024:
Stitching 消融(Figure 10):无 stitching 时,动画结果的肩部位置跟随驱动帧而非源图。贴回原图后,肩部错位非常明显。启用 stitching 后,肩部被强制对齐到源图裁剪空间,同时保持运动和外观——贴回原图后无明显错位。
Eyes retargeting 消融(Figure 7):无需任何驱动帧,给定一个 eyes-open scalar $c_{d,eyes} \in [0, 0.8]$ 即可控制源图眼睛从闭合到全开。在跨身份驱动中,当大眼睛的人被小眼睛的人驱动时,retargeting 通过比例迁移公式 $c_{d,eyes,i} = \bar{c}_{s,eyes} \cdot \bar{c}'_{s,eyes,i} / \bar{c}'_{s,eyes,0}$ 修正闭眼不完整问题。甚至训练分布外的值(如 $-0.2$)也能产生合理结果 #Guo-et-al.-2024。
Lip retargeting 消融(Figure 8):类似设计,lip-open scalar 控制嘴唇开合。嘴巴大张时会生成舌头。跨身份场景中通过 $c_{d,lip,i} = c_{s,lip} \cdot c'_{s,lip,i} / c'_{s,lip,0}$ 迁移比例。
同时启用 eyes + lip retargeting(Figure 9):两个模块独立训练但可同时启用,验证了 deformation offset 的解耦性——$\Delta_{eyes}$ 和 $\Delta_{lip}$ 不会互相干扰 #Guo-et-al.-2024。
需要注意的是,论文的消融实验以定性可视化为主,未报告各组件移除后的定量指标变化(如 PSNR 下降幅度)。
时间一致性对比
论文还展示了与扩散方法的时间一致性对比(Figure 6)。扩散方法因高方差性导致前景和背景时间一致性不如非扩散方法:FADM 动画中雕像消失、AniPortrait 出现异常背景运动、MegActor 红横幅消失、X-Portrait 衣服图案变化。而 LivePortrait 的隐式关键点 + warping 框架天然具备更好的时间稳定性 #Guo-et-al.-2024。
论文自身承认的局限
- 大姿态跨身份表现不佳:模型在 cross-reenactment 涉及大姿态变化时表现退化 #Guo-et-al.-2024。
- 肩部运动抖动:驱动视频有显著肩部运动时,有概率产生 jitter #Guo-et-al.-2024。
- 复现门槛高:核心训练数据包含私有和内部收集部分,完整复现 6900 万帧训练并不现实。
- 训练侧公开不足:官方仓库重点是推理;训练代码、完整 loss 权重和数据清洗细节未公开。
社区影响与后续工作
LivePortrait 发布后迅速获得社区关注——GitHub Star 数在发布数日内即突破 6500 #LivePortrait-GitHub。社区涌现了多个衍生项目,包括 TensorRT 加速(推理速度进一步提升)、ComfyUI 集成、Gradio WebUI 等。快手自家的 Kling AI 和剪映产品也采用了该技术,抖音、微信视频号等平台也有基于 LivePortrait 的特效功能。
LivePortrait 发布后,社区沿不同方向做出了改进。其中两个最具代表性的直接后继工作是 Ditto #Li-et-al.-2025 和 FaceShot #GaoJ-et-al.-2025,它们分别从「运动表示生成」和「跨域输入接口」两个维度扩展了 LivePortrait 的能力边界。
Ditto:把扩散生成器搬进 LivePortrait 的运动空间
Ditto(蚂蚁集团,ACM MM 2025)#Li-et-al.-2025 是最直接的后继——论文明确声明"We construct the motion space based on LivePortrait"。它复用了 LivePortrait 的 Motion Extractor $\mathcal{M}$(提取 $\boldsymbol{\delta}, \mathbf{R}, \mathbf{t}$)和 Face Renderer($\mathcal{F} + \mathcal{G}$),但在中间插入了一个 Conditional Diffusion Transformer(DiT)来从音频特征生成运动表示 #Li-et-al.-2025。换言之,LivePortrait 从驱动视频直接提取运动,而 Ditto 用扩散模型从音频「生成」运动——这使得 Ditto 能做音频驱动的 talking head,而非仅限视频驱动。
Ditto 训练用 8 块 A100、batch 1024、500 epochs,运动表示共 265 维(21 个 3D 关键点的 $\boldsymbol{\delta} \in \mathbb{R}^{63}$ + 头姿 $\mathbf{R} \in \mathbb{R}^{9}$ + 平移 $\mathbf{t} \in \mathbb{R}^{3}$,离散化后 265D)。推理时 DiT 去噪步数从 50 降到 10,配合 TensorRT 加速,实现 RTF 0.895 和首帧延迟 385ms #Li-et-al.-2025。Ditto 还利用 LivePortrait 的 implicit blendshapes 发现建立了运动到面部语义的映射,实现了 gaze、emotion、pose 等细粒度控制——这正是 LivePortrait stitching/retargeting 控制思路的扩散化延伸。
FaceShot:用扩散特征解决 LivePortrait 的跨域输入问题
FaceShot(同济大学 / 上海 AI Lab,ICLR 2025)#GaoJ-et-al.-2025 走的是完全不同的路线——它不在动画模型内部做改进,而是改善输入端。LivePortrait 依赖 Motion Extractor 从源图和驱动视频中提取关键点,当源图是非人类角色(emoji、玩具、动物)时,关键点检测失败。FaceShot 用 Stable Diffusion 的中间层语义特征为任意角色匹配精确 landmark,再用坐标变换迁移运动,最后把 landmark 序列交给任意动画模型 #GaoJ-et-al.-2025。
关键在于,FaceShot 是 training-free 的,并且可以作为插件接入 LivePortrait——用 FaceShot 生成 landmark,再交给 LivePortrait 渲染。论文构建了 CharacBench(46 个非人类角色),LivePortrait 在其上有 16.67% 的失败率(无法检测面部),而 FaceShot 达到 0% 失败率 #GaoJ-et-al.-2025。这意味着 FaceShot 和 LivePortrait 是互补关系:FaceShot 解决「输入端跨域」,LivePortrait 解决「模型端可控性」。
三个工作的架构对比
LivePortrait、Ditto 和 FaceShot 代表了肖像动画的三种改进策略:
| 维度 | LivePortrait | Ditto | FaceShot |
|---|---|---|---|
| 改进位置 | 模型内部(stitching + retargeting) | 模型内部(扩散运动生成器) | 模型输入端(landmark 生成) |
| 运动接口 | 隐式 3D 关键点(K≈21) | LivePortrait 运动表示(265D) | 显式 2D landmark(68 点) |
| 驱动类型 | 视频驱动 | 音频驱动 | 视频驱动 |
| 需要训练 | 是(2 阶段,12天) | 是(500 epochs) | 否(Training-free) |
| 推理速度 | 12.8ms/帧(RTX 4090) | RTF 0.895(A100) | ~1.59s/帧(H800) |
| 非人类角色 | 失败(16.67%) | 不支持 | 支持(0% 失败率) |
| 可控性 | stitching + eyes/lip | gaze + emotion + pose | 依赖下游模型 |
| 与本文关系 | — | 复用 LivePortrait 运动空间 | 可作为 LivePortrait 插件 |
从架构图角度看,三个工作的信息流截然不同。LivePortrait 是端到端的:源图 + 驱动视频 → Motion Extractor → 隐式关键点 → Warping + SPADE Decoder → 动画。Ditto 在 LivePortrait 的渲染后端前插入了一个扩散前端:音频 → HuBERT → Conditional DiT → 生成运动表示 → LivePortrait Renderer → 动画。FaceShot 则在动画模型的输入端前插入了一个 landmark 生成器:源图 + 驱动视频 → 扩散特征匹配 + 坐标变换 → landmark 序列 → 任意动画模型 → 动画。
RealPortrait(加入身份保持模块解决 CSIM 弱势)等其他工作也在沿着各自方向推进。总体而言,LivePortrait 开创的「隐式关键点 + 可控性模块」路线已经催生了从音频驱动、跨域角色到实时流式推理等多个方向的后继工作,说明这条路线具有持续的研究价值。
为什么它值得放进数字人系列?
如果把数字人分成「高质量生成」和「实时可控工程」两条线,LivePortrait 明显属于后者。它不是用扩散模型暴力生成每一帧,而是把源图外观特征缓存起来,用运动表征驱动 warping,再用 decoder 还原。这种路线天然适合实时、交互、低延迟和多端部署。
从技术演进角度看,LivePortrait 标志着隐式关键点路线从「能动」到「可控」的跨越——FOMM 解决了「能不能动」,Face Vid2vid 解决了「3D 自由视角」,而 LivePortrait 解决了「贴得稳、眼嘴可控、产品可用」。对数字人系统来说,这比单纯提升离线视频质量更重要。
参考来源
- Guo, Jianzhu et al. (2024). LivePortrait: Efficient Portrait Animation with Stitching and Retargeting Control. arXiv:2407.03168. arXiv · HTML · PDF
- Siarohin, Aliaksandr et al. (2019). First Order Motion Model for Image Animation. NeurIPS 2019. arXiv
- Wang, Ting-Chun et al. (2021). One-Shot Free-View Neural Talking-Head Synthesis for Video Conferencing. CVPR 2021. arXiv
- Zeng, Bohan et al. (2023). Face Animation with an Attribute-Guided Diffusion Model. CVPR 2023.
- Wei, Huawei et al. (2024). AniPortrait: Audio-Driven Synthesis of Photorealistic Portrait Animation. arXiv:2403.17694. · 精读 →
- Xie, You et al. (2024). X-Portrait: Expressive Portrait Animation with Hierarchical Motion Attention. SIGGRAPH 2024. · 精读 →
- Yang, Shurong et al. (2024). MegActor: Harness the Power of Raw Video for Vivid Portrait Animation. arXiv:2405.20851.
- Woo, Sanghyun et al. (2023). ConvNeXt V2: Co-designing and Scaling Convnets with Masked Autoencoders. CVPR 2023.
- Park, Taesung et al. (2019). Semantic Image Synthesis with Spatially-Adaptive Normalization (SPADE). CVPR 2019.
- Shi, Wenzhe et al. (2016). Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network. CVPR 2016.
- Feng, Zhen-Hua et al. (2018). Wing Loss for Robust Facial Landmark Localisation with Convolutional Neural Networks. CVPR 2018.
- Deng, Jiankang et al. (2019). ArcFace: Additive Angular Margin Loss for Deep Face Recognition. CVPR 2019. · 精读 →
- LivePortrait Official Project Page. liveportrait.github.io
- KwaiVGI / LivePortrait official PyTorch implementation. GitHub
- LivePortrait official inference implementation:
src/live_portrait_pipeline.pyandsrc/config/inference_config.py, downloaded from the official GitHub repository on 2026-06-09. - Li, Tianqi et al. (2025). Ditto: Motion-Space Diffusion for Controllable Realtime Talking Head Synthesis. ACM MM 2025. arXiv:2411.19509 · 精读 →
- Gao, Junyao et al. (2025). FaceShot: Bring Any Character into Life. ICLR 2025. arXiv:2503.00740 · 精读 →