把相机轨迹塞进历史通道:一段视频教会模型看世界
一个尴尬的现状
你手里有一个很强的视频生成模型——给它一张图和一句提示词,它能生成一段流畅的视频。现在你想加一个功能:让用户指定相机轨迹,比如"向左平移三米,然后推进两米"。模型应该能按这个轨迹生成视频,就像导演在控制摄像机。
这个需求看起来简单,实际上非常难。问题不在于"让画面动起来"——视频生成模型本来就会让画面动——而在于"让画面按指定方式动"。相机移动时,画面中会出现新的区域(disocclusion),前景物体相对相机的运动方向会改变,几何关系必须保持一致。
现有方法大致两条路。第一条是"训练一条":给模型加一个相机编码器、控制分支、或者修改注意力机制和位置编码,然后在大量带相机标注的视频上做后训练。CameraCtrl、ProPE、UCPE、ViewCrafter、Gen3C 都走这条路。效果好,但成本高——需要大规模相机标注数据,而且架构改动让模型变复杂。
第二条是"推理时优化":不改模型,但在生成时加约束。比如 test-time optimization、denoising-time guidance、latent repainting。不需要训练,但生成速度慢,每一段视频都要单独优化。
2026 年 5 月,上海交大和上海 AI Lab 的 Yifan Wang 和 Tong He 在 arXiv 上发表了这篇论文,提出了第三条路:不改架构、不加训练数据、不做推理时优化,只改一个接口——把相机轨迹变成"历史"喂给模型。更令人惊讶的是,他们发现只用一段带相机标注的视频做 LoRA 微调,就能让这个接口稳定工作并泛化到未见过的场景。
视频生成模型的"历史通道"
要理解这个方法,先要理解现代视频生成模型的一个关键设计:历史条件。
很多视频生成模型(如 Helios、Sora 类模型)不是一次性生成整个视频,而是分块生成——给定过去几帧("历史"),预测接下来几帧。模型有一个专门的"历史通道"(history pathway),用来接收和处理过去帧的信息。这个通道做的事情是:把过去帧 patchify、encode、pack 成一组 token,然后通过注意力机制影响未来帧的生成。
历史通道的设计初衷是时间连续性——让模型知道"之前发生了什么",从而生成连贯的后续。Yifan Wang 和 Tong He 的核心洞察是:这个通道其实是一个通用的"视觉证据接口",不只是时间上下文。
为什么这么说?想想历史通道在做什么:它接收一组视觉 token,这些 token 告诉模型"这是之前看到的画面"。模型用这些 token 来约束未来帧的生成——保持外观一致、运动连贯。但这个机制本身不关心"历史"是来自真实过去还是其他来源。它只关心:"这里有一些视觉证据,请据此生成合理的未来"。
那么,如果我们把"相机移动后应该看到的画面"(通过 warp 操作得到)作为"历史"喂给模型,会发生什么?模型会不会把这种"相机诱导的历史"当作真实历史,从而生成符合相机轨迹的视频?
Warp-as-History:三个关键设计
论文给出的答案是肯定的,但需要三个精心设计的步骤。
第一步:构造相机变形的伪历史
给定第一帧和目标相机轨迹 \(C = (c_1, \ldots, c_T)\),首先用现成的 3D 重建模型(如 Pi3X)从第一帧重建场景的几何结构,然后把重建结果投影到每个目标相机视角,得到一组 2D 变形视频 \(W_C\)。这个变形视频就是"如果相机按轨迹移动,第一帧会变成什么样"的近似。
关键决定:不把 \(W_C\) 当作硬渲染目标(那样会复制 warp 的误差),也不训练新的 warp 条件分支(那样需要额外训练数据),而是把 \(W_C\) 通过模型原生的历史通道喂进去。具体来说,把变形帧 patchify、encode、pack 成历史 token,和普通历史走完全一样的路径。
第二步:目标帧位置对齐
这是最关键的一步。如果只是把变形帧当作"过去的历史"塞进去,模型确实会把它当作历史——但只是作为"之前发生了什么"的上下文,而不是"现在应该生成什么"的指导。第 \(j\) 帧的变形 token 会被解释为"第 \(j\) 帧之前的某个时刻",而不是"第 \(j\) 帧应该长这样"。
解决方案很精巧:保持变形 token 在历史 patchification 路径中(不替换目标 token),但给它分配和目标帧相同的时间位置编码(RoPE index)。也就是说,第 \(j\) 帧的变形 token 和第 \(j\) 帧的噪声 latent 在时间位置上对齐,但变形 token 仍然作为历史证据输入,不覆盖目标 token。
这个设计的妙处在于:模型看到"历史中有一个位置 \(j\) 的证据,和我正在去噪的位置 \(j\) 对应",于是把这个证据当作"位置 \(j\) 应该长这样"的提示。论文的 Figure 6 显示,加上位置对齐后,零样本(完全冻结模型)的相机跟随行为立刻出现——不需要任何训练。
第三步:可见 token 选择
相机移动会产生新的可见区域(disocclusion)——原本被遮挡的区域变得可见。这些区域在第一帧的 warp 中没有有效信息,强行使用会导致拉伸纹理或空洞。
解决方案同样优雅:不添加额外的 mask 条件输入,而是直接把无效的变形 token 从历史流中丢掉。这模拟了历史条件预训练时常见的"不完整历史"情况——模型在预训练时已经见过不完整的历史,知道如何用生成先验填补空缺。无效 token 被丢弃后,模型用自身的生成能力完成 disocclusion 区域的生成,而不是依赖有缺陷的 warp。
代码实现中(pipeline.py 的 visible_token_drop 参数),可见性 mask 被映射到 latent token 网格,有效支持不足的 token 被直接移除。这个操作在 short、mid、long 三个历史层级都独立执行。
零样本能力:模型已经"会"跟随相机
这三个设计组合起来,产生了一个令人惊讶的零样本能力:完全冻结的视频生成模型,不需要任何训练,就能通过这个接口展示出可测量的相机跟随行为。
论文的 Figure 2 和 Figure 6 展示了这个效果。给定第一帧和相机轨迹,构造 warp 伪历史,喂给冻结的 Helios 模型。输出视频的相机运动方向和指定轨迹一致。这不是完美的——前景物体可能不自然,disocclusion 区域可能模糊——但相机跟随的信号是清晰可辨的。
这个零样本效果的意义不在于实用(它还不够稳定),而在于诊断价值:它证明了一个假设——预训练的视频生成模型内部已经隐含了"相机跟随"的能力,只是之前没有合适的接口来激活它。历史通道本来是用来传时间上下文的,但它也能传相机几何证据。模型不需要学新的能力,只需要被"提醒"它已经会的事。
一段视频的 LoRA:从"能做"到"做得好"
零样本效果证明了能力存在,但要达到实用水平需要稳定化。论文的做法极其克制:用一段(只有一段)带相机标注的视频做 LoRA 微调。
具体来说,选一段单独的视频(不是测试视频),给它标注相机轨迹,然后用 LoRA(Low-Rank Adaptation)微调模型的一小部分参数。训练完成后,权重固定,在所有测试视频上共享,不做 test-time fitting 或 per-video optimization。
论文强调这个微调的角色是行为稳定化,不是从零学习相机控制。它调整的是:什么时候模型应该跟随可见的 warp 证据,什么时候忽略不可靠的 warp 区域,什么时候依赖自身的生成先验处理动态和 disocclusion。这是在"放大"一个已经存在的能力,而不是"注入"一个新能力。
代码实现上(scripts/train_warp_as_history_lora.py),LoRA 只训练 1000 步,用单张 GPU。训练数据是一段单独的视频加相机轨迹。训练后的 LoRA 权重(visible_lora_state_step1000_efficient_patchmid.pt)在 HuggingFace 上公开。
实验结果:以小博大的胜利
论文在三个数据集上做了评估:WorldScore(大规模 3D 世界生成基准)、RE10K(RealEstate10K,房地产视频)、DAVIS(通用视频分割基准)。
结果令人印象深刻。在 WorldScore 上,Warp-as-History(一段视频训练)的相机 adherence 和视觉质量指标与 CameraCtrl、ViewCrafter 等方法相当甚至更好——而这些方法是在数万段相机标注视频上训练的。在 RE10K 和 DAVIS 上,Warp-as-History 在视觉质量和一致性指标上表现强劲。
论文还做了仔细的消融实验(Section 4.3),逐一验证三个设计(伪历史、位置对齐、可见 token 选择)的贡献。去掉位置对齐,相机跟随行为消失;去掉可见 token 选择,disocclusion 区域质量下降;去掉两者,只剩伪历史,效果接近随机。
小数据敏感性实验(Section 4.4)显示,即使用不同来源的一段视频训练,效果都稳定——这说明泛化能力不是来自某一段特定视频的信息,而是来自"激活已有能力"这个机制本身。
代码实现:工程细节值得学习
开源代码(github.com/yyfz/Warp-as-History)结构清晰,约 9400 行 Python。核心模块:
warp_as_history/camera_warp.py(3043 行):相机变形渲染,基于 Pi3X 重建模型。处理 mesh-based warp、可见性 mask、多 keyframe 渲染。warp_as_history/pipeline.py(2637 行):核心推理 pipeline,集成 Helios 模型。实现了三个关键设计:伪历史构造、位置对齐(通过 RoPE index remap)、可见 token 选择(通过visible_token_drop)。scripts/train_warp_as_history_lora.py(477 行):LoRA 训练脚本,单视频训练。scripts/web_realtime_demo.py(1700 行):实时 Web 演示,支持实时相机轨迹跟随。
visible_lora_state_step1000_efficient_patchmid.pt),用于实时交互演示。一个值得注意的工程细节:pipeline.py 中的历史管理分三个层级(short/mid/long),每个层级独立管理历史 token、位置索引和可见性 mask。这反映了 Helios 模型的多尺度历史注意力机制——不同时间尺度的历史有不同的作用。Warp-as-History 在三个层级都注入变形伪历史,但根据各层级的特性做适配。
为什么这件事重要
从方法论角度,这篇论文展示了一种"接口复用"的思路。面对一个新功能需求(相机控制),不添加新模块、新训练数据、新推理开销,而是找到模型已有的接口(历史通道),用合适的方式把新需求表达成这个接口能理解的输入。这和软件工程中的"适配器模式"异曲同工——不改现有系统,加一层适配让新需求走老路径。
从科学发现角度,论文的零样本实验揭示了一个有趣的事实:视频生成模型在预训练中已经隐式学会了相机几何。它知道"如果相机向左移,画面应该向右移;如果相机推进,远处物体变大变慢,近处物体变大变快"。这些知识是在大量视频数据中学到的,但平时没有接口来激活。Warp-as-History 提供了这个接口。这让人想到 LLM 中的"隐藏能力"——模型在预训练中学到的很多东西,需要合适的 prompt 或接口才能显现。
从实用角度,一段视频训练就能达到 SOTA 水平,这对资源有限的研究者和开发者意义重大。不需要大规模相机标注数据集,不需要多卡多天训练,一段视频、一张卡、1000 步 LoRA 就够了。这降低了相机控制视频生成的门槛,可能催生一批新应用。
从概念角度,这篇论文是"约束即设计"的又一个实例。不训练新模块是一个约束,不做推理时优化是一个约束,只用一段视频是一个约束。这些约束不是被迫接受的限制,而是主动选择的设计原则。约束迫使作者找到更优雅的解决方案——复用已有接口而不是添加新接口。这和 Ene-Nguyen 的 DP-PCA 论文有精神上的呼应:约束创造了它自己的解脱条件。
结语
Warp-as-History 是一篇让人读完有"啊哈"感的论文。它的核心洞察——把相机轨迹变成历史——简单到让人想拍脑袋说"为什么没人早点想到"。但简单不等于容易:三个设计(伪历史、位置对齐、可见 token 选择)中的每一个都来自对视频生成模型内部机制的深入理解。位置对齐尤其精妙——在历史路径中给目标帧位置编码,这个想法不直观,但一旦理解就觉得很自然。
论文的写作也值得学习。作者没有过度宣传零样本效果,而是明确把它定位为"诊断工具"——证明能力存在,但不够实用。然后展示一段视频 LoRA 如何稳定化这个能力。这种"先诊断、后治疗"的叙事结构让论文的逻辑非常清晰。
最后,这篇论文来自上海交大和上海 AI Lab,第一作者 Yifan Wang 是 SJTU 的研究生,通讯作者 Tong He(何通)曾在 Apple 工作,现在在上海 AI Lab。代码、模型、demo 全部开源,HuggingFace 上有预训练权重。这种开放态度值得国内研究者学习。在这个方向上,这可能是 2026 年到目前为止最优雅的相机控制视频生成工作之一。