掩码视觉动作的论文3——问题篇
文章目录
- 一、前言
- 二、问题
-
- 问题1:视频局部重绘?
- 1. 底层技术:视频扩散模型 + 潜空间拼接
- 2. 训练过程:随机掩码的视频补全(Masked Video Completion)
- 3. 推理过程:前向 vs 逆向的具体实现
- 4. 为什么你更常见到"关键点引导"而不是"掩码视频引导"?
- 5. 一句话总结技术实现
- 问题2:图像局部重绘也有好几种路线
- 1. 视频局部重绘 vs 图像局部重绘:核心差异
- 2. Masked Visual Actions 到底走哪条路线?
- 3. 为什么视频局部重绘少见?技术瓶颈在哪
- 4. 一句话总结:三条路线在视频领域的映射
- 5. 回答你最初的困惑
- 问题3:与图像局部重绘的区别和联系
- 与图像局部重绘(Inpainting)的核心联系
- 与图像局部重绘的本质区别
- 一句话总结区别与联系
- 问题4:Flux Fill图像局部重绘和视频局部重绘的区别
- 一、FLUX.1 Fill(图像局部重绘)的维度流
- 二、Masked Visual Actions(视频条件生成)的维度流
- 三、核心维度变化对比表
- 四、关键区别总结
- 问题5:Flux Fill和Masked Visual Actions的输入维度
- 一、FLUX Fill 的 token 到底各管什么?
- 二、Masked Visual Actions 的三路潜码分工
- 三、回答你的具体疑问
- 四、维度变化的核心差异(重新梳理)
- 五、一句话总结
- 问题6:两者是耦合关系怎么生成呢?
- 一、视频模型不是"纯2D"的——它从海量视频中学到了隐式3D物理
- 二、关键:Z_ref(首帧参考图)提供了3D场景的"空间锚点"
- 三、关于"输入不合理轨迹"——模型会忠实执行,而这正是评估价值
- 四、为什么这比你想象的更合理?
- 五、一句话总结
一、前言
仅供参考,未经实验验证。
项目主页:https://masked-visual-actions.github .io/
论文地址:https://arxiv.org/pdf/2607.19343
二、问题
问题1:视频局部重绘?
所以它是怎么实现这种预测的呢?我理解单帧如果给掩码的话是不是相当于图像的局部重绘?但是它似乎是给定一段带掩码的视频,那难道它的底层技术是视频局部重绘?但是我好像很少见到输入一段掩码视频,然后对视频进行局部重绘的技术?更多的是看见过输入姿态估计的关键点序列然后输出关键点引导的视频,就是我想知道它是怎么实现这种训练和推理的呢?
你的直觉很准——这本质上确实是视频局部重绘(Video Inpainting),但它不是传统意义上在像素空间"涂涂抹抹"的修复,而是基于视频扩散模型(Video Diffusion Model)在潜空间(Latent Space)里做的条件化生成。你之所以觉得少见,是因为过去视频生成的主流条件确实是稀疏信号(如姿态关键点、文本、深度图),而像素级掩码视频作为密集条件的玩法,在这篇论文之前确实不多见,但技术上是完全可行的。
下面我把它的训练和推理机制拆开讲清楚:
1. 底层技术:视频扩散模型 + 潜空间拼接
论文明确说了基座模型是 Wan-Fun-Control 2.2 14B(一个 140 亿参数的视频扩散模型),并且使用了**与视频模型相同的自编码器(Autoencoder)来编码掩码视频,然后用拼接(Concatenation)**作为条件机制。
训练时的数据流
原始完整视频 V ──→ VAE 编码 ──→ Latent_Z (潜空间特征)
掩码视频 M⊙V ──→ VAE 编码 ──→ Latent_M (潜空间特征)
参考图像 I₀ ──→ VAE 编码 ──→ Latent_I (潜空间特征)
输入模型: [Latent_M, Latent_I, 噪声] 拼接在一起
模型目标: 预测噪声,逐步去噪还原出 Latent_Z
关键点:
- 不在像素空间操作:VAE 把视频压缩到潜空间(通常是 4x8x8 的时空下采样),计算量可控。
- 拼接(Concatenation):把掩码视频的潜特征和噪声潜特征在通道维度上直接拼在一起输入 DiT/U-Net。因为掩码视频和输出视频是空间对齐的(像素一一对应),拼接是最自然的方式。
- 缺失区域填充:论文说掩码缺失区域设为统一灰色背景。在潜空间里,这对应一个固定的"空白"表示,模型训练时学会看到这种"空白"就脑补合理内容。
这和图像局部重绘(Stable Diffusion Inpainting)一模一样
如果你用过 Stable Diffusion 的 Inpainting(图生图局部重绘),原理几乎相同:
- 输入:原图 + 二值掩码(mask)
- 掩码区域:用灰色/噪声填充
- 模型:在潜空间里拼接掩码图和噪声,去噪生成
- 输出:掩码区域被合理补全,未掩码区域保持原样
这篇论文只是把这套逻辑从"单张图"扩展到了"一段视频":
- 掩码 M M M 是 T × H × W T \times H \times W T×H×W 的,即时空三维的(帧数 × 高 × 宽)
- 模型在潜空间里有时空注意力机制(Spatial-Temporal Attention),能保证补全的部分在时间上连贯、物理上合理
2. 训练过程:随机掩码的视频补全(Masked Video Completion)
论文说训练时"从掩码分布中采样 M M M",这其实就是Masked Video Modeling:
| 训练样本 | 输入(条件) | 目标输出 |
|---|---|---|
| 样本1 | 第1帧完整 + 机器人区域可见(其余灰色) | 完整视频 |
| 样本2 | 第1帧完整 + 杯子区域可见(其余灰色) | 完整视频 |
| 样本3 | 第1帧完整 + 随机时空块可见(其余灰色) | 完整视频 |
| 样本4 | 第1帧完整 + 只有边缘轮廓可见 | 完整视频 |
模型学到的能力:
- 不是"背下机器人关节角度和画面的映射"
- 而是"看到时空中的某些像素被固定,推断其余像素该怎么演化"
- 这本质上是在学习场景的联合概率分布 p ( V ) p(V) p(V),以及条件概率 p ( 缺失部分 ∣ 已知部分 ) p(\text{缺失部分} \mid \text{已知部分}) p(缺失部分∣已知部分)
3. 推理过程:前向 vs 逆向的具体实现
前向推理(Forward):“已知机器人,猜世界”
用户输入:
- 参考图像 I₀(第一帧完整照片)
- 掩码视频 M⊙V(只显示机器人轨迹,其余灰色)
模型执行:
1. 从纯噪声 Latent 开始
2. 每一步去噪时,把 [噪声, 掩码视频 Latent, 参考图 Latent] 拼一起输入模型
3. 模型逐步生成完整视频的 Latent
4. VAE 解码成像素视频
结果: 机器人动作完全遵循输入掩码,背景/物体被合理生成
逆向推理(Inverse):“已知杯子运动,猜机器人”
用户输入:
- 参考图像 I₀
- 掩码视频 M⊙V(只显示杯子轨迹,其余灰色)
模型执行: 同上,但条件变成了"杯子该怎么动"
模型输出: 一段完整视频,其中杯子遵循给定轨迹,机器人被"脑补"出来
后处理: 用逆动力学模型(IDM)从生成的机器人视频中提取关节角度
为什么逆向也能work?
因为在潜空间里,模型看到的不是"机器人像素"或"杯子像素"的语义标签,而是时空中的像素块运动模式。训练时它看过无数次"机器人动 → 杯子跟着动"的联合分布,所以当你只给"杯子动"时,它可以从联合分布中采样出最可能的机器人动作来补全。
4. 为什么你更常见到"关键点引导"而不是"掩码视频引导"?
| 技术路线 | 代表工作 | 条件形式 | 优缺点 |
|---|---|---|---|
| 关键点/姿态引导 | AnimateAnyone, ControlNet, OpenPose | 稀疏骨架图 | 轻量、可控、但丢失细节(接触、形变) |
| 深度/法向引导 | Video Depth Control | 每帧深度图 | 保留几何,但无语义 |
| 轨迹/光流引导 | MotionCtrl, Wan-Move | 稀疏轨迹点 | 指定大体运动,但不精确 |
| 掩码视频引导(本文) | Masked Visual Actions | 密集像素掩码 | 精确、像素对齐、但计算量大 |
掩码视频引导少见的原因:
- 数据成本高:需要精确的时空掩码(每帧每个像素都要标是/否),比标几个关键点难得多。
- 计算成本高:密集像素条件在潜空间里通道数多,拼接后输入规模大。
- 以前视频模型能力不够:直到 Wan 2.1、CogVideo 等大规模视频扩散模型出现,才有足够的上下文理解能力来做好视频 inpainting。
但这篇论文解决了数据问题:
- 用 Segment Anything 自动分割机器人(无需人工标注)
- 用 URDF 渲染生成任意轨迹的掩码(无需真实视频)
5. 一句话总结技术实现
它本质上就是"视频版的 Stable Diffusion Inpainting":在潜空间里把掩码视频和噪声拼接,用视频扩散模型逐帧去噪补全。前向推理时掩码贴在机器人身上(模型补全世界),逆向推理时掩码贴在物体身上(模型补全机器人)。之所以能实现,是因为大规模视频扩散模型在潜空间中通过时空注意力机制,学会了"给定部分时空像素,推断其余时空像素"的联合分布。
如果你熟悉 Diffusion 的代码,核心就等价于:
# 伪代码
masked_video_latent = vae.encode(masked_video) # [B, C, T, H, W]
ref_image_latent = vae.encode(ref_image) # [B, C, 1, H, W]
noise = randn_like(target_latent)
# 拼接条件
model_input = cat([noise, masked_video_latent, ref_image_latent], dim=1)
# 扩散去噪
predicted_noise = dit(model_input, timestep, text_emb)
# 目标:让 predicted_noise 接近真实噪声
问题2:图像局部重绘也有好几种路线
https://blog.csdn.net/shimingwang/article/details/160649139
图像局部重绘的三条技术路线:
| 路线 | 代表 | 核心机制 |
|---|---|---|
| A. 传统潜空间掩码 | SD Inpainting | 每步去噪后把原图潜码贴回mask外区域,mask不进入模型 |
| B. ControlNet式 | FLUX.1-dev-Controlnet-Inpainting | 训练旁路编码器,将[masked图, mask]编码成残差注入主模型 |
| C. 端到端原生 | FLUX.1 Fill / Kontext | 直接修改主模型架构(VAE/Transformer),让mask作为原生输入token参与联合注意力 |
你问的"视频局部重绘为什么少见",以及Masked Visual Actions到底怎么实现的,其实可以把图像这三条路线直接映射到视频维度来理解。下面我逐层拆解:
1. 视频局部重绘 vs 图像局部重绘:核心差异
| 维度 | 图像 Inpainting | 视频 Inpainting |
|---|---|---|
| 掩码维度 | M ∈ { 0 , 1 } H × W M \in \{0,1\}^{H \times W} M∈{0,1}H×W(2D) | M ∈ { 0 , 1 } T × H × W M \in \{0,1\}^{T \times H \times W} M∈{0,1}T×H×W(3D时空) |
| VAE编码 | 2D CNN下采样(空间) | 3D CNN(时空联合下采样,如Wan的VAE是 8 × 8 × 4 8\times8\times4 8×8×4) |
| 一致性要求 | 单帧边界自然即可 | 时序连贯(同一物体跨帧不能闪烁/变形) |
| 条件机制 | 拼接2D特征 | 拼接3D时空特征 |
| 计算量 | 一次前向 | 一次时空联合前向,显存爆炸 |
关键难点:视频不是"逐帧做图像inpainting"那么简单。如果你逐帧独立重绘,第1帧机器人手臂在左边,第2帧可能突然跳到右边——时序一致性会崩。所以视频局部重绘必须在潜空间的时空维度上联合建模,这要求基座模型本身就是视频扩散模型(Video Diffusion Model),有时空注意力机制(Spatial-Temporal Attention)。
2. Masked Visual Actions 到底走哪条路线?
训练时的数据流
原始完整视频 V ──→ 3D VAE编码 ──→ Z ∈ ℝ^(C×T×h×w) (潜空间时空特征)
掩码视频 M⊙V ──→ 3D VAE编码 ──→ Z_m ∈ ℝ^(C×T×h×w)
参考图像 I₀ ──→ 3D VAE编码 ──→ Z_i ∈ ℝ^(C×1×h×w) (只编码第1帧)
输入模型: [Z_noise, Z_m, Z_i] 在通道维度拼接
└── 注意这里是3D张量: (B, C+C+C, T, h, w)
模型目标: 预测噪声 ε,逐步去噪还原出 Z
与图像ControlNet-Inpainting的对比:
| 图像ControlNet-Inpainting | Masked Visual Actions(视频版) | |
|---|---|---|
| 条件输入 | concat[x_m, M] → [B,4,H,W] |
concat[Z_m, Z_i] → [B,2C,T,h,w] |
| 编码器 | 2D卷积旁路 | 3D时空卷积(与视频VAE共享) |
| 注入方式 | 残差注入Transformer block | 直接拼接输入(论文说"use concatenation as the conditioning mechanism") |
| mask缺失区填充 | 灰色背景 | 统一灰色背景(论文明确说) |
为什么用拼接而不是ControlNet的残差注入?
论文说得很清楚:
“Concatenation is appropriate as the conditioning signal is spatially aligned with the desired output video.”
因为掩码视频和输出视频是像素级时空对齐的,直接拼接是最自然的。图像ControlNet用残差注入是因为条件(如Canny边缘)和输出不完全同域;但这里条件就是视频本身的一部分,拼接即可。
3. 为什么视频局部重绘少见?技术瓶颈在哪
结合博客和论文,视频局部重绘(Video Inpainting)罕见的原因可以归纳为三座大山:
瓶颈1:数据构造难
图像inpainting的训练数据很简单:随便找张图,随机涂块黑色,让模型补全。
视频inpainting的训练数据需要:
- 精确的时空掩码:每帧每个像素都要知道是/否属于机器人
- 物理一致性:mask区域在时序上要对应同一物体的运动轨迹
论文解决方式:
- 分割法:用SAM(Segment Anything)自动分割视频中的机器人,但"被遮挡区域会泄露原视频信息"
- 渲染法:用URDF+相机标定渲染机器人3D网格,生成纯合成的掩码视频,避免信息泄露
这比图像inpainting的数据构造复杂一个数量级。
瓶颈2:基座模型能力门槛
图像局部重绘可以用SD 1.5/FLUX等成熟模型+ControlNet插件搞定。
视频局部重绘要求基座模型必须:
- 原生支持3D时空注意力(不是逐帧2D注意力)
- 足够大的上下文窗口(能同时处理多帧)
- 对物理动态有先验(知道物体怎么动、怎么接触)
直到2024-2025年,Wan 2.1、CogVideoX、Sora等大规模视频扩散模型成熟后,视频inpainting才变得可行。论文用的Wan-Fun-Control 2.2 14B就是这样的基座。
瓶颈3:推理方向的灵活性(这是论文独有的)
图像inpainting通常只是"给定mask补全内容",方向固定。
但Masked Visual Actions要求同一个模型:
- 前向:mask贴机器人 → 补全物体运动
- 逆向:mask贴物体 → 补全机器人运动
这要求模型学的不是"mask→内容"的映射,而是**"联合分布中条件采样"的能力。图像局部重绘训练时只学了"给定mask图补全画面",你让它反过来"给定画面补全mask"它是不会的。但论文的模型通过像素级时空掩码条件**,在潜空间里学的是所有实体轨迹的联合分布,所以方向可以任意切换。
4. 一句话总结:三条路线在视频领域的映射
| 图像路线 | 视频对应 | 是否可行 | 代表工作 |
|---|---|---|---|
| A. 传统潜空间混合 | 每步去噪后把原视频潜码贴回mask外 | ✅ 可行但质量差 | 早期视频修复(如STTN) |
| B. ControlNet残差注入 | 训练时空ControlNet旁路 | ✅ 可行但训练贵 | 论文Masked Visual Actions的简化版 |
| C. 端到端原生 | 修改视频VAE/Transformer,让mask作为原生token | ✅ 最优但需从头训练 | 论文实际走的路线(基于Wan端到端微调) |
Masked Visual Actions本质上属于"路线C":它不是外挂ControlNet,而是直接对Wan 2.2 14B做LoRA端到端微调(rank 256),让模型原生学会"读取时空掩码视频 → 生成补全视频"。这类似于FLUX.1 Fill是"原生inpainting模型"而不是"SD+ControlNet插件"。
5. 回答你最初的困惑
“我很少见到输入一段掩码视频,然后对视频进行局部重绘的技术?”
你的观察完全正确。 视频局部重绘确实比图像局部重绘少见得多,原因:
- 数据难造(需要精确时空mask)
- 模型门槛高(需要3D时空VAE+DiT)
- 应用场景窄(直到机器人世界建模这类需求出现,才需要"视频作为动作接口")
Masked Visual Actions的创新性恰恰在于:它把"视频局部重绘"这个冷门技术,重新包装成了机器人控制的核心接口——掩码视频不是用于"修复画面",而是用于表达动作意图。这是从"视频修复工具"到"机器人世界模型"的范式跃迁。
问题3:与图像局部重绘的区别和联系
看论文 4.2 Model implementation and training 原文:
“We use Wan-Fun-Control 2.2 14B [63] as the base model. We encode the masked conditioning video using the same autoencoder as the video model and use concatenation as the conditioning mechanism… Instead of finetuning the entire model, we use LoRA finetuning with rank 256…”
这三句话决定了它的技术路线:
| 特征 | 论文方法 | 对应哪条路线 |
|---|---|---|
| 条件如何编码 | 用视频模型自身的VAE编码掩码视频 | 原生输入,非外挂 |
| 条件如何进入模型 | **拼接(Concatenation)**到潜空间输入 | 直接输入,非旁路残差 |
| 模型如何训练 | LoRA微调主模型(rank 256) | 轻量修改主模型权重 |
结论:它既不是路线A(后处理混合),也不是路线B(ControlNet旁路冻结)。它属于路线C(端到端原生条件化)的轻量实现——直接改造主模型的输入接口,让掩码视频作为原生条件token进入Transformer,只是用LoRA代替全量微调来节省算力。
与图像局部重绘(Inpainting)的核心联系
论文方法确实脱胎于图像局部重绘的思想,联系体现在三个层面:
1. 数学本质相同:都是条件概率建模
图像Inpainting:
p ( 缺失像素 ∣ 已知像素 , 掩码 ) p(\text{缺失像素} \mid \text{已知像素}, \text{掩码}) p(缺失像素∣已知像素,掩码)
论文Masked Visual Actions:
p θ ( V ∣ M ⊙ V , I 0 ) p_\theta(V \mid M \odot V, I_0) pθ(V∣M⊙V,I0)
联系:两者都是在学习"给定部分观测,推断完整数据"的条件分布。掩码 M M M 的作用完全一致——告诉模型"哪里是已知的,哪里需要生成"。
2. 训练范式相同:都是Masked Completion
图像Inpainting训练:随机mask图像区域,模型学习补全。
论文训练:随机mask视频中的实体轨迹,模型学习补全整个视频。
联系:都是自监督的"填空"训练。只不过图像填的是空间像素,视频填的是时空像素。
3. 缺失区域填充策略相同
论文说:
“For the missing region from the masked conditioning, we set it to a uniform gray background.”
这正是图像Inpainting(包括Stable Diffusion Inpainting)的标准做法:mask区域用灰色/噪声填充,作为"待生成"的占位符。
与图像局部重绘的本质区别
虽然思想同源,但论文不是简单把图像Inpainting扩展到视频,而是在四个关键维度上发生了质变:
区别1:条件维度从"空间2D"跃迁到"时空3D"
| 图像Inpainting | 论文方法 | |
|---|---|---|
| 掩码维度 | M ∈ { 0 , 1 } H × W M \in \{0,1\}^{H \times W} M∈{0,1}H×W(平面) | M ∈ { 0 , 1 } T × H × W M \in \{0,1\}^{T \times H \times W} M∈{0,1}T×H×W(时空体) |
| VAE编码 | 2D CNN,下采样空间 | 3D时空CNN(Wan的VAE是 8 × 8 × 4 8\times8\times4 8×8×4时空压缩) |
| 注意力机制 | 空间自注意力 | 时空联合注意力(Spatial-Temporal Attention) |
关键差异:图像Inpainting只需保证"补全区域边界自然";论文方法必须保证跨帧时序连贯——机器人手臂在第1帧mask的位置和第10帧mask的位置必须在物理上连续,不能闪烁或跳变。这要求基座模型(Wan 2.2)具备原生时空建模能力,不是逐帧做图像Inpainting能比的。
区别2:条件对象从"随机区域"变为"语义实体"
图像Inpainting的mask通常是随机矩形/不规则区域(如涂掉人脸、涂掉背景物体),mask本身没有语义。
论文的mask是语义实体的时空轨迹:
- 前向任务:mask覆盖的是机器人手臂在所有帧中的像素区域
- 逆向任务:mask覆盖的是杯子在所有帧中的像素区域
关键差异:图像Inpainting的mask是"空间位置",论文的mask是"物理实体在时空中的运动管道"。模型不仅要补全像素,还要补全物理交互的因果链条。
区别3:从"修复工具"到"动作接口"
这是最大的范式区别:
| 图像Inpainting | 论文方法 | |
|---|---|---|
| 目的 | 修复画面、移除物体、补全背景 | 表达动作意图、控制物理世界 |
| 输入语义 | “这块区域坏了,请重画” | “机器人手臂要这样动,请推断世界如何响应” |
| 输出用途 | 给人看的图片 | 给机器人决策用的世界模型推演 |
| 双向性 | 单向:给定mask补内容 | 双向:mask贴机器人→前向预测;mask贴物体→逆向反推动作 |
图像Inpainting是被动修复,论文方法是主动控制。掩码视频在这里不是"损坏待修复的输入",而是控制信号——相当于把动作指令直接画在了像素时空上。
区别4:从"固定方向"到"双向统一"
图像Inpainting只有一个方向:给定mask→生成内容。
论文实现了同一个模型的双向推理:
- 前向: S = A \mathcal{S} = \mathcal{A} S=A(mask主动实体/机器人)→ 预测被动实体(物体)
- 逆向: S = P \mathcal{S} = \mathcal{P} S=P(mask被动实体/物体)→ 预测主动实体(机器人)
图像Inpainting训练时只学了"给定mask补全画面",你让它反过来"给定画面推断mask"它是不会的。但论文的模型通过像素级时空掩码在潜空间中学习了所有实体轨迹的联合分布,所以方向可以任意切换。
技术根源:图像Inpainting的条件是"缺失区域的位置",论文的条件是"某个实体在时空中的确定轨迹"。前者是空间约束,后者是物理约束——模型学到的是"实体A动了,实体B该怎么跟着动"的物理关系,这种关系是对称的,所以能双向推理。
一句话总结区别与联系
联系:论文方法在数学内核上就是"视频版的局部重绘"——用掩码告诉模型"哪里已知、哪里待生成",通过潜空间去噪补全缺失的时空区域。
区别:图像局部重绘是"修复画面缺陷"的工具,掩码是随机空间区域;论文方法是"控制物理世界"的接口,掩码是语义实体的运动轨迹,且依托大规模视频扩散模型的时空联合注意力,实现了传统图像Inpainting不可能做到的双向物理推理(前向预测+逆向反推)。
所以论文的创新不在于发明了新的视频Inpainting技术,而在于把视频Inpainting重新定义为机器人动作的统一接口——这是从"视觉修复工具"到"物理世界模型"的范式跃迁。
问题4:Flux Fill图像局部重绘和视频局部重绘的区别
梳理两者在像素空间→潜空间→DiT→输出全链路的维度变化。
一、FLUX.1 Fill(图像局部重绘)的维度流
官方来源:Black Forest Labs GitHub 官方文档 + PosBridge 等学术论文对 FLUX Fill 输入表示的逆向分析。
1. 像素空间输入
背景图 I (已 mask): [B, 3, H, W] # mask 区域已填灰/黑/噪声
二值掩码 M: [B, 1, H, W] # 白=编辑区域, 黑=保留区域
文本 prompt: "a woman in pink shirt"
2. 潜空间预处理(分辨率 H/16 × W/16)
FLUX Fill 没有修改 VAE 输入通道,而是将 mask 和图像分别处理后在潜空间拼接:
| Token 类型 | 来源 | 维度 | 说明 |
|---|---|---|---|
| noise_token | 高斯噪声 | [B, 64, H/16, W/16] |
与图像token同分辨率 |
| image_token | VAE_Encode(I) |
[B, 64, H/16, W/16] |
标准 2D VAE 编码 masked 背景 |
| mask_token | Flatten(M, stride=16) |
[B, 256, H/16, W/16] |
二值 mask 下采样 16×16,256通道 |
拼接 + 投影:
concat[noise_token, image_token, mask_token]
→ [B, 64+64+256, H/16, W/16] = [B, 384, H/16, W/16]
Linear_Projection:
→ [B, 3072, H/16, W/16] # 投影到 DiT hidden dim
展平为图像 token 序列:
→ [B, (H/16)×(W/16), 3072]
3. DiT 输入(单一 MMDiT)
图像 token: [B, L_img, 3072] # L_img = (H/16)×(W/16)
文本 token: [B, 77, 3072] # T5-XXL + CLIP 编码
MMDiT 联合注意力(文本↔图像 token 互相 attention)
4. 输出
DiT 输出: [B, L_img, 3072]
↓ 反展平 + VAE Decode(2D)
输出图像: [B, 3, H, W]
二、Masked Visual Actions(视频条件生成)的维度流
来源:论文 4.2 节 + 官方代码仓库(infer.py 使用 Wan2.2-Fun-A14B-Control)。
1. 像素空间输入
control_video (masked): [B, 3, T, H, W] # mask 外=机器人渲染/分割, mask 内=统一灰色
reference_image I₀: [B, 3, H, W] # 初始场景第一帧(真实照片)
文本 prompt: "a robot arm picks up a mug"
关键:这里没有显式的二值 mask 图输入。mask 信息通过"灰色背景"的像素值隐式编码,经 3D VAE 压缩后由 LoRA 教会模型识别。
2. 3D VAE 编码(Wan2.2,时空压缩 8×8×4)
Z_cond = VAE(control_video) # [B, 16, T/4, H/8, W/8] 时间压缩4×, 空间压缩8×
Z_ref = VAE(I₀) # [B, 16, 1, H/8, W/8]
# 复制/插值到 T/4 帧 → [B, 16, T/4, H/8, W/8]
Z_noise = randn # [B, 16, T/4, H/8, W/8]
3. 潜空间拼接(Concatenation)
论文明确说使用 concatenation 作为条件机制:
concat[Z_noise, Z_cond, Z_ref]
→ [B, 16+16+16, T/4, H/8, W/8] = [B, 48, T/4, H/8, W/8]
4. 展平为时空 Token(Two-Expert MoE)
展平为时空 token:
→ [B, (T/4)×(H/8)×(W/8), D] # D = DiT hidden dim
加上 3D 时空位置编码 (x, y, t)
进入 Wan2.2-Fun-A14B-Control(Two-Expert MoE):
- Expert 1 (High-Noise, t > 0.358T): pipe.dit + LoRA-High (rank 256)
- Expert 2 (Low-Noise, t ≤ 0.358T): pipe.dit2 + LoRA-Low (rank 256)
时空联合注意力(Spatial-Temporal Attention):
- 每个 token 能看到同帧空间位置 + 其他帧时间位置
5. 输出
DiT 输出: [B, L, D]
↓ 反展平 + 3D VAE Decode(时空联合解码)
输出视频: [B, 3, T, H, W]
三、核心维度变化对比表
| 维度阶段 | FLUX.1 Fill(图像 Inpainting) | Masked Visual Actions(视频控制) |
|---|---|---|
| 输入像素 | 单帧 [B, 3, H, W] + 单帧 mask [B, 1, H, W] |
视频 [B, 3, T, H, W] + 参考帧 [B, 3, H, W] |
| Mask 输入 | 显式二值 mask 图(单独输入) | 无显式 mask 图,mask 信息通过灰色背景隐式编码 |
| VAE 类型 | 2D VAE(仅空间压缩 8×) | 3D 时空 VAE(Wan2.2,空间 8× + 时间 4×) |
| 潜空间分辨率 | H/16 × W/16(仅 2D 空间) |
T/4 × H/8 × W/8(4D 时空张量) |
| 潜空间条件表示 | 三 token 拼接:noise_token(64ch) + image_token(64ch) + mask_token(256ch)→ [B, 384, H/16, W/16] → Linear → 3072 |
三视频潜码拼接:Z_noise(16ch) + Z_cond(16ch) + Z_ref(16ch)→ [B, 48, T/4, H/8, W/8] |
| 条件注入深度 | 潜空间投影后展平为 token,与文本 token 一起进入 MMDiT | 潜空间直接通道拼接,展平为时空联合 token 进入 DiT |
| 位置编码 | 2D 空间位置编码 | 3D 时空位置编码(x, y, t) |
| 模型架构 | 单一 MMDiT | Two-Expert MoE(High/Low Noise 各一个 DiT) |
| 微调方式 | 官方未披露(推测全量训练专用模型) | LoRA rank 256(两个 Expert 各一个 LoRA) |
| 注意力机制 | 空间 Self-Attention + Cross-Attention(文本↔图像) | 时空联合 Attention(Space-Time Attention,跨帧关联) |
| 输出 | 单帧 [B, 3, H, W] |
视频 [B, 3, T, H, W] |
四、关键区别总结
1. Mask 的"存在感"不同
- FLUX Fill:mask 是显式的一等公民,有独立的 256 通道
mask_token,模型明确知道"哪里要重绘"。 - MVA:没有 mask token,mask 边界信息完全靠"灰色像素"在 3D VAE 压缩后的特征模式被 LoRA 识别。这能work是因为训练数据始终遵循"mask 内 = 统一灰色"的约定。
2. 潜空间维度从"平面"到"时空体"
- FLUX Fill:所有张量在潜空间是 3D(通道 × 高 × 宽),注意力在单帧的
(H/16)×(W/16)个 token 上做。 - MVA:潜空间是 4D(通道 × 时间 × 高 × 宽),注意力在
(T/4)×(H/8)×(W/8)个时空 token 上做。这意味着模型生成第 5 帧的机器人手臂时,直接 attend 到第 1-4 帧的手臂位置来保证物理连贯,而不是逐帧独立生成。
3. 条件与噪声的"对齐粒度"不同
- FLUX Fill:
image_token和mask_token是不同分辨率/语义的(一个是 VAE 特征,一个是 binary 下采样),需要 Linear Projection 强行对齐到 3072 维。 - MVA:
Z_noise、Z_cond、Z_ref是同构的 4D 时空张量(都是 16 通道、同分辨率),直接在通道维度拼接即可,无需额外投影——因为条件视频和输出视频是像素级时空对齐的。
4. 模型架构的"分裂"不同
- FLUX Fill:单一 MMDiT,一套参数处理所有去噪步。
- MVA:Two-Expert MoE,去噪前期(高噪声)和后期(低噪声)由两个不同的 DiT Expert 处理,各配一个 LoRA。这是 Wan2.2-Fun-Control 基座自带的架构,不是图像 Inpainting 领域常见的做法。
一句话:两者在像素空间的操作看起来都是"mask + 拼接",但 FLUX Fill 是在2D 潜空间里用显式 mask token做单帧填空,而 MVA 是在4D 时空潜空间里用隐式灰色背景做视频填空,且依托 Two-Expert MoE 和时空联合注意力实现跨帧物理连贯。维度上是从"平面 3D 张量"到"时空 4D 张量"的跃迁。
问题5:Flux Fill和Masked Visual Actions的输入维度
你的意思是Flux Fill这个image_token实际上是原图转换到潜空间,然后这个noise_token就是掩码区域加噪的,背景上下文就是没加噪的,但都是在潜空间,然后mask_token就是整个mask转到潜空间,这里确实古怪,按理说noise_token既然已经将掩码区域加噪声,非掩码区域没加噪声,作为上下文信息,那其实已经有掩码引导信息了,这个mask_token还要输入进来作为拼接的一部分。再看Masked Visual Actions,这个Z_noise应该对应于noise_token,应该也是有个上下文背景+掩码区域加噪吧?Z_cond这个是什么?Z_ref又是什么?首帧原图?这还挺奇怪的,如果说在图像局部重绘中是以上下文背景作为引导生成掩码部分内容,那视频里面用首帧原图作为引导生成后面的内容,倒也说的过去,但如果把Z_ref类比为图像局部重绘中noise_token的上下文背景的作用,那Masked Visual Actions的Z_noise里面的上下文背景又是起到什么作用?难道说它是起到单帧图像的上下文引导作用,而Z_ref是视频的上下文引导作用?好像也说得通,但这个Z_cond是啥呢?
你的困惑非常精准,触及了两者在条件分工上的本质差异。让我先把 FLUX Fill 的 token 设计重新拆解,再对比 MVA 的三路潜码,你就明白了。
一、FLUX Fill 的 token 到底各管什么?
先纠正一个可能的误解:FLUX Fill 的 noise_token 不是"只在 mask 区域加噪、非 mask 区域保留原图"。它是覆盖全图的高斯噪声(64 通道),和 image_token 是并行的两路输入。
| Token | 维度 | 内容 | 职责 |
|---|---|---|---|
noise_token |
[B, 64, H/16, W/16] |
纯噪声(全图覆盖) | 待生成的变量,扩散去噪的起点 |
image_token |
[B, 64, H/16, W/16] |
VAE 编码的 masked 背景(mask 区域已填灰/黑) | 上下文 + 控制信号(非 mask 区域是原图,mask 区域是灰色占位) |
mask_token |
[B, 256, H/16, W/16] |
二值 mask 下采样 16×16 | 消除歧义:告诉模型"哪些是 image_token 中的真实像素,哪些是灰色占位符" |
为什么需要显式的 mask_token?
image_token 的 mask 区域是灰色,但 VAE 编码后,模型无法可靠区分:
- “这是 mask 区域(应该生成)”
- “这是真实的灰色物体(应该保留)”
比如原图里本来就有一面灰色墙壁,VAE 编码后的特征和"mask 填灰"可能非常相似。所以必须单独输入 mask_token 作为显式指示器。
关键洞察
FLUX Fill 的 image_token 是**“身兼两职”**的:
- 非 mask 区域 → 提供上下文(背景应该长什么样)
- mask 区域 → 提供控制信号(这里要重绘,灰色占位)
但它有个局限:image_token 只能描述单帧的上下文。因为图像 inpainting 不需要跨帧信息,单帧的 masked 背景就是全部上下文。
二、Masked Visual Actions 的三路潜码分工
现在看 MVA 的 Z_noise、Z_cond、Z_ref,你会发现它把 FLUX Fill 中"身兼两职"的 image_token 拆成了两路,并且升级到了时空维度。
| 潜码 | 维度 | 内容 | 对应 FLUX Fill 的什么? | 职责 |
|---|---|---|---|---|
Z_noise |
[B, 16, T', h, w] |
纯噪声(全时空体覆盖) | noise_token |
待生成的变量,扩散去噪的起点 |
Z_cond |
[B, 16, T', h, w] |
VAE 编码的 control video(mask 外=机器人,mask 内=统一灰色) | image_token 的控制信号部分 |
硬条件:机器人在时空中的轨迹(mask 外像素确定,mask 内灰色占位) |
Z_ref |
[B, 16, T', h, w] |
VAE 编码的 reference image(首帧完整场景)复制到 T’ 帧 | image_token 的上下文部分 |
软条件/上下文:场景一开始长什么样,提供外观先验 |
为什么 MVA 需要把"控制"和"上下文"拆成两路?
因为视频和单帧图像有本质区别:
FLUX Fill(单帧):
- 非 mask 区域 = 背景(上下文)
- mask 区域 = 待生成
- 两者在同一帧里,一个
image_token就能表达。
MVA(视频):
Z_cond的 mask 外是机器人,mask 内是灰色(场景被抹掉了)- 如果只用
Z_cond,模型知道"机器人该怎么动",但不知道场景长什么样(因为场景像素被 mask 成灰色了) - 所以需要
Z_ref(首帧完整场景)来补充:“这是你的初始舞台,请保持它的一致性”
换句话说:
Z_cond管的是**“动作/轨迹”**(机器人时空管道)Z_ref管的是**“外观/场景”**(首帧背景长什么样)Z_noise管的是**“生成过程”**(从噪声中逐步还原)
三、回答你的具体疑问
1. “noise_token 已经有 mask 引导信息了,为什么还要 mask_token?”
noise_token 没有 mask 引导信息。在 FLUX Fill 中,noise_token 是纯噪声(全图覆盖),它不包含任何原图信息。原图信息在 image_token 里。
但 image_token 有个歧义问题:mask 区域的灰色 VAE 编码后,可能和真实灰色物体混淆。所以 mask_token 是必不可少的显式指示器。
2. “Z_noise 对应 noise_token,那 Z_noise 里的上下文背景起什么作用?”
Z_noise 里没有上下文背景。它是纯噪声,和 FLUX Fill 的 noise_token 一样。
MVA 的上下文是由 Z_ref 提供的,不是由 Z_noise 提供。
3. “Z_ref 类比为 image_token 的上下文部分,Z_cond 类比为 image_token 的控制部分?”
完全正确。这就是最精准的类比:
| FLUX Fill(单帧,身兼两职) | MVA(视频,拆分为两路) |
|---|---|
image_token(非 mask 区域)= 上下文 |
Z_ref(首帧完整场景)= 上下文 |
image_token(mask 区域灰色)= 控制/占位 |
Z_cond(mask 内灰色)= 控制/占位 |
noise_token = 纯噪声 |
Z_noise = 纯噪声 |
mask_token = 显式 mask 指示 |
无显式 mask token(靠灰色背景 + LoRA 隐式识别) |
4. “Z_cond 到底是什么?”
Z_cond 是掩码后的控制视频在潜空间的表示。它的像素空间定义是:
control_video[t, h, w] =
robot_pixel[t, h, w] 如果 (t,h,w) 属于机器人轨迹(mask 外)
gray_color 如果 (t,h,w) 不属于机器人轨迹(mask 内)
所以 Z_cond 告诉模型的是:
- 时空管道内(mask 外):机器人手臂在这里、这样动,你必须严格遵循
- 时空管道外(mask 内):这里是灰色,请你自由生成(场景对机器人的响应)
5. “Z_ref 为什么是必要的?”
假设没有 Z_ref,只有 Z_cond:
Z_cond的 mask 外是机器人,mask 内是灰色- 模型知道"机器人从 A 移动到 B",但不知道"背景是厨房还是实验室"
- 生成的场景可能是随机的、不连贯的
Z_ref 提供首帧的完整场景外观,让模型知道:
- 桌子是木质的、杯子是红色的、背景有窗户
- 在后续帧中保持这些外观的一致性
四、维度变化的核心差异(重新梳理)
| 阶段 | FLUX Fill(单帧) | Masked Visual Actions(视频) |
|---|---|---|
| 待生成变量 | noise_token [B,64,H/16,W/16] |
Z_noise [B,16,T',h,w] |
| 控制信号 | image_token(mask 区域灰色占位) |
Z_cond [B,16,T',h,w](mask 区域灰色占位) |
| 上下文/外观 | image_token(非 mask 区域原图) |
Z_ref [B,16,T',h,w](首帧完整场景复制) |
| 显式 mask 指示 | mask_token [B,256,H/16,W/16] |
无(靠 LoRA 从灰色背景隐式识别) |
| 拼接方式 | 三 token 通道拼接 → Linear → 3072 | 三潜码通道拼接 → 直接进 DiT(48ch) |
| 条件与噪声关系 | 并行输入 DiT | 并行输入 DiT |
五、一句话总结
FLUX Fill 的
image_token在单帧里"身兼两职"(既提供上下文背景,又提供 mask 控制),所以需要mask_token来消除歧义;MVA 把这两职拆成了Z_ref(首帧外观上下文)和Z_cond(机器人轨迹控制),因为视频的上下文(首帧场景)和控制信号(多帧机器人轨迹)在时空维度上天然分离。两者都是三路输入,但 FLUX Fill 的第三路是显式 mask 指示,MVA 的第三路是首帧参考图像。
问题6:两者是耦合关系怎么生成呢?
但我有个问题,我们知道比如机械臂的手指拿杯子的时候,实际上机械臂的手指和杯子是一个握与被握的关系,也就是说在视频看来两者是二维的耦合关系,而实际上理解他们的关系要三维的理解,而现在如果将机械臂的手作为动作条件进行引导输入生成视频,它怎么能生成这种耦合关系的视频呢?或者说你从一开始怎么输入一个避开杯子的“动作条件引导掩码视频”
这是一个非常核心的问题,触及了**“2D像素条件如何约束3D物理交互”**的本质。答案分三个层面:视频模型到底有没有3D理解?参考帧如何提供空间锚点?以及"不合理轨迹"输入进去会怎样?
一、视频模型不是"纯2D"的——它从海量视频中学到了隐式3D物理
虽然输入输出是2D像素,但像Wan 2.2这种在数十亿视频上训练的模型,已经隐式编码了丰富的3D物理先验:
| 2D像素表现 | 模型学到的隐式3D理解 |
|---|---|
| 手指从杯身前划过,杯子部分被遮挡 | 深度与遮挡关系:手指在杯子前面(z轴更近) |
| 手指闭合时杯子随之升起 | 接触与抓取:闭合+接触=杯子被握持 |
| 手指从杯子把手内侧穿过 | 空间几何:把手有孔洞,手指可穿过 |
| 不同视角下同一抓取姿态 | 3D一致性:同一物理动作在不同投影下表现不同 |
论文引言明确说:
“Video models absorb rich priors over how the visual world moves, interacts, and responds to contact…”
这不是靠显式3D建模(如点云、深度图),而是靠时空联合注意力在潜空间中建立了"像素A靠近像素B时,应该产生怎样的像素变化"的关联。你可以把它理解为**“3D物理在2D图像流形上的投影”**。
二、关键:Z_ref(首帧参考图)提供了3D场景的"空间锚点"
你问"怎么输入避开杯子的动作条件"——这里有一个关键设计:掩码条件(Z_cond)只告诉模型"机器人该怎么动",但杯子在哪、长什么样,是由 Z_ref(首帧完整图像)提供的。
具体耦合机制
输入:
Z_ref: 首帧完整图像 → 模型看到"杯子在桌角,把手朝左"
Z_cond: 机器人手指轨迹(时空管道)→ 模型看到"手指要从上方靠近"
潜空间中的关联(时空注意力):
首帧杯子区域 token ──┐
├──→ 注意力权重学习"靠近+闭合=握住"
第5帧手指区域 token ──┘
└──→ 模型生成"手指从把手内侧穿过,杯身被遮挡"
模型不是"凭空想象"手指和杯子的关系,而是:
- Z_ref 在首帧编码了杯子的外观、位置、形状(虽然以2D图像形式)
- Z_cond 在后续帧编码了手指的时空轨迹(硬约束:手指必须出现在这里)
- DiT的时空注意力在潜空间关联两者:"第5帧手指token的空间位置"与"首帧杯子把手token的空间位置"存在几何关系
- 模型从训练数据中学会了这种关联的合理2D投影(手指怎么绕过杯子、哪些像素应该被遮挡)
三、关于"输入不合理轨迹"——模型会忠实执行,而这正是评估价值
你问:“如果输入的掩码轨迹直接穿过杯子,模型怎么办?”
答案是:模型会忠实遵循掩码条件,生成"手指穿过杯子"的视频。 但这恰恰是论文设计的一部分:
在Planning中的应用(论文5.2节)
流程:
1. 策略(Diffusion Policy)采样10条候选轨迹
2. 每条轨迹渲染成掩码视频(Z_cond)输入模型
3. 模型生成10段预测视频
4. VLM Judge(Gemini)评估哪段视频最合理
如果某条轨迹穿过杯子:
→ 模型生成"手指穿模/杯子没动"的视频
→ VLM Judge 判定"物理不真实/任务失败"
→ 该轨迹被淘汰
掩码条件是硬约束(模型必须让手指出现在指定像素位置),但模型通过Z_ref知道杯子在哪,所以不合理的轨迹会表现为不真实的物理现象(穿模、无接触却移动),这正好被用作负样本信号。
在Forward Modeling中(前向预测)
如果输入的掩码轨迹是真实/物理合理的(比如从DROID数据集或URDF渲染得到),模型就生成合理的耦合视频:
- 手指靠近 → 生成接触阴影
- 手指闭合 → 生成杯子被握持、随手臂移动
- 手指位置偏差 → 生成打滑/失败
四、为什么这比你想象的更合理?
传统方法(如Ctrl-World)输入的是低维关节角度,模型必须自己学习"关节角度→3D空间位置→2D像素投影"的映射,这确实很难。
但Masked Visual Actions输入的是像素级轨迹(Z_cond),模型不需要做3D到2D的投影推理——条件本身就是2D投影后的轨迹。模型只需要学会:
“给定这些2D像素在未来帧中的位置,以及首帧场景的3D布局(Z_ref),生成合理的中间帧像素过渡”
这类似于人类画家的工作方式:画家不需要在脑子里建立杯子的3D CAD模型,只需要知道"手指在这个2D位置时,应该画出遮挡、阴影和接触变形"。
五、一句话总结
掩码条件(Z_cond)只约束"手指在2D时空中的像素轨迹",杯子信息来自首帧(Z_ref)。大规模视频模型通过时空注意力在潜空间中隐式关联了"手指像素"与"杯子像素"的3D关系(深度、遮挡、接触),从而生成合理的耦合视频。如果输入轨迹本身不合理(穿过杯子),模型会忠实生成穿模视频,而这正好被VLM Judge识别为坏轨迹——这正是Planning中"想多步再选"的价值所在。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)