ESC
输入关键词搜索文章
目录

LivePortrait

arXiv 2024 · Kuaishou Technology
69M 帧训练 · 12.8ms 推理 · 隐式关键点 + stitching + retargeting 三重可控
系列说明:本文属于 AI / 数字人系列论文精读,聚焦 Portrait Animation / Talking Head 工程方法。LivePortrait 的核心价值不是提出一个更大的扩散模型,而是把隐式关键点路线推到可用、可控、可部署。
第一章
引言:为什么不是扩散,而是隐式关键点?

Portrait Animation 要解决的问题是:给定一张静态源肖像图像作为外观参考,用驱动视频中的头部姿态、表情、眼睛和嘴部运动,把源肖像「活起来」。这是一条从 FOMM #Siarohin-et-al.-2019 到 Face Vid2vid #Wang-et-al.-2021 延续下来的隐式关键点技术路线,但 2024 年扩散模型主导了生成质量的话语权——FADM #Zeng-et-al.-2023AniPortrait #Wei-et-al.-2024X-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 更像一个「工程系统论文」:贡献不只在网络结构,而在数据、训练策略、控制模块、推理流程和开源落地之间形成闭环。

LivePortrait qualitative portrait animation results
图 1:LivePortrait 定性效果。单张源肖像在不同驱动下可产生稳定头动、表情、眼睛和嘴部运动(来源:arXiv source Figure 1)。

论文声称的核心贡献有两点 #Guo-et-al.-2024:(i) 构建了一个坚实的隐式关键点驱动肖像动画框架,显著提升了生成质量和泛化能力;(ii) 设计了 stitching 模块和两个 retargeting 模块(眼睛、嘴唇),以可忽略的计算开销实现了精确可控性。

一句话概括:LivePortrait 把「隐式关键点 + feature warping + decoder」这条老路线重新工程化:用大数据和更强 backbone 提升泛化,用 stitching 解决贴回原图的错位,用 eyes / lip retargeting 补齐精细可控性。
第二章
问题剖析:扩散 vs 隐式关键点的路线分歧

扩散方法的三个结构性瓶颈

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 到可控动画框架

继承的骨架: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,兼顾训练效率与输出清晰度。

LivePortrait first-stage base model training pipeline
图 2:第一阶段 base model training。可训练模块包括 appearance / motion extractor、warping module 和 decoder(来源:arXiv source Figure 2)。

(4) 可缩放运动变换

Face Vid2vid 原始变换忽略了 scale factor:

$$x_s = x_{c,s}R_s + \delta_s + t_s, \quad x_d = x_{c,s}R_d + \delta_d + t_d$$

这导致 scaling 被吸收进 expression deformation $\delta$,增加训练难度。LivePortrait 引入显式 scale factor:

可缩放运动变换

$$x_s = s_s \cdot (x_{c,s}R_s + \delta_s) + t_s, \quad x_d = s_d \cdot (x_{c,s}R_d + \delta_d) + t_d$$

其中 $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 对齐:

$$\mathcal{L}_{guide} = \frac{1}{2N} \sum_{i=1}^{N} \big( \text{Wing}(l_i, x_{s,i,:2}) + \text{Wing}(l_i, x_{d,i,:2}) \big)$$

Wing loss 对小误差更敏感(相比于 L2 loss 在零点附近梯度恒定),适合微表情这类小幅运动。该损失同时施加在 source 和 driving 关键点上 #Guo-et-al.-2024

(6) 级联损失

第一阶段总训练目标包含 8 项损失:

Stage I 总训练目标

$$\mathcal{L}_{base} = \mathcal{L}_E + \mathcal{L}_L + \mathcal{L}_H + \mathcal{L}_\Delta + \mathcal{L}_{P,cascade} + \mathcal{L}_{G,cascade} + \mathcal{L}_{faceid} + \mathcal{L}_{guide}$$

其中 $\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。

