FOMM 全称 First Order Motion Model for Image Animation,作者是 Aliaksandr Siarohin、Stéphane Lathuilière、Sergey Tulyakov、Elisa Ricci 与 Nicu Sebe,出自特伦托大学与 Snap,发表在 NeurIPS 2019,仓库在 github.com/AliaksandrSiarohin/first-order-model,MIT 协议。它最反直觉的一点是完全不用人脸关键点标注:自监督学出 10 个关键点,在每个关键点的邻域做一阶泰勒展开得到局部仿射变换,由稠密运动网络拼成整张光流场,最后交给带遮挡图(occlusion map)的生成器把被遮住的像素补出来。正因为它对「什么是脸」一无所知,同一套架构才能同时驱动人脸、太极全身、时装模特、动物剪影,甚至机械臂。
2020 年那波「让老照片开口说话」、Dame da ne 鬼畜视频和 Avatarify 实时换脸,底下跑的基本都是 FOMM 的 vox-adv 权重。这些年同一条技术线已经往前走了三代:作者本人在 Snap Research 做了 MRAA(CVPR 2021,专治关节类物体,官方 README 顶上那句「Check out our new paper」指的就是它),社区接力做了 Thin-Plate Spline Motion Model(CVPR 2022,用薄板样条替换一阶仿射),快手 KwaiVGI 的 LivePortrait(2024)把这套隐式关键点 warping 推到了可用于生产的口型与眼神重定向。所以要说清楚:FOMM 今天的身份是基线和教科书,不是 SOTA——但它没有被删库,也没有换名字,仍然完整可跑。
这恰恰让它成为最适合亲手跑一遍的模型。整套推理权重加起来只有 228MB(Qualcomm AI Hub 导出的 float ONNX 里,关键点检测器 54.2MB、生成器 174MB),一张最便宜的卡就能连续出片;而它的训练配置又足够真实——官方 vox-256.yaml 写着 batch_size=40、num_epochs=100、num_repeats=75,README 原话是这个 batch「is tuned to run on 2 or 4 Titan-X gpu」,想复现就得真掏多卡。NexGPU 两头都接得住:验证阶段用 $0.188 起的 Tesla V100 32GB,复现阶段用四张 RTX 4090 拼出 96GB 聚合显存,按秒计费、无最低消费、实例一停算力费就停。
01 —
官方 checkpoint 一览:哪份权重驱动哪类物体
全部 256×256、全部 MIT,文件名和体积可以直接跟 Google Drive/Yandex Disk 的下载列表对上
| 版本 | 参数量 | 显存 | 上下文 | 说明 |
|---|---|---|---|---|
| vox-256(vox-cpk.pth.tar) | 10 关键点 · 断点文件 728.8MB | 推理峰值 < 2GB(fp32);训练 batch_size=40,需 40GB 级显存或多卡 | 256×256 输出,驱动视频须先裁成人脸居中的方图 | VoxCeleb 训练的人脸权重,做数字人口播、老照片复活的默认选择,也是九成教程里唯一出现的那一个。 |
| vox-adv-256(vox-adv-cpk.pth.tar) | 10 关键点 · 同架构 + 对抗损失 | 推理与 vox-256 同级 < 2GB;训练要额外常驻判别器 | 256×256 输出,同样需要人脸裁剪 | 加了 GAN 判别器训练的人脸版,纹理更锐、糊边更少;Avatarify 那类实时换脸工具用的就是它。 |
| taichi-256 / taichi-adv-256(taichi-cpk.pth.tar) | 10 关键点 · 断点文件 750.9MB | 推理 < 2GB;全身画面细节多,建议再留几 GB 给解码和写盘缓冲 | 256×256 输出,要求全身入镜、单人、背景简单 | 太极视频训练,是 FOMM 里少数能驱动「整个人」而不只是一颗头的权重,全身姿态迁移 demo 认准它。 |
| fashion-256(fashion.pth.tar) | 10 关键点 · 断点文件 750.8MB | 推理 < 2GB;批量出片时瓶颈在 ffmpeg 编码而不在显存 | 256×256 输出,纯色背景、模特站立转身 | Fashion Video 数据集训练,服装电商「让静态模特图转个身」的最短路径,裙摆与衣褶的形变比人脸权重稳。 |
| mgif-256(mgif-cpk.pth.tar) | 10 关键点 · 四足动物侧面剪影 | 推理 < 2GB;素材本身就是低分辨率 GIF,显存从来不是瓶颈 | 256×256 输出,纯色背景的侧面剪影 | MGif 数据集全是动物侧影,是验证 FOMM 在非人类物体上泛化能力最省事的一组权重,出效果图快。 |
| bair-256(bair-cpk.pth.tar) | 10 关键点 · 断点文件 750.8MB | 推理 < 2GB;单段序列短,单卡可以并发跑多路 | 256×256 输出,固定机位俯拍桌面 | BAIR 机器人推物数据集,用来证明这套一阶运动表示根本不关心物体是不是生物;机器人视频预测的对照实验常引它。 |
02 —
选卡:先看 torch 1.12.1 支持到哪一代架构,再看显存
官方 requirements.txt 把 PyTorch 钉死在 1.12.1,这条约束比显存更早决定你能用哪张卡
照官方 pin 的环境原样跑通推理,预算压到最低
Tesla V100 32GB$0.188/卡·时
V100 是 sm_70,torch 1.12.1 的官方 wheel 原生带这代 kernel,clone 完 pip install -r requirements.txt 就能跑,不用为兼容性改一行代码;32GB 显存对一个两百多兆的模型属于纯富余。
批量出片,并且想在同一张卡上把 256×256 超分到 1024
RTX 3090 24GB$0.193/卡·时
sm_86 同样在 1.12.1 的覆盖范围内,24GB 足够让 FOMM 推理和 GFPGAN/Real-ESRGAN 后处理常驻同一张卡,中间不用落盘再搬一次。
单卡复现 vox-256 官方训练配置(batch_size=40)
RTX A6000 48GB$0.817/卡·时
README 说这个 batch 是按 2 到 4 张 12GB Titan X 调的,48GB 单卡刚好把当年要拼四张卡的显存一次装下;而且 FOMM 全程 fp32、代码里没有 AMP 分支,A6000 的 fp32 吞吐正对口。
复刻官方 --device_ids 0,1,2,3 的多卡训练,追进度
4 × RTX 4090 24GB$0.540/卡·时(四卡合计 $2.160/时)
96GB 聚合显存远超当年的 4×Titan X,DataParallel 在 256×256 这个分辨率上跑 PCIe 完全够用;但要注意 Ada 是 sm_89,不在 1.12.1 的编译架构里,上 4090 就得把 PyTorch 升到 2.x 并同步处理 torch.load 与 numpy 的破坏性变更。
03 —
从开机到出片:四步
命令全部来自官方仓库,没有改写,复制即用
- 01
开一台实例,装官方 pin 死的依赖
在 NexGPU 控制台选 PyTorch 预置镜像开机,SSH 或 Jupyter 进去 clone 仓库。requirements.txt 一共只有十五个包,torch==1.12.1、torchvision==0.13.1、numpy==1.23.3、scikit-image==0.19.3、imageio==2.22.0 全是钉死的版本。numpy 之所以停在 1.23.3,是因为 1.24 起删掉了 np.float、np.int 这些别名,自作主张升级会直接报错。
git clone https://github.com/AliaksandrSiarohin/first-order-model.git && cd first-order-model && pip install -r requirements.txt - 02
取 checkpoint,把驱动视频裁成人脸方图
作者把权重放在 Google Drive 和 Yandex Disk。vox-cpk.pth.tar 是 728.8MB、taichi-cpk.pth.tar 是 750.9MB——这个体积里装的是生成器、判别器、关键点检测器加三个优化器状态,纯推理只用得到其中约 228MB。驱动视频必须先裁成以人脸为中心的正方形,否则关键点会跑飞;仓库自带的 crop-video.py 会把该执行的 ffmpeg 命令直接打印出来,照抄即可。
python crop-video.py --inp driving_raw.mp4 - 03
跑 demo.py,而且一定要带上 --relative
这是新手翻车率最高的一步。demo.py 的 parser.set_defaults 把 relative 和 adapt_scale 都设成了 False,默认走绝对关键点坐标,输出会把驱动者的脸型一起搬过来,看着像换了个人。--relative 只迁移相对运动增量,--adapt_scale 用关键点凸包把运动幅度归一化到源图尺度,--find_best_frame 自动挑一帧与源图姿态最接近的作为起点。注意 face-alignment 并不在 requirements.txt 里,要单独装。
pip install face-alignment && python demo.py --config config/vox-256.yaml --checkpoint vox-cpk.pth.tar --source_image source.png --driving_video driving.mp4 --relative --adapt_scale --find_best_frame --result_video result.mp4 - 04
要么接超分出片,要么上多卡训自己的数据
所有官方权重输出都固定 256×256,想要能上线的成片必须接一级人脸修复或通用超分。训练自有数据则按官方命令走:vox-256.yaml 里 num_epochs=100、num_repeats=75、batch_size=40,用 DataParallel 配仓库自带的 sync_batchnorm,卡数直接写在 --device_ids 里,加几张改几个数字。
CUDA_VISIBLE_DEVICES=0,1,2,3 python run.py --config config/vox-256.yaml --device_ids 0,1,2,3
一支视频几分钱,复刻一次训练一百多美金
先算推理。RTX 3090 24GB 是 $0.193/卡·时,折成秒是 $0.193 ÷ 3600 ≈ $0.0000536/秒。开机、装依赖、下 728.8MB 的 vox-cpk.pth.tar、跑完一支 30 秒驱动视频,按 20 分钟封顶算:0.193 × (20 ÷ 60) = $0.064。想再省一档就换 Tesla V100 32GB:0.188 × (20 ÷ 60) = $0.063,而且它是 sm_70,torch 1.12.1 原生支持,省下的调环境时间比这几分钱值钱得多。 再算训练。复刻官方四卡配置:4 × RTX 4090 24GB = 4 × $0.540 = $2.160/时,以 72 小时为预算口径就是 2.160 × 72 = $155.52。换成单卡 RTX A6000 48GB 跑同样 72 小时是 0.817 × 72 = $58.82,便宜但吞吐低——合理的做法是先用单卡把配置和数据管线验通,再开多卡冲。 最后算存放。仓库加一组权重加裁好的数据集按 20GB 算,存储中位价 $0.414/GB·月,即 20 × 0.414 = $8.28/月;把 2GB 成片拉回本地,出网中位价 $0.0081/GB,2 × 0.0081 = $0.016。要提醒的是:算力费在实例停止的那一秒就停止计费,存储费会一直算到你把卷销毁为止,训练跑完记得清掉不要的数据。
04 —
