“永续全身 Deepfake 生成”这几个词放在一起,已经足够说明一个新方向:它不再满足于只换一张脸,也不满足于生成几秒钟就崩坏的单帧结果,而是希望让整个身体在长时间视频里持续、稳定、可交互地“被合成”下去。这次的题目Towards perpetual full-body deepfake generation并不是某个具体开源仓库的完整 README,更像是一张技术路线图:把换脸、姿态驱动、视频生成、长序列一致性、批量渲染和合规控制全部串起来。
我写这篇笔记的目的,是把这条路线拆成可以落地的工程步骤:到底需要哪些模型模块、需要什么量级的硬件、怎么设计数据流程、怎么测试长视频一致性、怎么把推理封装成 API 和批量任务、以及哪些边界绝对不能碰。如果你正准备评估这类视频生成项目,或者想在自己的工作流里接入全身数字人/虚拟角色生成能力,这篇可以当作一个前置技术框架来用。
先说结论:这个方向可行性不低,但“永续”两个字才是最大的坑。局部换脸已经比较成熟,全身生成也有不少方案,难的是在几十秒、几分钟的视频里保持身份一致、动作连贯、纹理不漂移、光影不闪烁。后文会从技术拆解、硬件门槛、数据准备、推理验证、API 设计、性能观察和合规边界依次展开。
1. 核心技术能力速览
在没有绑定具体版本和开源仓库的前提下,先给一张“目标能力”速览表。这张表描述的是这一类项目应当具备的能力,不是某一个仓库已经实现的参数。
| 能力项 | 说明 |
|---|---|
| 项目定位 | 面向长时间、全身、可延续的视频人物合成方向 |
| 输入类型 | 人脸参考图、驱动视频、姿态序列、文本描述或语音驱动 |
| 输出类型 | 全身人物视频、逐帧蒙版、带音频视频、可循环片段 |
| 核心任务 | 身份保持、全身姿态迁移、面部重演、时间一致性、长视频生成 |
| 典型模型模块 | 人脸编码器、姿态估计器、人体参数化模型、生成骨干网络、后处理渲染器 |
| 推理硬件预期 | 通常需要 NVIDIA GPU,8G 显存只能做轻度测试,完整长视频需要 16G 及以上 |
| 训练硬件预期 | 多卡 24G 以上显存更稳妥,具体看基座模型规模 |
| 是否支持 CPU | 一般不建议,实时生成场景基本不可行 |
| 是否支持一键启动 | 取决于具体仓库是否提供整合包或 WebUI |
| 是否支持 API | 通常可以封装为 HTTP 服务,等待时间受视频长度影响 |
| 是否支持批量任务 | 适合做队列式批处理,但需要任务管理与失败重试 |
| 应用场景 | 虚拟数字人、影视预演、游戏过场、教育演示、内容创作 |
| 高风险边界 | 未经授权的真人替换、虚假信息传播、侵犯肖像权和版权 |
注意,这里的硬件预期是我根据当前生成类模型的常规水平做的估计,不是某个官方文档的保证。实际部署时一定要以目标仓库的训练配置和推理实测为准。
2. “永续”到底难在哪
很多同类项目能做出“几秒钟惊艳效果”,但放到长视频里就露馅。所谓 perpetual,需要同时解决三个层面的问题。
第一个是身份漂移。单帧生成时模型只负责把当前帧的脸和身体“画”对,但下一帧又开始重新推理,如果没有强约束,人物五官、体型、服装纹理会在几十帧之后慢慢变成另一个人。这个现象在自回归生成里尤其明显:每一帧都依赖前序帧,误差会像滚雪球一样累积。
第二个是时间一致性。视频是由连续帧构成的,前后两帧之间的人在动作上要平滑,在光影和肤色上要连续。很多生成模型单看每一帧都说得过去,一旦按时间轴播放,会出现脸部轮廓抖动、衣服花纹跳动、背景闪烁。要解决这个问题,通常需要引入时序模块、光流约束或者上下文窗口,而不是简单地逐帧独立生成。
第三个是“可持续性”。所谓永续,可以理解为生成过程能够不断延续:要么支持无限长的视频流,要么支持长期保持同一个角色设定。对于无限长视频,需要滑动窗口记忆;对于角色一致性,需要把身份特征和外观特征固定下来,而不是只靠提示词反复碰运气。
这三个问题合在一起,才是 full-body deepfake generation 从“演示”走向“生产”的核心门槛。
3. 技术拆解与模块划分
如果我们把这个方向拆成一个可实现的系统,比较合理的模块划分是这样的:
3.1 人体参数化与姿态估计
全身深度伪造首先要解决“身体怎么动”的问题。常用做法是先用姿态估计模型提取驱动视频中的人体骨骼关键点、关节旋转或者 SMPL-X 这样的参数化人体模型,把动作从源视频里抽离出来,变成一套与身份无关的动作表示。后续生成模型只需要读取这套动作表示,再把它映射到目标人物的形象上。
这个模块的关键点有三个:关键点定位是否稳、遮挡时是否还能跟踪、动作参数是否能完整描述手指、表情等细节。如果动作提取本身抖动,后面生成模块再怎么优化也很难救回来。
3.2 人脸编码与身份保持
身份保持通常依赖一个人脸识别模型作为特征提取器,比如 ArcFace 风格的嵌入向量。推理时,从目标人物的参考照片获取一个身份证向量,生成模型在每一帧都去匹配这个向量,让输出结果在“身份空间”里尽量靠近目标人物。
这里容易踩的坑是:身份向量约束过强会让表情僵硬,约束过弱会让长相漂移。工程上常见的做法是对不同区域采用不同强度的引导,脸部和手部给更高权重,衣服和背景给较低权重。
3.3 生成骨干网络
现在做长视频生成,主流方向已经不只是传统 GAN,而是扩散模型或者自回归模型。扩散模型在单帧质量上有明显优势,但推理速度慢、显存占用高;自回归模型在时间延续上更自然,但如果设计不好,长序列累积误差会比较明显。
具体选哪种,取决于项目是偏“质量优先”还是“速度优先”。如果是离线渲染高质量短片,扩散模型更合适;如果要实时互动,轻量级 GAN 或蒸馏后的扩散模型更有机会跑起来。在没有官方参数的情况下,不要把某一类模型当作绝对答案。
3.4 上下文窗口与长期记忆
“永续”直接放在工程上,就是如何把过去的信息传给当前生成模块。常见方案有三种:
- 逐帧自回归:每帧生成时输入前 N 帧作为上下文,窗口大小固定。
- 滑动窗口:窗口跟随时间轴移动,能处理任意长度视频,但窗口外的信息会丢失。
- 长期记忆库:用额外的编码器维护身份、服饰、场景等长期信息,每次生成时把全局记忆与局部上下文一起输入。
滑动窗口加长期记忆库在当前阶段最实际。只靠窗口难以防止身份漂移,只靠全局记忆又丢失了动作连续性。两者配合,才能做到既可无限续帧,又不会越跑越偏。
3.5 渲染与后处理
生成模型直接输出的帧往往还需要后处理,包括分辨率超分、人脸细节增强、颜色统一、边缘融合。如果工作流里还有音频驱动口型,还需要把音频特征对齐到生成模块,确保嘴型变化和声音同步。
这一层是工程里最容易被低估的部分。模型输出的画面如果直接落盘,很多小瑕疵会被放大;但加上超分、去闪烁、色彩匹配之后,整体观感会明显提升。
4. 环境准备与硬件门槛
这一类项目大多跑在 Linux 服务器上,Windows 下通常需要 WSL2 或者使用整合包。下面是通用检查清单,具体版本以目标仓库的要求为准:
4.1 基础环境清单
- 操作系统:Ubuntu 20.04/22.04 或带有 WSL2 的 Windows 11。
- GPU 驱动:NVIDIA 驱动版本要尽量新,老驱动可能不支持新 CUDA / PyTorch。
- CUDA:不建议直接用系统级 CUDA,而是通过 PyTorch 自带的 CUDA 运行时。
- Python:3.9 到 3.11 比较常见。
- 依赖管理:建议用 conda 或 venv,避免污染系统环境。
- 磁盘:视频生成实验对磁盘空间要求高,至少预留 50G 到 200G 或更多。
- 端口:WebUI 和 API 服务要提前确认端口没被占用。
4.2 显存与卡型建议
先声明,这里只给一个通用参考范围,不代表所有仓库都一样:
| 阶段 | 显存建议 | 说明 |
|---|---|---|
| 人脸轻量测试 | 6G 到 8G | 只做低分辨率、短视频的推理 |
| 全身视频推理 | 12G 到 16G | 能跑 512 或 768 分辨率、中等长度视频 |
| 完整训练 | 20G 到 24G 或以上 | 多卡更稳,显存可能还不够 |
| 超长/4K输出 | 24G 以上或离线分块 | 显存不够时要用分块和降分辨率策略 |
如果手头只有 8G 显卡,建议先跑通最小推理流程,不要把训练任务压在单卡上。更稳妥的判断是:先去看目标仓库的 README 里有没有显存实测表格,单位是GPUs而不是G,一定要看仔细。
5. 数据准备与预处理流程
这类任务对数据质量非常敏感。数据乱、授权不清、标注错位,后面所有模块都会跟着崩。下面给一套通用数据整理与预处理顺序。
5.1 原始视频收集
视频来源要有授权,不能直接抓取平台上的真人视频去做实验。如果涉及真人形象,必须拿到本人或版权方的明确授权。这一步不解决,后面全白做。
5.2 清洗与筛选
- 剪掉黑场、转场、字幕遮挡严重的片段。
- 去掉多人物同框、运动模糊过重的帧。
- 按场景切分,不要一整个长视频扔进去。
- 检测人脸角度覆盖,尽量多角度、多表情、多光照。
这里可以用一个通用 Python 脚本来做文件级筛选:检查文件大小、时长、是否存在损坏文件,并输出一个 manifest 清单。真实项目中还要在脚本里补人脸检测和姿态估计。
# 通用数据清理脚本模板,请按实际项目替换路径 import os import json from pathlib import Path data_root = Path("./raw_videos") out_root = Path("./processed_dataset") out_root.mkdir(exist_ok=True) video_list = list(data_root.glob("*.mp4")) manifest = [] for i, video_path in enumerate(video_list): stat = video_path.stat() if stat.st_size < 1024 * 1024: print(f"跳过过小文件: {video_path.name}") continue manifest.append({ "id": i, "video_path": str(video_path), "duration_seconds_hint": 0.0, "frame_count_hint": 0, "scene_label": "", "source_license": "", "consent_status": "unknown" }) with open(out_root / "manifest.json", "w", encoding="utf-8") as f: json.dump(manifest, f, ensure_ascii=False, indent=2) print(f"已生成清单: {out_root / 'manifest.json'}")5.3 对齐与裁剪
拿到视频后,通常要先把人脸区域和全身区域裁剪出来,分别做处理。人脸分支用高分辨率细节,身体分支用全景信息。裁剪时不要直接用简单矩形,最好考虑人体包围盒检测和人脸关键点对齐,否则后续姿态迁移会不稳定。
5.4 训练集与测试集划分
必须把“同一个人但不同场景”的视频分到测试集,而不是随机切帧。这样才能验证模型是否真的学会了身份泛化,而不是背下了训练帧。严格区分训练集、验证集、测试集是一个技术项目的底线。
6. 推理流水线与功能测试
假设项目已经封装好命令行工具或 WebUI,比较合理的验证顺序是先跑短视频,再逐步增加难度。
6.1 最小推理测试
测试目标:确认模型和环境通顺,能输出视频。
操作步骤:
- 准备一张清晰的正脸参考图,光线均匀,不要有遮挡。
- 准备一段 3 到 5 秒的驱动视频,动作幅度不要太大。
- 调整输出分辨率到 256 或 512,降低生成步数。
- 记录启动日志和显存占用。
- 生成后检查输出视频是否可播放、帧率是否正常、人脸区域是否清晰。
判断成功标准:进程不退、日志连续、输出文件存在、视频能流畅播放。
常见失败原因:模型权重没下载完整、依赖版本冲突、显存不足、参考图人脸角度太偏。
6.2 身份一致性测试
测试目标:验证长视频中人物是否始终是目标人物。
操作步骤:把同一条参考图分别用于三段不同驱动视频,生成后对输出帧提取人脸嵌入向量,计算相似度。相似度如果波动太大,说明身份保持模块出了问题。
可以使用下面的评估模板做基础量化:
# 身份保持与姿态误差的评估模板 import numpy as np def cosine_similarity(emb_a, emb_b): # emb_a/emb_b 是同一身份在不同帧中的归一化特征向量 return float(np.dot(emb_a, emb_b) / ( np.linalg.norm(emb_a) * np.linalg.norm(emb_b) + 1e-8 )) def pose_mae(pose_gt, pose_pred): # pose_gt/pose_pred: (T, J, 3) 的关节坐标或旋转矩阵展开 return float(np.mean(np.abs(pose_gt - pose_pred)))如果你在本地跑人脸识别模型,可以把参考图的特征向量和输出帧的特征向量都打出来,观察每一帧的余弦相似度曲线。曲线如果平稳,说明身份保持过关;曲线如果持续下滑,大概率是累积漂移。
6.3 长视频稳定性测试
测试目标:验证生成 30 秒或 1 分钟视频时,是否出现闪烁、纹理漂移、动作跳变。
操作步骤:
- 先用 10 秒视频测试。
- 再扩展到 30 秒。
- 目测注意力放在三个位置:脸部轮廓、衣服纹理、背景边缘。
- 把视频抽帧,按时间轴逐帧比对肤色均值,波形如果突然跳变,说明生成过程有中断或不一致。
这个测试最耗时,但恰恰是“永续”方向的核心验证项。如果项目没有提供长视频支持,也可以先用分段生成再拼接,但要注意拼接处的闪烁。
6.4 显存与耗时记录
每次测试都建议记录一张性能表格:
| 测试项 | 分辨率 | 帧数 | 显存占用 | 耗时 | 是否成功 |
|---|---|---|---|---|---|
| 短视频 | 512x512 | 24 | 待测 | 待测 | 是/否 |
| 长视频 | 512x512 | 120 | 待测 | 待测 | 是/否 |
| 带音频 | 512x512 | 150 | 待测 | 待测 | 是/否 |
有了这张表,才能在多个方案里做横向比较,也能确定当前机器能不能支撑目标业务。
7. 接口 API 与批量任务设计
如果要把这套能力接入业务系统,通常需要封装成 HTTP 服务,并配合异步任务队列。下面给的是通用模板,字段名和路径需要按实际服务的 OpenAPI 文档调整。
7.1 同步推理 API
适合短视频和低并发场景。请求接口返回最终视频文件路径或 Base64 数据。简单但容易超时,如果视频较长,HTTP 连接可能会被中断。
import requests # 通用请求模板,字段需按实际服务调整 payload = { "source_face": "/data/ref.jpg", "source_video": "/data/clip.mp4", "driver_video": "/data/driver.mp4", "output_fps": 25, "smooth_window": 5, "keep_original_audio": False } resp = requests.post("http://127.0.0.1:7860/api/swap", json=payload, timeout=600) print(resp.status_code) print(resp.json())7.2 异步批量任务
批量任务更适合提交一组视频后轮询状态:
- 客户端提交任务,服务端创建任务 ID。
- 任务排队进入工作进程。
- 工作进程逐条处理,记录日志和输出路径。
- 客户端通过任务 ID 查询状态,状态为
success时下载结果。 - 失败任务要留足日志,支持重试。
任务队列设计示例:
{ "input_dir": "./inputs", "output_dir": "./outputs", "batch_size": 1, "retry_times": 3, "tasks": [ { "task_id": "task_001", "source_face": "./inputs/face_001.jpg", "source_video": "./inputs/video_001.mp4" } ] }批量处理最容易出问题的不是模型,而是文件路径和显存排队。多个任务同时跑在单张卡上,可能不是更快,而是 OOM。建议批量大小设为 1,靠队列串行或限制并发数来保证稳定。
7.3 服务安全提醒
接口服务部署时只监听127.0.0.1或者在内网环境使用,不要直接暴露到公网。加一个简单的 Token 或者 API Key 鉴权,防止接口被外部调用消耗算力。如果涉及真实人物素材,还要做访问控制,审计日志至少保留任务提交人、素材来源、授权状态和输出结果。
8. 资源占用与性能观察
这类任务不是普通的分类模型,显存占用和帧长度、分辨率、步数、是否开启光流约束都有直接关系。实测时不要只盯着一个指标,要同时看显存、显存增长曲线、单帧推理时间和端到端视频耗时。
8.1 如何观察显存占用
命令行直接看进程显存:
nvidia-smi如果要持续观察变化,可以隔几秒采样:
watch -n 2 nvidia-smi生成视频时重点看显存峰值,而不是平均值。有些模型在开始推理时申请显存,在中间步骤释放一部分,再到输出阶段又申请一部分,峰值发生在哪个阶段需要记录下来。
8.2 影响资源占用的因素
- 分辨率:256 到 512,显存占用不是翻倍,而是可能翻几倍。
- 生成步数:步数越多,耗时越长,但显存不一定线性增加。
- 上下文窗口:窗口越长,显存越高,因为模型要同时处理多帧。
- 是否开启身份约束:额外的人脸编码器会增加少量显存。
- 是否开启后处理超分:超分本身就是另一个模型,占用另算。
8.3 降低资源占用的通用手段
- 使用
torch.cuda.amp.autocast()混合精度,或者在训练时开启 bf16。 - 开启梯度检查点,用一点计算换显存。
- 长视频分块生成,每块只处理 N 帧,块与块之间用重叠帧做平滑。
- 降低采样步数或使用蒸馏版模型。
- 先做人脸区域生成,再贴回全景图,而不是全程全分辨率生成。
下面是一个通用训练配置模板,体现梯度检查点、混合精度和上下文窗口设置:
# 训练配置模板(请按真实仓库要求修改) experiment: perpetual_swap_v1 device: cuda:0 input: video_dir: ./processed_dataset face_ref_path: ./ref/identity.png model: base: diffusion-backbone image_size: [512, 512] max_frames: 64 context_window: 12 identity_encoder: arcface motion_encoder: smplx training: batch_size: 1 accumulate_grad_batches: 4 gradient_checkpointing: true max_steps: 200000 mixed_precision: bf16 seed: 42 output: log_dir: ./logs checkpoint_dir: ./checkpoints sample_dir: ./samples这段配置不是某个具体仓库的官方配置,只是用于说明结构。实际使用时,字段名和模型名必须替换成目标仓库支持的值。
9. 安全边界与合规使用
这个方向必须单独说清楚:deepfake 技术如果被滥用,会造成严重的肖像侵权、隐私侵犯和虚假信息传播。任何人在接触这类项目时,都必须先确认素材授权。
无论你是做技术评估、二次开发还是产品落地,都要遵守以下几个基本点:
- 真人形象必须获得当事人明确授权,包括训练数据、参考图和驱动视频。
- 不要制作或传播可能造成误导的虚假视频,尤其是涉及新闻事件、公众人物、政治人物的内容。
- 版权素材需要使用正规渠道获取,不能用爬虫批量抓取平台视频做训练。
- 输出视频建议加不可见水印或 AI 生成内容标识,便于追溯。
- 不要绕过平台的内容检测机制或提供违反平台规则的服务。
技术本身是中性的,但使用边界决定了它是创意工具还是风险源。在写任何部署文档、测试流程或 API 封装之前,先把授权确认做成系统的一部分,而不是靠使用者的自觉。
10. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 启动后报 CUDA out of memory | 显存不足以支持当前分辨率/帧数 | 查看nvidia-smi,确认是否有其他进程占用 | 降低分辨率,减少上下文帧数,开启梯度检查点 |
| 模型权重加载失败 | 权重文件路径错误或下载不完整 | 对比文件大小和哈希值 | 重新下载,检查路径配置 |
| 输出视频人物不像参考图 | 身份约束权重太低或参考图质量差 | 换一张正脸清晰图测试 | 提高身份特征权重,清洗参考图 |
| 画面闪烁严重 | 逐帧独立生成,没有时间一致性约束 | 抽帧观察相邻帧肤色和轮廓差异 | 开启时序模块,增加重叠帧平滑 |
| 长视频生成到一半崩溃 | 显存持续增长,或者视频解码出现异常 | 查看服务日志的堆栈信息 | 分块生成,减小窗口长度,增加任务重试 |
| 接口请求超时 | 同步接口等待时间过长 | 查看任务耗时记录 | 改成异步任务队列 |
| 端口被占用 | 其他服务占用了默认端口 | lsof -i:7860 | 换端口或关闭冲突进程 |
| 音频不同步 | 音频特征对齐模块未启用 | 播放时观察唇形和音轨 | 检查是否输入了音频特征,调整音画对齐参数 |
11. 最佳实践与建议
把这类项目从“能跑”推进到“能稳定用”,有几个工程习惯值得提前建立。
第一,保留一套最小可运行配置。不要一上来就追求 4K 长视频。先用小分辨率、短视频、低步数把流程打通,再逐步加码。最小配置要写进项目文档,方便回滚。
第二,对数据目录严格管理。把原始素材、中间结果、最终输出分开存放,文件名里带上任务 ID 和日期。这样即使生成失败,也能快速定位是哪一步出错。
第三,给批量任务加日志和重试机制。视频生成任务很容易因为单个样本出错导致队列中断,建议每个任务单独写日志,失败后只重试失败样本,不要整批重跑。
第四,模型版本和依赖版本要锁死。这类项目对版本比较敏感,建议使用requirements.txt或 conda 环境导出文件。不要在新版本发布后直接升级,至少要跑一遍回归测试。
第五,接口服务要限流和鉴权。即使只是内网测试,也要避免被多人同时调用导致显存占满。加一个简单的 Redis 队列或者文件锁,控制并发数为 1,稳定优先。
12. 总结
“Towards perpetual full-body deepfake generation”这个研究方向真正的价值在于把问题定义变了:不是“像不像”,而是“能不能一直像下去”。从技术拆解来看,身份保持、姿态驱动、时间一致性、长期记忆和批量服务是五个必须跨过的关卡;从硬件门槛来看,推理至少需要一张能扛住 512 分辨率视频生成的 NVIDIA GPU,训练需要更充足的显存和耐心。
如果你正准备评估这类项目,建议第一次测试只做三件事:跑通最小推理流程、记录显存峰值、生成一段 10 秒视频并抽帧检查一致性。能过这三关,再谈长视频和批量任务。最容易踩的坑往往不在模型本身,而在数据授权、显存预估和长视频漂移上。
后续可以继续关注的方向包括:轻量级实时全身生成、音频驱动与视频生成的联合优化、基于扩散模型的长序列记忆机制,以及 AI 生成内容检测与溯源。一个技术方向从论文标题变成稳定工具,需要的不只是模型效果,还有一整套工程约束和合规流程。