跳到主要内容

数字人与图像动画

FOMM 本地部署:一张静态图加一段驱动视频,2GB 显存就能动起来

First Order Motion Model 是 NeurIPS 2019 的一阶运动模型,MIT 协议、10 个自监督关键点、256×256 输出。推理权重合计只有 228MB,NexGPU 上 Tesla V100 32GB 每卡时 $0.188、RTX 3090 24GB 每卡时 $0.193,按秒计费,跑完即停。

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 —

从开机到出片:四步

命令全部来自官方仓库,没有改写,复制即用

  1. 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
  2. 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
  3. 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
  4. 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 —

常见问题

FOMM 本地部署到底需要多大显存?

推理侧非常轻。Qualcomm AI Hub 导出的 float ONNX 里,关键点检测器 54.2MB、生成器 174MB,合计约 228MB 权重,256×256 单帧推理的显存峰值稳定在 2GB 以内,随便一张 16GB 卡都富余。真正吃显存的是训练——官方 vox-256.yaml 的 batch_size=40,README 原话是这个 batch「is tuned to run on 2 or 4 Titan-X gpu」,也就是 24 到 48GB 的聚合显存起步。所以在 NexGPU 上推理挑 $0.188/卡·时 的 Tesla V100 32GB,训练挑 $0.817/卡·时 的 RTX A6000 48GB 或者四张 $0.540/卡·时 的 RTX 4090,都是按秒计费,验证完直接停机。

FOMM 只能出 256×256 吗?想做 1080p 数字人怎么办?

只能。vox、vox-adv、taichi、fashion、mgif、bair 这些官方 checkpoint 全部在 256×256 上训练,配置文件名里那个 -256 就是硬约束,没有官方高分辨率版本。实践中的做法是把 FOMM 当运动引擎,后面串一级人脸修复或通用超分(GFPGAN、CodeFormer、Real-ESRGAN 这一类)把 256 抬到 1024 甚至更高,运动的自然度归 FOMM,画质归超分。RTX 3090 24GB 的 $0.193/卡·时 足够让两个模型常驻同一张卡、中间不落盘;NexGPU 的 2000+ 预置镜像里 PyTorch、ComfyUI 都是现成的,串管线不用从头搭环境。

现在还值得用 FOMM 吗?还是直接上 LivePortrait 或 TPSMM?

分场景。要高质量人像口播、要口型和眼神重定向,直接上 LivePortrait(KwaiVGI,2024);关节类物体上,作者本人的 MRAA(CVPR 2021)和社区的 Thin-Plate Spline Motion Model(CVPR 2022,用薄板样条替换一阶仿射)都比 FOMM 强,官方 README 顶上那句「Check out our new paper」指的就是 MRAA。但 FOMM 依然是这条线上最干净的基线:MIT 协议、依赖只有十五个包、推理权重两百多兆、能驱动太极全身和机械臂这些人脸专用模型碰都碰不了的对象。做论文对照组、做教学复现、做非人脸驱动,它仍是第一选择。这四代模型可以在 NexGPU 同一台机器上依次装、依次比,实例一停算力就不计费。

vox-cpk.pth.tar 有 728MB,为什么说模型只有两百多兆?

因为 .pth.tar 是训练断点,不是推理权重。里面同时打包了生成器、判别器、关键点检测器,外加三个优化器的状态,所以 vox-cpk.pth.tar 728.8MB、taichi-cpk.pth.tar 750.9MB、fashion.pth.tar 750.8MB、bair-cpk.pth.tar 750.8MB 这几个文件体积几乎一模一样——差的那点根本不是模型容量的差别。demo.py 加载后实际只用 generator 和 kp_detector 两份,正对应 Qualcomm 那边导出的 174MB + 54.2MB。想给部署瘦身,加载后把这两个 state_dict 单独存出来就行。NexGPU 存储按 $0.414/GB·月 的中位价计,省下的每半个 G 一年都是钱。

按官方 requirements.txt 装完就报错,torch.load 和 numpy 全在报,怎么处理?

这是 2019 年的代码撞上今天的生态,三个典型点。第一,PyTorch 从 2.6 起把 torch.load 的 weights_only 默认改成 True,加载 FOMM 这种 pickle 断点会被直接拒掉,需要显式传 weights_only=False。第二,numpy 从 1.24 起删掉了 np.float、np.int 别名,官方把 numpy 钉在 1.23.3 就是这个原因,别顺手升级。第三,1.12.1 官方 wheel 编译的架构最高到 sm_86,RTX 4090(sm_89)、H100(sm_90)、RTX 5090(sm_120)都不在里面,要么升 torch 2.x,要么干脆挑一张 sm_70/sm_86 的卡。NexGPU 上 Tesla V100 32GB($0.188)、RTX 3090 24GB($0.193)、RTX A6000 48GB($0.817)都落在 1.12.1 的原生支持区间,开机就能跑,Telegram 上还有中英双语支持随时问。

生成出来的人怎么变成驱动视频里那个人了?

因为你没加 --relative。demo.py 的 parser.set_defaults 把 relative 和 adapt_scale 都设成了 False,默认走绝对关键点坐标,等于把驱动者的脸型直接搬到输出上,源图那张脸自然就不见了。正确姿势是 --relative --adapt_scale 一起加:前者只迁移相对运动增量,后者用关键点凸包把运动幅度归一化到源图的尺度。再叠一个 --find_best_frame,让它自动选一帧与源图姿态最接近的作为起点,效果还能再上一个台阶——但 face-alignment 不在 requirements.txt 里,要单独 pip install。这几个参数组合要反复试才能调到最好,NexGPU 按秒计费、无最低消费、不用申请配额,试错成本就是几分钱。

开始使用 NexGPU

无论你是企业研发团队还是独立开发者,都可以在几分钟内跑起第一个任务。

注册即可浏览全网实时价格,无需绑定支付方式。