DMD 要一个昂贵的回归项、只能一步、画质还差口气。
关键想法:去掉回归项、允许多步生成器,并在分布匹配之上加一个非饱和 GAN 损失,把蒸馏彻底变成对抗训练。这就是 FlashWorld 阶段二逐字采用的算法。
把 DMD 从"一步、纯 score 匹配"升级成"多步 + 真 GAN",正是 FlashWorld 4 步生成器的训练配方。
给一张图、或者一句话,9 秒在一张 GPU 上吐出一个能自由换视角的 3D 高斯场景, 质量还比那些要跑几分钟到几小时的方法更好。它的赌注只有一句话:3D 没有数据,但视频有—— 于是它从一个视频扩散模型(Wan2.2)出发,训练一个双模多视角扩散模型,再用一套 带着 GAN 精髓的跨模分布匹配蒸馏,把"锐利"和"3D 一致"这两件 本来互相打架的事,同时塞进一个 4 步生成器里。
预设读者:会基本的高数、线代、机器学习,懂 NeRF / SDF / 3DGS 的基本盘,但不熟悉 3DGS 之后那一大堆
生成/前馈工作也没关系——我们从零把每一块先验讲清楚,并且把论文里的每一步都对到官方代码
imlixinyang/FlashWorld 的真实实现上。
零基础:从 §1 顺读,先在 §3 玩一下"两条路线"演示,30 秒就能体会整篇论文要解决的矛盾。 已经懂 3DGS / 扩散:直接跳 §8(整体框架)→ §13–§14(跨模蒸馏的数学,这是全篇真正的内核,也是 "GAN 精髓"那句话的出处)。只想看它站在哪、有哪些先验和后续:跳 §18–§20。
目标很朴素:从一张图或一段文字,前馈地生成一个 3D 场景(一堆 3D 高斯,可以从任意新视角实时渲染)。 这件事现在的主流做法分成两派,FlashWorld 的全部聪明之处,是把这两派的优点合到一起。先记住三个人物:
把一个视频扩散模型改造成能同时"出图(MV 模式)"和"出 3D 高斯(3D 模式)"的双模模型; 再用跨模分布匹配蒸馏,让 MV 模式(real)去拉齐 3D 模式(fake)的输出分布——这一步本质上 就是 GAN 的"判别器把生成分布推向真实分布",只不过判别器换成了两个扩散模型的 score 之差。 结果:3D 一致 + 锐利 + 4 步 ≈ 9 秒。
作者 Xinyang Li, Tengfei Wang, Zixiao Gu, Shengchuan Zhang, Chunchao Guo, Liujuan Cao(厦门大学 / 腾讯), arXiv:2510.13678, 项目主页, 代码。第一作者也是 Director3D 的作者—— 而 Director3D 正是本文要超越的基线之一,所以 FlashWorld 某种意义上是作者对自己上一篇工作的"提速重做"。
先把读者朋友那句话翻译成技术语言:"要走 3D,最难的就是没数据。" 这不是抱怨,是 3D 生成这条路上最硬的约束。 想想看:
纯靠 3D 数据从头训一个 3D 生成模型,必然欠拟合真实世界的多样性。出路只有一条:借。 借那些在海量 2D / 视频数据上已经训得很好的扩散模型——它们在学"怎么把视频生成得逼真"时, 其实顺带学到了三维世界的规律:视差、遮挡、物体在镜头移动下怎么连续变化。这些正是 3D 一致性的来源。 把这种模型当作先验,再用少量 3D 数据去"对齐"到我们要的 3D 输出,就绕过了数据墙。
扩散模型的训练目标,本篇会反复用到,先写在这(去噪即学分布):
$$ \mathcal{L} = \mathbb{E}_{x,t,\epsilon}\big[\,\lVert x - \hat{x}_\theta(x_t,\,t)\rVert^2\,\big], \qquad x_t = \alpha_t x + \sigma_t \epsilon $$网络 $\hat{x}_\theta$ 学的是"给一张被加了 $t$ 级噪声的图 $x_t$,猜回干净的 $x$"。训练完成后,它隐含地学到了 数据分布的 score(对数概率密度的梯度),这是后面所有蒸馏故事的起点:
$$ s(x_t, t) = \nabla_{x_t}\log p_t(x_t) = -\,\frac{x_t - \alpha_t\,\mu_\theta(x_t,t)}{\sigma_t^2} $$一个训练好的扩散模型 = 一个能告诉你"往哪个方向改,样本就更像真实数据"的 score 函数。 "视频先验"之所以值钱,是因为它的 score 里已经包含了三维世界的运行规律。FlashWorld 全篇都在 搬运和提炼这个 score。
这是全篇的中轴线(也就是论文 Figure 2)。同样是"生成 3D 场景",两条路线在什么时候引入 3D 约束上 做了相反的选择,于是各自有一个治不好的病:
| MV-oriented | 3D-oriented | FlashWorld | |
|---|---|---|---|
| 流程 | 先扩散生成多视角图 → 再重建 3D | 生成多视角的同时直接出 3D 高斯 | 双模:两者都能,再蒸馏 |
| 3D 约束 | 生成时没有(事后才重建) | 生成时就有(共享几何) | 有(继承自 3D 模式) |
| 画质 | 锐利 ✓ | 偏糊 ✗ | 锐利 ✓ |
| 3D 一致性 | 差(视角互相打架→鬼影/漂浮)✗ | 好 ✓ | 好 ✓ |
| 速度 | 几分钟 ~ 几小时 | 较快(仍需多步去噪) | 4 步 ≈ 9 秒 |
| 代表作 | CAT3D · Bolt3D · Wonderland | Prometheus · Ours(w/3D-Diff) | — |
为什么 MV 锐利却不一致?因为它每张视角图是各自生成的,扩散模型有足够自由度把每张画得很细, 但没人逼它们"对应到同一个三维结构",于是重建时这些细节对不上号,表现为鬼影、重影、漂浮物。 为什么 3D 一致却糊?因为所有视角被钉死在一套共享几何上,模型为了让每个视角都"说得过去", 只能输出一个保守的、低频的平均解——细节被抹掉了。下面这个演示让你亲手切换这三种状态。
FlashWorld 没有从图像扩散模型出发,而是从一个视频扩散模型 Wan2.2-TI2V-5B(5B 参数,文/图生视频)出发。 论文给的理由很实在:视频模型不仅"收敛更快",还自带一个"高压缩率的强力 VAE", 让它能在一次生成里塞下24 个视角、分辨率到 480P。这就是"用算力换数据"的杠杆: 把一个在海量视频上训过的先验,改造去对齐多视角输出。
# app.py —— 直接从 HuggingFace 把 Wan2.2-TI2V-5B 的各部件搬过来
model_id = "Wan-AI/Wan2.2-TI2V-5B-Diffusers"
self.vae = AutoencoderKLWan.from_pretrained(model_id, subfolder="vae") # 高压缩 VAE:空间 16x、时间 4x
self.text_encoder = UMT5EncoderModel.from_pretrained(model_id, subfolder="text_encoder")
self.transformer = WanTransformer3DModel.from_pretrained(model_id, subfolder="transformer") # 40 层 DiT
self.scheduler = MyFlowMatchEulerDiscreteScheduler.from_pretrained(model_id, subfolder="scheduler", shift=3)
# FlashWorld 自己微调出来的权重只覆盖两块:transformer + recon_decoder(VAE / 文本编码器保持原版)
关键是那个 VAE。普通图像 VAE 压 8 倍,Wan2.2 的 VAE 空间压 16 倍(外加时间维压 4 倍), latent 通道 48。压得越狠,同样的显存/算力下就能装下越多视角、越高分辨率——而"多视角"正是 3D 一致性的信息来源。 这就是"怎么 scaling"的核心答案之一:不是把模型堆大,而是选一个能让你一次看更多视角的先验。
图像模型只会画"一张好看的图",对"同一物体换个角度长什么样"一无所知。视频模型在学"下一帧"时, 被迫学会了物体随镜头移动的连续变化——这正是多视角一致性的雏形。 FlashWorld 做的,是把视频帧的"时间轴"重新解释成相机的"视角轴"。
FlashWorld 怎么"出 3D"?答案来自一条 3DGS 之后的支线:像素对齐高斯(pixel-aligned Gaussians)。 起点是 Splatter Image(每个像素吐一个 3D 高斯)和 pixelSplat / GS-LRM (把它做成多视角、可泛化、用大 transformer 一次前馈预测)。它们的共同套路是:
对每个像素,沿它的相机光线预测一个深度 $\tau$,把这个像素"推"到三维空间里的位置 $\boldsymbol{\mu} = \mathbf{o} + \tau\,\mathbf{d}$($\mathbf{o}$ 是相机光心,$\mathbf{d}$ 是该像素的光线方向); 再为这个高斯预测不透明度、各向异性的尺度、旋转四元数、以及球谐颜色。于是"预测 3D 场景"被转化成了 "预测一张深度图 + 高斯属性图"——一个网络一次前馈就能搞定,不需要逐场景优化。
num_points_per_pixel=2),
用第二个高斯补第一个遮不住的薄表面。注意高斯越远画得越大(尺度 ∝ 像素足迹 × 深度)。
FlashWorld 的 3D 头就是这一路的直系后代(细节见 §10):它的解码器从 Wan 的 VAE 解码器复制而来, 在末端换成一个预测"深度 + 不透明度 + 尺度 + 旋转 + 球谐"的卷积头,每像素出 2 个高斯。 和早期 LRM/Splatter Image 的区别只有一个:驱动它的不是一个回归网络,而是一个蒸馏过的视频扩散生成器。
要让一个扩散模型"按指定的几个相机视角"生成图,需要两样东西:(1) 让各视角互相通信以保持一致, (2) 告诉模型每个视角的相机是什么。
第一样来自 MVDream / Zero-1-to-3 / SyncDreamer 这条多视角扩散血脉:用跨视角注意力 让所有视角在去噪时彼此看见,从而联合一致。FlashWorld 的 DiT 里也是靠 3D 注意力把 24 个视角连起来。
第二样是相机条件。FlashWorld 用的是 Plücker 光线图的一个变体—— Reference-Point Plücker Coordinates(RPPC,来自 DiffusionGS)。每个像素给一条 6 维射线: 方向 + 矩(moment)。普通 Plücker 用 $\mathbf{o}\times\mathbf{d}$ 当矩,RPPC 换成"射线上离世界原点最近的那个点", 对相对深度更敏感。代码里就是一行向量运算,然后当成额外通道拼到 latent 上:
# utils.py —— 把相机编码成逐像素的 Plücker 光线图(再拼进 transformer 输入)
def create_raymaps(cameras, h, w):
rays_o, rays_d = create_rays(cameras, h, w) # 每像素的光心与方向
moment = rays_o - (rays_o * rays_d).sum(-1, keepdim=True) * rays_d # 方向上的"矩"分量
raymaps = torch.cat([rays_d, moment], dim=-1) # [方向(3) | 矩(3)] = 6 通道
return raymaps
好处是:相机信息和"画面长什么样"完全解耦——模型看到的是纯几何,appearance 归 appearance。 这正是 CameraCtrl 当年给视频扩散加相机控制的思路,FlashWorld 把它接到 Wan 上当方向盘。
这是全篇的灵魂先验,也是读者朋友说的"GAN 精髓"的来源。一条清晰的家谱,请顺着看:
SDS 教会我们"用扩散 score 当 3D 的梯度";VSD 把它写成 real−fake 两个 score 之差; DMD/DMD2 把这个差变成"一步/几步生成器"的训练目标,并点明它就是 GAN。 FlashWorld 的创新,是把这条线里的"real/fake"换成同一个模型的两种模式—— real = MV 模式(锐利),fake = 3D 模式(一致)——于是叫跨模蒸馏。
把上面三块先验拼起来,FlashWorld 的训练就是两阶段(论文 Figure 3):
阶段一:一个共享主干的 DiT 同时学两件事——MV 模式直接出 latent(损失 $\mathcal{L}_\text{MV}$), 3D 模式出高斯、渲染到新视角再比对(损失 $\mathcal{L}_\text{3D}$)。阶段二:冻结 MV 模式当老师, 用分布匹配蒸馏(橙色粗箭头是主梯度 $s_\text{real}-s_\text{fake}$)把它的画质灌进 3D 学生,同时把去噪步数压到 4 步。
阶段一的两个损失写出来就是($\mathcal{Z}=E(\mathcal{X})$ 是多视角 latent,$\mathcal{C}$ 是相机,$R$ 是 3DGS 渲染):
$$ \mathcal{L}_\text{MV} = \mathbb{E}\big[\lVert \mathcal{Z} - \hat{\mathcal{Z}}_\text{MV}\rVert^2\big], \qquad \mathcal{L}_\text{3D} = \mathbb{E}\big[\lVert \mathcal{X}_\text{novel} - R(\mathcal{G},\,\mathcal{C}_\text{novel})\rVert^2\big] $$注意 $\mathcal{L}_\text{3D}$ 是在没被监督过的新视角上算渲染误差——这正是逼模型学出真正 3D 一致几何的关键。 训练数据:MVImgNet(物体为主)、RealEstate10K(室内)、DL3DV-10K(通用场景)。
"双模"在代码里不是两个网络、也不是一个 mode 开关 token,而是同一个 DiT、两个并排的输出读出:
主干吐出 (1) 一个 48 通道的去噪 latent(这就是 MV 模式 / "2d" 分支),外加 (2) 一个 1024 通道的特征
$\mathcal{F}$。把 $\mathcal{F}$ 喂给 3D 解码器得到高斯、渲染、再编码回 latent,就是 3D 模式 / "3d" 分支。
一个布尔 need_3d_mode 决定要不要走后半段:
# app.py —— forward_generator:一次前馈,两个读出(节选)
out = self.transformer(noisy_latents, raymaps, condition_latents, t, text_embeds, ...)
v_pred, feats = out.split([self.latent_dim, self.feat_dim], dim=1) # 48ch 速度场 + 1024ch 特征
latents_pred_2d = noisy_latents - sigma * v_pred # ← MV 模式:直接得到 latent
if need_3d_mode:
scene = self.recon_decoder(feats, latent_unscale(latents_pred_2d), cameras) # 解码出 3D 高斯
images_pred, _ = self.recon_decoder.render(scene, cameras, H, W, bg_mode="white") # 渲染回多视角
latents_pred_3d = latent_scale(self.vae.encode(images_pred)) # ← 3D 模式:渲染→再编码的"一致" latent
return {'2d': latents_pred_2d, '3d': latents_pred_3d, 'rgb_3d': images_pred,
'scene': scene, 'feat': feats}
这里有个精妙之处:3D 模式输出的 latent,是"先变成 3D 高斯、渲染出图、再编码回 latent"得到的。 这一来一回,强行让输出穿过了一个真正的 3D 表示——所以它必然 3D 一致(因为所有视角都来自同一套高斯)。 这就是 3D 模式"一致"的物理来源,也是 §15 跨模一致性损失的基础。
3D 解码器 recon_decoder 从 Wan 的 VAE 解码器深拷贝而来,在第一层注入 transformer 的 1024 维特征,
末端接一个 PixelAligned3DGS 头。它对每像素、每个高斯预测一组通道,然后做 §5 讲过的反投影:
# reconstruction_model.py —— 像素对齐高斯解码(节选)
features, uv_offset, depth, opacity, scales, rotations, mask = params.split(self.gaussian_channels, dim=-1)
rays_o, rays_d = create_rays(cameras, uv_offset=uv_offset, h=h, w=w) # 每像素光线(可微小偏移 uv)
depth = trunc_exp(depth) # τ:正深度
xyz = rays_o + depth * rays_d # μ = o + τ·d ← 反投影到世界系
opacity = torch.sigmoid(opacity)
pixel_size = torch.sqrt(fx**2 + fy**2)[...,None] * depth # 像素足迹 × 深度
scales = (sigmoid(scales) * (smax - smin) + smin) * pixel_size # 各向异性尺度
rotations = F.normalize(rotations, dim=-1) # 单位四元数
gaussian_params = torch.cat([xyz, opacity, scales, rotations, features], dim=-1) # 一个高斯
每个高斯 = 世界系坐标(深度反投影而来)+ 不透明度 + 各向异性尺度 + 旋转四元数 + 2 阶球谐颜色。
num_points_per_pixel=2:每像素出两个,第二个能补第一个挡不住的薄表面。
渲染用的是 gsplat(render_mode="RGB+D"),一次一个视角,省显存。
整条链路(latent → 高斯 → 渲染 → 再编码)端到端可微,这是阶段一 $\mathcal{L}_\text{3D}$ 和阶段二蒸馏能回传梯度的前提。
推理只有 4 步,时间步用固定调度 {1000, 900, 750, 500}。每一步都走 3D 分支
(need_3d_mode=True),所以每一步的中间结果本身就是一个完整的 3D 高斯场景,
渲染回 latent 后再加噪进入下一步——这是一个"去噪 → 出 3D → 渲染 → 再加噪"的反馈循环:
# app.py —— 4 步推理主循环(节选)
for i in range(len(self.denoising_steps)): # 仅 4 步
t = self.timesteps[self.denoising_steps[i]]
cond = torch.cat([condition_latents, prev_feats, prev_latents_pred], dim=1) # 反馈上一步
out = self.forward_generator(noisy_latents, raymaps, cond, t, text_embeds,
cameras, cameras, H, W, need_3d_mode=True)
latents_pred = out["3d"] # 渲染→再编码得到的"3D 一致" latent
prev_feats, prev_latents_pred = out['feat'], latents_pred
if i < len(self.denoising_steps) - 1: # 不是最后一步:按下一个时间步重新加噪
noisy_latents = self.scheduler.scale_noise(latents_pred, next_t, torch.randn_like(noise))
# 最后一步直接吐出 3D 高斯,结束
为什么 4 步就够?因为蒸馏(§13)本质上把一个需要几十步的多步扩散采样器,压缩成了一个几步生成器——
这是 DMD2 的看家本领。再叠加上 quant.py 把 DiT 的所有线性层做 FP8 量化,
最终落到单卡 ≈ 9 秒。下面的演示让你直观看到"蒸馏把 50 步压成 4 步"是什么意思。
到这里你可能会问:既然 3D 模式天生一致,那把它单独训好不就行了?为什么非要蒸馏?这正是论文消融里的 "w/ 3D-Diff"(只用 3D 模式、不蒸馏),也是质量最差的一档。原因有两层:
所以矛盾的本质是:"采清晰的众数"和"保持跨视角一致"在直接训练里互斥。 MV 占了前者,3D 占了后者。FlashWorld 的解法不是再调损失权重,而是让一个去教另一个—— 把 MV 的"会采清晰众数"这件事,作为一个分布蒸馏给 3D。
现在进入全篇的心脏。我们要训练的"生成器" $G_\theta$ 就是 3D 模式(输入噪声,输出 3D 高斯)。 目标:让 $G_\theta$ 产生的分布,去匹配 MV 模式(老师)的分布。借用 DMD:
准备两个 score。real score $s_\text{real}$ 来自冻结的 MV 模式 $\mu_\text{real}$(老师); fake score $s_\text{fake}$ 来自一个动态更新的副本 $\mu_\text{fake}$, 它持续用去噪损失去拟合"学生当前生成出来的分布"。$F(\cdot)$ 表示把生成结果重新加噪到某个噪声级。 分布匹配的梯度就是(论文 Eq. 3):
$$ \nabla_\theta \mathcal{L}_\text{DMD} = -\,\mathbb{E}_{t}\!\left[\int \Big( s_\text{real}\big(F(G_\theta(z),t),t\big) - s_\text{fake}\big(F(G_\theta(z),t),t\big) \Big)\;\frac{dG_\theta(z)}{d\theta}\;dz\right] $$把它读成大白话:对学生生成的每个样本,real score 指向"更像老师分布的方向", fake score 指向"更像学生当前分布的方向",两者一减,得到一个净的推力—— 把学生的分布往老师的分布推。这就是下面这个演示在做的事。
那个 $\mu_\text{fake}$ 为什么要一直更新?因为学生在变,"学生当前的分布"也在变;只有让 fake score 实时追踪学生, $s_\text{real}-s_\text{fake}$ 才是有意义的"把当前学生推向老师"的方向。这是一个 min-max 的左右手互搏—— 味道已经很 GAN 了。
现在兑现"GAN 精髓"这句话。score 是对数概率密度的梯度,$s=\nabla\log p$。于是两个 score 一减:
$$ s_\text{real}(x) - s_\text{fake}(x) = \nabla_x \log p_\text{real}(x) - \nabla_x \log p_\text{fake}(x) = \nabla_x \log \frac{p_\text{real}(x)}{p_\text{fake}(x)} $$右边是对数密度比的梯度。而 GAN 里最优判别器恰好是 $D^*(x)=\sigma\!\big(\log \tfrac{p_\text{real}(x)}{p_\text{fake}(x)}\big)$——它估的就是同一个密度比。 换句话说,DMD 里那个"动态 fake score 网络",就是一个被摊开成连续形式的判别器; 沿 $s_\text{real}-s_\text{fake}$ 走,就是在沿判别器的梯度最小化一个散度。这正是 GAN 的内核。
因为 FlashWorld 的画质迁移,机制上就是一次对抗式的散度最小化:MV 老师的分布是"真", 3D 学生的分布是"假",两个扩散模型的 score 之差扮演判别器。DMD2 更进一步,直接再加一个真·GAN 损失 (在 fake-score 网络上挂一个分类分支,输入视角和新视角都判),并用 estimated R1 正则稳住它。 所以这不是"用了点 GAN trick",而是骨子里在打 GAN,只是穿了扩散/score 的衣服。
一个工程细节也呼应这点:在用海量单视角图 + 文本做 OOD 协同训练时(§15),他们关掉 GAN 损失, "以防分布不匹配"——因为单视角数据没有成对的多视角真值,硬上 GAN 会把判别器训歪。能精确知道"什么时候该关 GAN", 本身就说明作者是把它当 GAN 在调。
光有分布匹配还不够,还有两个补丁让它真正可用。
跨模一致性损失(CMC, Eq. 6)。把 3D 模式渲染出的图编码回 latent, 去对齐 MV 模式预测的 latent——逼"一致的 3D 学生"和"锐利的 MV 老师"在 latent 上也对得上:
$$ \mathcal{L}_\text{CMC} = \mathbb{E}\Big[\big\lVert\, E\big(R(G_{\theta,\text{3D}}(\cdot),\,\mathcal{C})\big) - G_{\theta,\text{MV}}(\cdot)\,\big\rVert^2\Big] $$有意思的是消融:去掉 CMC,那几个画质指标几乎不掉——但定性上会冒出"漂浮和重复的伪影"。 也就是说,CMC 买到的是几何干净度,而那是标量 IQA 指标根本测不出来的东西。这是一个很好的提醒: 数字持平 ≠ 没区别。
OOD 协同训练。蒸馏时额外喂海量单视角图 + 文本,配上随机相机轨迹, 让模型能泛化到训练分布外的输入。消融显示:去掉它,在分布外基准(尤其 T3Bench)上明显掉点。 这一步对应朋友说的另一半——"大多数任务定义都没法真正用好 video/2D data": FlashWorld 用一个能同时吃多视角、单视角、纯文本的任务形式,把这些异构数据都喂了进去。
论文不用 PSNR/LPIPS 当主指标(生成任务没有逐像素 ground truth),而用感知质量类指标: Q-Align IQA/IAA、CLIP-IQA+、CLIP-Aesthetic、CLIP-Score,外加 WorldScore 基准。 Text-to-3D(T3Bench-200,节选):
| 方法 | Q-Align IQA ↑ | CLIP-IQA+ ↑ | 每场景耗时 |
|---|---|---|---|
| Director3D | 3.24 | 0.43 | 7 min |
| Prometheus | 2.34 | 0.34 | 15 s |
| FlashWorld | 4.12 | 0.54 | 9 s |
WorldScore 基准(综合分 + 耗时;注意基线在 H100 上测,FlashWorld 在更弱的 H20 上测):
| 方法 | 3D 一致 | 风格一致 | 综合分 ↑ | 耗时 |
|---|---|---|---|---|
| WonderJourney | 80.6 | 67.5 | 60.30 | 6 min |
| LucidDreamer | 90.4 | 66.4 | 66.32 | 6 min |
| WonderWorld | 86.9 | 75.9 | 66.43 | 10 s |
| FlashWorld | 85.9 | 81.5 | 68.72 | 9 s |
读法要诚实:FlashWorld 拿的是综合第一 + 最快,但 3D 一致性单项并非第一(LucidDreamer 更高, 代价是慢 40 倍且综合更低)。对"几秒钟出一个又好又一致的场景"这个目标,它是当前性价比最高的点。 速度方面,论文给的硬对比是 9 秒 vs Director3D 7 分钟(约 47×);项目页"10–100×"是把更慢的基线也算进去的范围说法。
论文 Table 3 的六个变体(T3Bench 列,节选),把全篇的设计逐一拆开验证:
| 变体 | 含义 | Q-Align IQA | CLIP-IQA+ |
|---|---|---|---|
| A · w/ MV-Diff | 只用 MV 模式,不蒸馏 | 3.11 | 0.41 |
| B · w/ 3D-Diff | 只用 3D 模式,不蒸馏(最糊) | 2.61 | 0.37 |
| C · w/ MV-Dist | 蒸馏,但输出走 MV 模式 | 3.46 | 0.45 |
| D · w/o CMC | 无跨模一致性损失 | 4.12 | 0.52 |
| E · w/o OOD | 无单视角协同训练 | 3.98 | 0.53 |
| F · Full | 完整模型 | 4.12 | 0.54 |
把前面四块先验画成一张家谱。FlashWorld 不是某一条线的延长,而是四条线的交汇点:
粗橙线是两条主血脉:左边的"蒸馏/GAN"提供机制(怎么把锐利灌进一致里), 中间的"视频先验"提供资产(用视频数据顶替缺失的 3D 数据)。右边两条(像素对齐高斯、相机条件)是 载体与方向盘。一句话:FlashWorld = 用蒸馏(GAN)把视频先验,压进一个像素对齐高斯的前馈生成器, 再用 RPPC 掌舵。
下面是真正承重的先验(不是参考文献全表)。按四条血脉分组,每张卡用"它解决什么痛点 → 关键想法 → 和上一篇的差别"来读。
DMD 要一个昂贵的回归项、只能一步、画质还差口气。
关键想法:去掉回归项、允许多步生成器,并在分布匹配之上加一个非饱和 GAN 损失,把蒸馏彻底变成对抗训练。这就是 FlashWorld 阶段二逐字采用的算法。
把 DMD 从"一步、纯 score 匹配"升级成"多步 + 真 GAN",正是 FlashWorld 4 步生成器的训练配方。
多步扩散采样太慢,想压成一步又会掉质量。
关键想法:用 $s_\text{real}-s_\text{fake}$(两个扩散模型的 score 之差)当生成器梯度,最小化近似 KL。FlashWorld 的 Eq. 3 就是它,只是 real/fake 换成了 MV/3D 两种模式。
把 VSD 的"real−fake score"思想,从逐场景优化变成训练一个前馈生成器。
SDS 的梯度有偏,结果过饱和、糊、缺多样性。
关键想法:正确梯度是 real score(冻结先验)减 fake score(跟踪当前生成分布的网络);SDS 是 fake=加噪的退化特例。这条 real−fake 结构是通往 DMD 的桥。
把 SDS 的"单一 score"修正为"两个 score 之差",奠定后续所有分布匹配蒸馏。
没有 3D 数据,怎么生成 3D?
关键想法:用一个冻结的 2D 扩散先验当"评分员",让随机渲染出的图更像它的样本——第一次把扩散 score 当成 3D 优化的梯度。整条"蒸馏 2D/视频先验进 3D"的路线由此而来。
把"3D 生成"从"需要 3D 数据"转化为"蒸馏一个 2D 先验",这是 FlashWorld 立身之本的祖先。
3D 数据稀缺,需要一个见过海量真实世界动态的先验。
关键想法:5B 文/图生视频 DiT + 空间 16× 高压缩 VAE。FlashWorld 整个从它初始化:收敛更快,且高压缩 VAE 让一次能塞下 24 视角 / 480P。
不是把模型堆大,而是选一个"能一次看更多视角"的视频先验当地基——这是 FlashWorld 的 scaling 答案。
怎么从少量视图造出一个完整 3D 场景?
关键想法:多视角扩散先生成大量一致视图,再走标准 3D 重建——MV-oriented 范式的代表作,也是 FlashWorld 的对照基线(§3 表里"MV-oriented"那一列)。
FlashWorld 反对的正是它的"先生成视图、后重建"两段式——把 3D 约束从事后挪到了生成中。
逐场景优化太慢,能不能直接采样出 3D?
关键想法:直接采样一个 3D 高斯表示,几秒出结果——最接近 FlashWorld 的 3D-oriented 同代竞品。
同样追求"秒级直接出 3D",但 FlashWorld 多了跨模蒸馏,把 MV 级画质又赚了回来。
3D 数据少,但互联网视频海量——能不能直接从视频学 3D?
关键想法:在 3.2 亿帧、无位姿的网络视频上训多视角扩散(WebVi3D)。是"视频数据顶替 3D 数据"这一论点最强的证据。
和 FlashWorld 同一信仰(用视频规模救 3D 数据荒),但停在 MV 生成;FlashWorld 走到了直接出 3D。
怎么用一次前馈、从多视角图预测高斯?
关键想法:把有位姿的图切 patch 喂 transformer,每像素解码一个高斯、按深度反投影——FlashWorld 的 3D 头几乎就是这套模板(§10)。
FlashWorld 把驱动它的从"回归 LRM"换成了"蒸馏过的视频扩散生成器"。
单图重建 3D 又快又简单的范式是什么?
关键想法:图到图网络每个像素吐一个 3D 高斯——"像素对齐高斯"这个词的最干净来源。
FlashWorld 把"每像素 1 个"扩展成"每像素 2 个",并用于多视角生成而非单图重建。
文本到 3D 场景,连相机轨迹也要一起生成。
关键想法:先生成相机轨迹("摄影师")+ 多视角 latent 扩散("布景师"),再做 SDS++ 逐场景精修。同一作者的上一篇、也是 FlashWorld 的基线。
FlashWorld 砍掉了它慢且易产生波纹伪影的逐场景精修,换成一次快速一致的前馈。
能不能前馈、无精修地文本生成 3D 场景?
关键想法:3D-aware latent 扩散直接出多视角像素对齐高斯,用 RGB-D latent 解耦外观与几何。FlashWorld 的另一个 3D-oriented 基线。
和 Prometheus 一样前馈直出 3D,但 FlashWorld 用跨模蒸馏治好了它"糊 + 几何错"的老毛病。
普通 Plücker 矩对相对深度不够敏感。
关键想法:用"射线上离世界原点最近的点"替换矩向量,得到对 3D 几何感知更好的 Reference-Point Plücker Coordinates。FlashWorld 的相机条件用的就是它(§6)。
在 CameraCtrl 的"Plücker 当相机控制信号"基础上,换了个对深度更友好的矩定义。
说句实话:截至 2026 年 6 月,FlashWorld(2025-10 上线,ICLR 2026 Oral)已被约 18 篇引用, 但还没有一篇"直接扩展 FlashWorld 方法"的 Tier-1 后续,也没有谁在摘要里点它的名。 它目前是被当作最新 SOTA 基线来引用的。下面是接触最实质的几篇(arXiv 号均已逐一核验)。
关键想法:把 FlashWorld 当作正式定量基线(NVS + WorldScore 两张表)并在架构图里直接对比——"FlashWorld 在压缩视频 latent 里扩散" vs OneWorld 在统一 3D latent 里扩散。是目前对 FlashWorld 最正面的"挑战者"。
同一赛道、直接对打,主张用统一 3D 表示超过 FlashWorld 的压缩视频 latent 路线。
关键想法:同样基于相机引导视频→3D 的腾讯系工作,与 FlashWorld 共享两位作者。在相关工作里把 FlashWorld 归为"同时建模深度/3DGS/点图"的端到端方法,并以"这类方法很吃数据"作为自己设计的对照动机。
同实验室血脉的兄弟工作;不是扩展,而是从重建侧切入同一问题。
关键想法:概念上最近的同代兄弟——同样"蒸馏视频扩散模型 → 一步生成 3D 场景"。比 FlashWorld 略早,可看作这条"蒸馏视频先验做快速 3D"路线的先声。
同样走蒸馏+视频先验,但 FlashWorld 用双模 + 跨模 DMD 同时拿下一致性与画质。
更外围的同代世界模型工作(引用 FlashWorld 但属独立路线)还有:Lyra 2.0(NVIDIA, 2604.13036)、HY-World 2.0(腾讯混元, 2604.14268)、Diff4Splat(前馈单图→4D, 2511.00503)。它们一起说明 FlashWorld 正被"可探索世界生成"这条大线注意到。
| 术语 | 含义 |
|---|---|
| MV-oriented | 先生成多视角图、再重建 3D。锐利但不一致、慢。 |
| 3D-oriented | 生成过程里直接出 3D 表示。一致但偏糊。 |
| 双模 / dual-mode | 同一个 DiT,两个并排读出:MV 模式(出 latent)与 3D 模式(出高斯→渲染→再编码)。 |
| 跨模蒸馏 / cross-mode distillation | 用 MV 模式(real)蒸馏 3D 模式(fake)的 DMD2 训练。 |
| score | $\nabla_x \log p(x)$,对数密度的梯度;扩散模型隐式学到的东西。 |
| DMD / DMD2 | 分布匹配蒸馏:梯度 = $s_\text{real}-s_\text{fake}$;DMD2 再加 GAN 损失。 |
| 像素对齐高斯 | 每像素沿光线按深度 $\tau$ 放一个高斯,$\mu=\mathbf{o}+\tau\mathbf{d}$。 |
| Plücker / RPPC | 把相机编码成逐像素 6 维射线(方向+矩);RPPC 用最近点替换矩。 |
| CMC | 跨模一致性损失:3D 渲染图编码回 latent 去对齐 MV latent;买几何干净度。 |
| R1 正则 | 稳定 GAN/对抗训练的梯度惩罚;本文用其近似版(estimated R1)。 |
| Wan2.2-TI2V-5B | 5B 文/图生视频扩散模型 + 空间 16× 高压缩 VAE;FlashWorld 的地基。 |
想读原文,建议这个顺序(按"理解 FlashWorld 所需"重排,非时间序):
FlashWorld 的故事可以压成两件事:(a) 用什么救数据荒 → 把视频扩散模型(Wan2.2)当 3D 先验; (b) 怎么同时要到"锐利"和"3D 一致" → 让一个网络同时会 MV 模式和 3D 模式,再用 DMD2(分布匹配 + GAN) 让 MV 教 3D。所有公式、所有代码、所有消融,都是在 (a)(b) 这张图上拧某一颗螺丝—— 而那颗最关键的螺丝,叫 $s_\text{real}-s_\text{fake}$。