LivePortrait second-stage stitching and retargeting pipeline
图 3:第二阶段 stitching / retargeting 训练。基础模块冻结,只优化三个小型 MLP 控制模块(来源:arXiv source Figure 3)。

三个模块的具体设计:

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]):类似设计,可独立控制嘴唇开合,也支持将输入源图先规范到闭嘴状态便于后续驱动。

关键发现:eyes 和 lip 的 deformation offsets 是解耦的——可以线性叠加($x'_{d,i} = x_s + \alpha_{eyes} \Delta_{eyes,i} + \alpha_{lip} \Delta_{lip,i}$),即使两个模块独立训练。论文在 Figure 9 中验证了同时启用两个 retargeting 的效果。
第四章
Training Pipeline:两阶段训练,而不是端到端一次解决

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 总训练目标

$$\mathcal{L}_{base} = \mathcal{L}_E + \mathcal{L}_L + \mathcal{L}_H + \mathcal{L}_\Delta + \mathcal{L}_{P,cascade} + \mathcal{L}_{G,cascade} + \mathcal{L}_{faceid} + \mathcal{L}_{guide}$$

其中前四项继承自 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 正则组成:

$$\mathcal{L}_{st} = \underbrace{\Vert (I_{p,st} - I_{p,recon}) \odot (1 - M^{st}(I_s)) \Vert_1}_{\text{肩部一致性}} + w_{reg}^{st} \Vert \Delta_{st} \Vert_1$$

其中 $M^{st}$ 是 mask 掉非肩部区域的算子,$I_{p,recon}$ 是自重建图像作为锚点——这确保 stitching 只修改肩部区域的 deformation,不影响面部表情和外观。Eyes 和 lip retargeting 的损失结构类似,额外加入条件损失确保预测的 eyes-open / lip-open 与目标值一致 #Guo-et-al.-2024

$$\mathcal{L}_{eyes} = \mathcal{L}_{eyes,const} + w_{cond}^{eyes} \Vert c^p_{s,eyes} - c_{d,eyes} \Vert_1 + w_{reg}^{eyes} \Vert \Delta_{eyes} \Vert_1$$
$$\mathcal{L}_{lip} = \mathcal{L}_{lip,const} + w_{cond}^{lip} \Vert c^p_{s,lip} - c_{d,lip} \Vert_1 + w_{reg}^{lip} \Vert \Delta_{lip} \Vert_1$$

其中 $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 仅提供推理代码和预训练权重
第五章
Inference Pipeline:相对运动变换与模块组合

推理阶段,首先从源图像提取特征体 $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。核心是相对运动变换——以驱动视频第一帧为锚点,将绝对运动转为相对运动:

推理时的相对运动变换

$$x_{d,i} = s_s \cdot \frac{s_{d,i}}{s_{d,0}} \cdot \big( x_{c,s}(R_{d,i}R_{d,0}^{-1}R_s) + (\delta_s + \delta_{d,i} - \delta_{d,0}) \big) + (t_s + t_{d,i} - t_{d,0})$$

这个公式的关键设计:(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.pyexecute 方法,完整的推理流程可分为五个阶段 #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=Trueflag_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
半精度FP16flag_use_half_precision=True
输入分辨率256×256对齐裁剪(aligned crop)
输出分辨率512×512PixelShuffle 上采样
源图最大边长1280 pxsource_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 optionpose-friendly可选 expression-friendly
Animation regionall可选 exp / pose / lip / eyes
Driving multiplier1.0运动强度缩放因子
平滑强度3e-7driving_smooth_observation_variance(v2v 模式)
输出 FPS25output_fps
视频 CRF15输出视频质量
Motion template支持.pkl 缓存,保护隐私
macOS Apple Silicon支持MPS 后端,约 RTX 4090 的 1/20
工程启发:LivePortrait 的推理接口把「驱动运动」抽象成可缓存 template,同时把 crop、paste-back、stitching 放进默认路径——说明论文非常重视真实产品场景里的边界错位问题。driving_optionanimation_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-1KHVFHQ
PSNR↑SSIM↑LPIPS↓L₁↓CSIM↑MAE°↓PSNR↑SSIM↑LPIPS↓L₁↓CSIM↑MAE°↓
FOMM31.070.7620.1200.0420.88110.1730.590.7100.1410.0510.87010.93
Face Vid2vid30.840.7740.0940.0430.87710.8130.520.7250.1130.0500.87811.15
DaGAN31.370.7900.0970.0390.88011.8730.700.7320.1260.0480.87511.21
MCNet32.000.8040.1020.0350.88810.9031.350.7540.1210.0430.8859.66
TPSM31.290.7970.0990.0400.8859.6031.030.7480.1180.0470.8889.82
FADM30.210.7700.1050.0480.87111.4530.090.7180.1250.0540.87111.75
AniPortrait31.470.7140.0920.0470.85512.0830.900.6720.1070.0540.85714.24
X-Portrait31.270.7190.1010.0490.8779.2330.580.6480.1310.0630.8729.38
LivePortrait32.010.8190.0660.0350.9137.0531.560.7650.0800.0420.9126.70
关键发现:LivePortrait 在 self-reenactment 上多数指标最优——PSNR、SSIM、LPIPS、CSIM 均为最优,L₁ 与 MCNet 并列(0.035)。原文用词为 "slightly outperforms"(略微优于)。最亮眼的是眼球方向 MAE:7.05°(TalkingHead-1KH)和 6.70°(VFHQ),比最强 baseline(X-Portrait 9.23° / TPSM 9.60°)降低了约 24-30%。这直接验证了 landmark-guided 优化对微表情的效果。
LivePortrait qualitative self-reenactment comparison
图 4:Self-reenactment 定性比较。论文强调 LivePortrait 对嘴部运动、眼神、大姿态与身份保持更稳定(来源:arXiv source Figure 4)。

Cross-reenactment:多数指标领先,但不回避弱点

Cross-reenactment(源≠驱动身份)是更困难的场景,源肖像来自 FFHQ 数据集前 50 张图像。论文诚实地报告了结果——并非所有指标都第一:

方法TalkingHead-1KHVFHQ
FID↓CSIM↑AED↓APD↓MAE°↓FID↓CSIM↑AED↓APD↓MAE°↓
FOMM90.810.3060.7930.04118.3994.160.2010.7370.03418.63
Face Vid2vid82.910.3690.8290.05620.2783.890.2360.7890.04719.99
DaGAN81.110.2940.7640.04121.0282.630.1970.7110.03320.69
MCNet89.320.2860.7160.03817.0789.970.1910.6550.03317.36
TPSM80.540.3290.7490.03917.4477.590.2200.6700.02916.81
FADM95.400.3760.8160.05318.8398.250.2470.7810.04418.98
AniPortrait47.870.3730.9130.04519.7170.810.2540.9020.05020.11
X-Portrait60.800.5840.8390.10720.9358.670.5880.8460.12322.59
LivePortrait58.040.3910.6770.03314.7956.420.2610.6480.02713.35
诚实的结果:LivePortrait 在 AED(Average Expression Distance,平均表情距离)、APD(Average Pose Distance,平均姿态距离)和 MAE(Mean Angular Error,平均角度误差)上全面领先,但在 TalkingHead-1KH 的 FID 上不如 AniPortrait(58.04 vs 47.87),CSIM 不如 X-Portrait(0.391 vs 0.584)。这说明扩散方法在图像分布质量和身份保持上仍有优势——LivePortrait 选择的是「运动精度 + 效率」而非「极致画质」的路线。

消融实验:Stitching 与 Retargeting 的价值

论文对三个控制模块分别做了消融验证 #Guo-et-al.-2024

Stitching 消融(Figure 10):无 stitching 时,动画结果的肩部位置跟随驱动帧而非源图。贴回原图后,肩部错位非常明显。启用 stitching 后,肩部被强制对齐到源图裁剪空间,同时保持运动和外观——贴回原图后无明显错位。

Stitching ablation study
图 5:Stitching 消融。上:裁剪空间对比;下:贴回原图空间对比。无 stitching 时肩部错位明显(来源:arXiv source Figure 10)。

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

Temporal consistency comparison with diffusion methods
图 6:时间一致性对比。扩散方法在前景和背景出现各种时间不一致问题,LivePortrait 结果更稳定(来源:arXiv source Figure 6)。
第七章
讨论与启发:在地图上的位置

论文自身承认的局限

  • 大姿态跨身份表现不佳:模型在 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.-2025FaceShot #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 代表了肖像动画的三种改进策略:

维度LivePortraitDittoFaceShot
改进位置模型内部(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/lipgaze + 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 解决了「贴得稳、眼嘴可控、产品可用」。对数字人系统来说,这比单纯提升离线视频质量更重要。

最终判断:LivePortrait 的关键不是「隐式关键点」这个名词,而是把隐式关键点变成一个可训练、可缓存、可贴回、可局部控制的产品化 motion interface。它的 stitching 模块解决了从实验室到产品的最后一公里——「贴回原图」这个看似简单但长期被忽视的需求。

参考来源

  1. Guo, Jianzhu et al. (2024). LivePortrait: Efficient Portrait Animation with Stitching and Retargeting Control. arXiv:2407.03168. arXiv · HTML · PDF
  2. Siarohin, Aliaksandr et al. (2019). First Order Motion Model for Image Animation. NeurIPS 2019. arXiv
  3. Wang, Ting-Chun et al. (2021). One-Shot Free-View Neural Talking-Head Synthesis for Video Conferencing. CVPR 2021. arXiv
  4. Zeng, Bohan et al. (2023). Face Animation with an Attribute-Guided Diffusion Model. CVPR 2023.
  5. Wei, Huawei et al. (2024). AniPortrait: Audio-Driven Synthesis of Photorealistic Portrait Animation. arXiv:2403.17694. · 精读 →
  6. Xie, You et al. (2024). X-Portrait: Expressive Portrait Animation with Hierarchical Motion Attention. SIGGRAPH 2024. · 精读 →
  7. Yang, Shurong et al. (2024). MegActor: Harness the Power of Raw Video for Vivid Portrait Animation. arXiv:2405.20851.
  8. Woo, Sanghyun et al. (2023). ConvNeXt V2: Co-designing and Scaling Convnets with Masked Autoencoders. CVPR 2023.
  9. Park, Taesung et al. (2019). Semantic Image Synthesis with Spatially-Adaptive Normalization (SPADE). CVPR 2019.
  10. Shi, Wenzhe et al. (2016). Real-Time Single Image and Video Super-Resolution Using an Efficient Sub-Pixel Convolutional Neural Network. CVPR 2016.
  11. Feng, Zhen-Hua et al. (2018). Wing Loss for Robust Facial Landmark Localisation with Convolutional Neural Networks. CVPR 2018.
  12. Deng, Jiankang et al. (2019). ArcFace: Additive Angular Margin Loss for Deep Face Recognition. CVPR 2019. · 精读 →
  13. LivePortrait Official Project Page. liveportrait.github.io
  14. KwaiVGI / LivePortrait official PyTorch implementation. GitHub
  15. LivePortrait official inference implementation: src/live_portrait_pipeline.py and src/config/inference_config.py, downloaded from the official GitHub repository on 2026-06-09.
  16. Li, Tianqi et al. (2025). Ditto: Motion-Space Diffusion for Controllable Realtime Talking Head Synthesis. ACM MM 2025. arXiv:2411.19509 · 精读 →
  17. Gao, Junyao et al. (2025). FaceShot: Bring Any Character into Life. ICLR 2025. arXiv:2503.00740 · 精读 →