什么是 Wan2.1 VACE?

Wan2.1 VACE 是 Wan2.1 的视频生成中的编辑用模型。

拥有将视频版的 ControlNet 和 inpainting / outpainting / reference2video 汇总在 1 个节点(WanVaceToVideo)那样的功能。

  • 对既有视频,用姿势和深度图“只控制动作”
  • 以 reference 图像为基础,替换角色或靠拢风格
  • 只对特定的领域进行 inpainting / outpainting
  • 生成视频的后续(Extension),或制作循环・中间画

可以以 Wan2.1 的生成品质处理这些事情。


推荐设定

  • 推荐分辨率
    • 720p 前后、且 16 的倍数
  • 最大帧数
    • 81 帧

模型的下载

Wan2.1 VACE 用,使用与通常的 T2V 模型不同的 VACE 专用 diffusion model。 这里只处理 14B。

📂ComfyUI/
└── 📂models/
    ├── 📂diffusion_models/
    │   └── wan2.1_vace_14B_fp16.safetensors
    ├── 📂text_encoders/
    │   └── umt5_xxl_fp8_e4m3fn_scaled.safetensors
    ├── 📂unet/
    │   └── Wan2.1_14B_VACE-XXXX.gguf   ← 仅在使用 gguf 时
    └── 📂vae/
        └── wan_2.1_vae.safetensors

基本构造

无论哪个模式,都是以 Wan2.1 text2video 为基础,添加 WanVaceToVideo 节点的形式为基本。

  • control_video
    • 姿势・深度图・scribble・optical_flow・layout 等的“引导视频”
  • control_masks
    • inpainting 用的掩膜
  • reference_image
    • 想传送角色或风格的参照图像

ControlNet 式的使用方法

使用姿势和深度图等,控制视频的动作。

Wan2.1_VACE_control_pose.json

1. 读取 Wan2.1 VACE 模型

  • Load Diffusion Model 读取 wan2.1_vace_14B_fp16.safetensors
  • 因为原样的话会相当使用 VRAM,所以将 dtype 切换为 fp8_e4m3fn,削减 VRAM 的使用量。

2. 视频的调整尺寸

  • ImageScaleToTotalPixels 缩小到适度的尺寸。
    • Wan 可以生成到 720p(1MP),但因为我的 PC VRAM 不足,所以设为 0.5MP。
  • Resize Image v2 裁剪为 16 的倍数。
    • 虽然也可以仅用这个节点凑齐 0.5MP,但为了区分处理的意图,做成了二段构成。

3. control_video 的制作和输入

  • OpenPose Pose 从视频制作火柴人的姿势视频。
  • 将其输入到 WanVaceToVideocontrol_video

reference2video

将 reference 图像的角色和风格,传送到视频。

Wan2.1_VACE_reference.json

1. 参照图像的预处理・输入

  • WanVaceToVideoreference_image,输入角色图像或插图。
    • 使用剪切背景并用白色填充的图像更容易安定。
    • 虽然说是 reference2video,但构造上,原样继承参照图像的位置关系。
    • 因此,生成的视频尺寸和参照图像最好相同,角色的位置和大小,也接近最终想放置的位置等预处理变得很重要。

2. 初期帧剪切

  • 在 reference2video 中,最初的数帧会输出“参照图像+生成结果重叠的帧”。
    • 虽然这就是 VACE 可以使用参照图像的机制本身,但这部分不需要。
    • 🟥 在 TrimVideoLatent,在 latent 的阶段剪切初期帧之后再导出视频。

空间的 inpainting

只替换视频的一部分。

Wan2.1_VACE_inpainting.json

1. 掩膜生成

  • 请用喜欢的方法制作掩膜。
  • 在这个工作流中用 Florence-2 检测汽车/车厢,将那个 BBOX 原样作为掩膜使用。

2. control_video 的制作

  • control_video,使用 将掩膜部分用灰色(RGB 127,127,127)填充的视频
  • ImageCompositeMasked 将掩膜部分涂满灰色。
  • WanVaceToVideo 节点,输入制作的 control_video 和掩膜。

时间的 outpainting(Extension)

拉伸视频的“时间方向”的是 Extension。 只使用输入视频的一部分帧,让 VACE 补全前面。

Wan2.1_VACE_Extension.json
  • 在这个工作流中,以输入视频的最后 5 帧为基础,生成前面的 72 帧(81 - 5)。

1. 取得最后 5 帧

  • 将输入视频一度倒转,只从开头抽出 5 帧。
  • 将那只有 5 帧的批次,再次倒转作为“原视频的最后 5 帧”使用。
  • 虽然想要稍微聪明一点的节点,但现状只有这个步骤。

2. control_video 和掩膜的制作

  • 虽然将 Extension 表现为 时间的 in/outpainting,但实际上,和刚才的空间的 inpainting 的工作流相似。
  • 制作想生成的帧数(这里是 72 帧)份的灰色图像,和覆盖其全域的掩膜。
    • 是将这个区间整个 inpainting 的印象。
  • WanVideo VACE Start To End Framekijai/ComfyUI-WanVideoWrapper) 制作这个,传递给 WanVaceToVideo。
    • 虽然只用核心节点也能构成,但节点数会激增,所以这里觉得老实依靠 Wrapper 节点比较好。

3. 将生成视频和原视频连接

  • 生成视频是“原视频 5 帧 + 生成的 72 帧”。
  • 这样原样和原视频连接的话会重复 5 帧。
  • 因此在 ImageFromBatch 节点切掉最初的 5 帧,连接到原视频的后面。

视频的循环化

抽出视频的最后数帧和最初数帧,使之 最后 → 最初 连接的话就能制作循环视频。 至今为止如果用 FLF2V 也确实能制作,但在 VACE 因为可以使用多个帧作为输入,所以能做成像是继承了视频流动的举动这点很有趣。

Wan2.1_VACE_Extension_loop.json
  • 加上上面的 Extension,也取得 最初的 5 帧
  • 将其输入到 WanVideo VACE Start To End Frameend_image
  • 虽然是否有效果要看情况,但也抽出第 1 帧作为 reference_image 使用。