ATI: Any Trajectory Instruction for Controllable Video Generation

1. Motivation(研究动机)

ATI 解决的是“视频生成中的运动可控性”问题:给定一张首帧图像,用户不只希望模型生成语义合理、视觉质量高的视频,还希望能够精确指定某些点、物体、局部区域或相机视角在时间轴上的运动轨迹。这个需求在 Physical Video Generation 里很核心,因为它把视频生成从“看起来像一段视频”推进到“遵循外部物理/几何运动指令的视频”。论文把这一问题表述为统一的 trajectory-based motion control:用户可以在图像上画点轨迹,让模型把局部形变、物体平移、相机 pan/zoom/dolly-zoom 等不同控制形式都理解成一组随时间变化的二维关键点路径。

Figure Teaser 解读:ATI 的用户接口不是文本 prompt 中模糊描述“向左移动”或“镜头推进”,而是直接在首帧上给出可视化轨迹。这样做的好处是控制信号具有空间位置、时间顺序和速度信息;局限是它需要用户或上游工具提供点轨迹,不能完全从自然语言自动推断复杂运动。

现有方法的主要矛盾在于:不同运动控制通常由不同模块处理。相机控制可能用全局几何变换或 camera pose 条件,物体运动可能用 bounding box / mask / drag point,局部变形又可能需要 brush、optical flow 或 feature warping。论文认为这些分裂式设计会导致三个问题。第一,用户需要在多个接口之间切换,很难组合“相机移动 + 物体移动 + 局部形变”。第二,各控制模块之间的语义不一致,同一条运动意图在不同系统中可能对应不同输入格式。第三,模块化拼接容易让生成结果出现局部跟随轨迹、全局语义漂移、或相机与物体运动互相抵消的现象。

ATI 的动机不是发明一个新的基础视频模型,而是在已有强 I2V backbones 上添加轻量的 trajectory instruction 注入机制。论文使用 Seaweed-7B 和 Wan2.1-14B 作为底座,强调方法对不同 DiT 视频生成模型具有兼容性。这里的关键假设是:首帧图像经 VAE 编码后已经包含物体外观与局部纹理特征;如果能在后续帧的 latent 空间中把“首帧某个点的 feature”软投射到用户指定的位置,就可以让模型在 denoising 时更自然地把对应物体/局部区域沿着轨迹移动,而不是只在输入端增加一个难以解释的轨迹 token。

论文的主要贡献可以概括为四点。其一,把相机、物体和局部 motion brush 统一为点轨迹条件。其二,提出 Gaussian-based motion injector,把轨迹从像素坐标转换为 latent feature condition。其三,给出交互式轨迹编辑工具,使用户可以画自由轨迹、静止点、圆形 zoom/pan 等控制。其四,在两个视频生成底座上验证可跟随性,并发布 Wan2.1 ATI 官方实现与模型权重。需要注意的是,论文摘要和结论声称优于先前模块化方法和商业系统,但当前论文正文中可直接抽取到的定量表主要比较 Seaweed-7B ATI 与 Wan2.1-14B ATI 两个底座;对商业系统/先前方法的数值对照表论文未详细说明。

2. Idea(核心思想)

核心思想是一句话:把用户画出的任意二维轨迹变成 latent 空间中的 feature-level instruction,让视频扩散模型在每个后续帧的指定位置“看到”首帧对应点的外观特征。 这比仅把轨迹当作额外 token 更直接,因为轨迹点不只是告诉模型“哪里该动”,还把“首帧哪里来的局部 feature”一起传播到目标位置;也比直接在 RGB 空间做 warping 更灵活,因为最终结果仍由强视频生成模型在 latent denoising 中合成,能够补全遮挡、形变和背景变化。

Figure Pipeline 解读:输入是首帧图像和用户指定的 point-wise trajectories。首帧经过 VAE 得到 latent;轨迹注入模块在 latent 条件中写入运动指令;DiT 在带有该 latent condition 的情况下去噪并生成视频。这个流程体现了 ATI 的定位:它不是独立的视频模型,而是插入 I2V pipeline 中 preprocessing 与 patchify 之间的 motion injector。

ATI 的“任意轨迹”不是任意物理运动模拟,而是任意用户可画出的 2D point trajectories。论文把三类常见控制都转写为这种表示:局部控制是少量点沿局部结构移动;物体控制是在物体表面布置多个点并让它们协同移动;相机控制是对整张图像或背景点施加系统性的 radial / translational 轨迹,例如从图像中心向外的点运动对应 zoom-in,水平一致位移对应 pan。由于这些轨迹共用同一个输入格式,用户还可以先生成相机运动轨迹,再编辑其中一些点作为物体运动,从而得到相机和物体同时变化的效果。

方法的直觉可以从“feature 搬运”理解。假设首帧中某个点落在汽车轮子边缘,VAE latent 在该点附近编码了轮子的颜色、纹理和局部语义。用户给出这个点在未来帧中的位置后,ATI 不要求模型凭空理解“轮子要去那里”,而是把该点的首帧 latent feature 通过 Gaussian mask 分布到未来帧目标位置附近。Gaussian 的作用是避免硬拷贝单个像素:目标位置附近的 latent cell 都会获得与距离相关的权重,既保留控制信号,又允许 DiT 根据上下文生成连续形变。

这也是它属于 Physical AI / Physical Video Generation 而不是单纯 Multimodal Generation 的原因:论文的主要贡献不是更强的文本-视频语义对齐,而是把外部可编辑的空间-时间轨迹作为物理运动约束接入视频生成过程。它关注的是“物体/相机应该怎样移动”与“模型如何在时间上保持轨迹一致”,而不是生成任意高质量视频。

3. Method(方法)

3.1 Overall framework

ATI 从标准 conditional video diffusion / DiT I2V 过程出发。设视频为 ,条件 可以包含文本、图像和轨迹。扩散模型通过前向加噪 构造噪声样本,再训练 denoiser 预测噪声,损失为: ATI 的新增部分是把 trajectory condition 写入 I2V 的 latent condition。论文在 Seaweed-7B 与 Wan2.1-14B 上实验;官方 GitHub 当前开源的是 Wan2.1 ATI 实现。代码路径显示,wan/image2video.py 在首帧和空白帧经 VAE 编码后得到条件 latent y,再在 generate() 中调用 patch_motion(tracks, y, training=False)。因此真实实现里,轨迹不是在 prompt encoder 中处理,也不是作为 cross-attention token 注入,而是在 VAE latent 条件进入 DiT 前完成空间写入。

3.2 Gaussian Model for Trajectory Instruction of Feature

Figure FeaturePlace 解读:左侧表示从首帧 latent feature grid 中按初始点位置采样 feature;右侧表示在未来帧中,以轨迹点位置为中心生成 Gaussian spatial distribution,再把该 feature 分配到周围 latent cells。图中最重要的信息是“采样来源”和“写入目标”分离:feature 来自首帧,位置来自用户轨迹。

论文对每个轨迹点 定义 latent 网格位置 上的权重: 其中 是从首帧 latent feature map 中在初始点 处双线性采样得到的 维特征。论文写明 ,目标是让 Gaussian 权重在最近对角像素处衰减到最大值的一半。官方代码中同一思想对应 wan/modules/motion_patch.py::patch_motion():先把 track 坐标按短边归一化到模型坐标系,再对每个 latent grid cell 计算到轨迹点的平方距离,用 torch.exp(-dist_ * temperature) 生成权重;默认 temperature=220.0。代码实现还取 topk=2,即每个 spatial cell 只保留权重最大的少数轨迹点,避免大量轨迹点同时写入造成混杂。

实现细节上,代码把 tracks 拆成时间、二维坐标和 visibility 三部分:tracks 的形状注释为 (B,T,N,4),四个通道分别对应时间/坐标/可见性。对未来帧,patch_motion() 将视频帧时间与 VAE latent 时间进行对齐:它丢掉首帧后,把后续轨迹按每 4 帧聚合到 latent temporal cell。然后它生成二维 mesh grid,计算每个 latent cell 与每个轨迹点的距离,并乘以 visibility。若某个点在该时间不可见,对应权重会被压到 0。这一点很重要,因为可见性让模型不用在被遮挡或超出画面的帧强制跟随某个点。

3.3 Latent feature injection

代码中的注入过程可以拆成四步。第一,grid_sample() 从首帧 latent feature 中按归一化初始轨迹坐标双线性采样,得到每个点的 feature 向量 point_feature。第二,merge_final() 根据 Gaussian 权重和 top-k 索引,把点 feature 合成到每个未来 latent cell。第三,将合成的 motion feature 与原本 I2V condition latent 混合:mix_feature = out_feature + vid[vae_divide[0]:, 1:] * (1 - out_weight.clamp(0, 1))。第四,把 mask channel 和 feature channel 拼回完整 condition latent。这里 vae_divide=(4,16) 表示前 4 个通道可视为 mask,后 16 个通道为 VAE feature;out_mask_full 会标记哪些位置被轨迹条件覆盖。

这种设计的优点是局部性强:轨迹点只影响 Gaussian 半径附近的 latent cell,不会像全局 prompt 一样改变整段视频。它也能组合多个点:物体上的多个点可以共享相似运动,帮助模型理解刚体平移;背景/边界上的点可以形成相机 pan 或 zoom;局部点可以给出 brush-like deformation。潜在风险是如果用户给出的轨迹与图像语义冲突,Gaussian 注入只能提供软约束,不能保证严格物理可行。例如论文报告,极快运动和要求物体拆分的轨迹仍可能失败。

3.4 Tail Dropout Regularization

论文观察到一个训练标签带来的偏差:真实 tracked point 如果离开轨迹或不可见,标签中会被标成 occluded / out-of-frame;模型可能学到“轨迹结束 = 应生成遮挡物”的错误关联,导致用户轨迹提前结束时,最终标注帧附近出现多余遮挡或不自然物体。为缓解这一点,ATI 引入 Tail Dropout Regularizer。训练时以概率 随机采样一个 dropout frame: 之后把该点在 之后的 visibility 置为 0,相当于人为模拟“用户不再提供后续轨迹,但不是因为物体必须被遮挡”。官方代码也实现了这一逻辑:patch_motion()training=Truetail_dropout>0 时,随机生成 rand_rr 作为截断时间,并用 rrange < rand_rr 控制后续 visibility。推理时 wan/image2video.py 调用 patch_motion(..., training=False),因此不会随机截断用户轨迹。

3.5 Data collection and trajectory representation

训练数据来自视频轨迹标注。论文先处理 5 million high-quality video clips,过滤掉 scene cuts 并满足审美标准,再选择其中 2.4 million 个具有强物体运动的视频片段。对每个选中片段,作者在首帧均匀采样 个点,并用 TAP-Net 跟踪这些点在整个 clip 中的位置。每个点在每帧保存二维坐标 与 visibility 。训练时每个视频随机选择 1 到 20 个点作为条件。

官方实现中的 wan/utils/motion.py::process_tracks() 体现了推理轨迹格式:输入轨迹数组包含二维坐标和可见性,坐标除以 quant_multi=8 后按图像短边归一化到以图像中心为原点的范围;visibility 从 映射到 ;最后拼接一个从 -1 到 1 的 normalized time channel,并把 121 帧输入转换为模型使用的 81 帧轨迹。这个转换说明 ATI 对轨迹的时间采样有固定假设:原始工具/文件可以存 121 个时间点,但 I2V 推理实际与 81 帧视频生成对齐。

3.6 PyTorch-style pseudocode(基于官方代码)

def ati_condition(image, tracks, vae, temperature=220.0, topk=2):
    # image: first frame, tracks: (B, T, N, 4) = time, x, y, visibility
    y = vae.encode(concat(first_frame=image, blank_future_frames=True))
    mask_and_latent = concat(first_frame_mask(), y)  # 4 mask channels + 16 latent channels
 
    time, xy, visible = split_tracks(tracks)
    xy_norm = normalize_by_short_edge(xy).clamp(-1, 1)
    visible = visible.clamp(0, 1)
 
    # align video-frame tracks to latent temporal cells
    xy_latent, vis_latent = temporal_pool_future_tracks(xy_norm, visible, group_size=4)
    grid = make_latent_xy_grid(mask_and_latent.height, mask_and_latent.width)
    dist2 = ((xy_latent[:, None, None] - grid[None, :, :, None]) ** 2).sum(-1)
    weights = torch.exp(-dist2 * temperature) * vis_latent[:, None, None]
    weights_topk, index_topk = torch.topk(weights, k=min(topk, weights.shape[-1]), dim=-1)
 
    first_latent_feature = mask_and_latent[4:, :1]  # first-frame VAE features
    point_feature = F.grid_sample(first_latent_feature, xy_norm[:, :1], mode="bilinear")
    injected = weighted_scatter(point_feature, weights_topk, index_topk)
 
    mixed_future = injected + original_future_latent(mask_and_latent) * (1 - weights_topk.sum(-1).clamp(0, 1))
    return concat_motion_mask_and_features(mixed_future)

Code reference: main @ 1a002caf (2025-08-07) — pseudocode and mapping based on this commit.

Paper ConceptSource FileKey Class/Function
Gaussian trajectory feature injectionwan/modules/motion_patch.pypatch_motion, merge_final
Track bytes / npz to model tensorwan/utils/motion.pyget_tracks_inference, process_tracks
I2V condition latent + ATI injectionwan/image2video.pyWanATI.generate
YAML batch inference entrygenerate.pygenerate(args)
ATI task and resolution configwan/configs/__init__.pyWAN_CONFIGS, SUPPORTED_SIZES
User trajectory toolstools/trajectory_editor/local trajectory editor app
Motion transfer track extractiontools/get_track_from_videos.pyvideo-to-track preprocessing

代码搜索结论:已找到官方实现 https://github.com/bytedance/ATI,默认分支 main,当前检索到的 HEAD 为 1a002caf(2025-08-07)。仓库 README 说明它是 Wan2.1 ATI 的官方实现,并列出相对原 Wan2.1 新增/修改文件。训练完整脚本、Seaweed-7B 训练实现和论文中的 5M/2.4M 数据处理流水线在该仓库中没有作为完整可复现实验训练代码直接给出;公开代码主要覆盖 Wan2.1 ATI 推理、轨迹编辑、轨迹可视化和 motion transfer 工具。

4. Experimental Setup(实验设置)

实验把 ATI 接入两个视频生成框架:Seaweed-7B 和 Wan2.1-14B。两者都基于预训练 I2V 模型,并在 preprocessing stage 与 patchify layer 之间注入 trajectory instruction。训练设置方面,论文写明对两个模型都 fine-tune all DiT parameters 50,000 iterations,使用 64 张 80GB VRAM GPU;其他训练超参数沿用标准 I2V fine-tuning setup。论文还指出 15,000 iterations 后两种模型都能达到较满意的 trajectory-following performance。推理时间方面,Seaweed-7B ATI 和 Wan2.1-14B ATI 都可以在约 8 GPU-minutes 内生成 5 秒 480p 视频。

Wan2.1 变体有一个实现细节:首帧 RGB 图像之后插入 black frames,再把这一 RGB sequence 输入 VAE encoder 提取 latent features。因此 latent stream 中包含与黑帧对应的特征;ATI 根据 Gaussian probability scheme 把 trajectory instruction features 与这些 black-frame VAE features 混合。这与官方 wan/image2video.py 一致:代码在首帧 tensor 后拼接 torch.zeros(3, F - 1, h, w),编码后再调用 patch_motion()

交互式轨迹编辑器也是实验/应用设置的一部分。用户可以在单张输入图上画自由轨迹,放置静止点表示不应移动的区域,用 circular trajectory 表示 zoom-in / zoom-out,用 pan speed 给选中点或所有点添加水平/垂直相机运动。README 明确提示 editor 的 app.py 应只在 localhost 运行,避免远程服务器暴露安全风险。这个工具的重要性在于它让“任意轨迹”成为实际可用的输入,而不是只存在于论文公式里的坐标数组。

Figure Object Motion 解读:左侧是在输入图上叠加的用户轨迹,绿色点表示轨迹起点,箭头表示终点,终点颜色编码轨迹长度。右侧是均匀采样的生成帧。这个实验展示了 ATI 对物体级运动和局部形变的控制能力。

Figure Camera Control 解读:把一组点从图像中心向外移动可以形成 zoom-in;把 radial motion 与水平平移组合可以改变 zoom 的目标区域;在主体上加静止轨迹而让背景执行 zoom,可以形成类似 dolly-zoom 的效果。论文也指出,如果所有轨迹只是平面平移或缩放,生成内容可能保持静态,表现为纯 2D camera movement。

Figure Combined Control 解读:这里展示同时控制相机和物体运动。用户可以先画相机运动轨迹,再编辑部分轨迹为物体运动;也可以先定义物体轨迹,再对这些轨迹叠加相机运动变换。该设置检验了 ATI 统一轨迹接口的核心价值。

定量评估使用 100 个 image-trajectory pairs。每张图由人工绘制 1 到 10 条点轨迹。对生成视频,作者用 TAP-Net 从首帧用户输入点开始跟踪,并计算 TAP-Net 输出与 ground-truth 用户轨迹的逐帧距离 。三个指标分别是:Acc@0.01,即点距离小于图像对角线 的帧比例;Acc@0.05,即点距离小于图像对角线 的帧比例;Appearance Rate,即当用户指定轨迹存在时,tracker 正确预测点可见的帧比例。所有指标都在测试集上取平均。

5. Experimental Results(实验结果)

定性结果显示,ATI 能覆盖三类控制:object motion、camera control、simultaneous camera/object motion。Figure Object Motion 中,轨迹长度可以不同,说明用户不需要让所有点贯穿整段视频。Figure Camera Control 中,radial outward trajectories 对应 zoom-in,horizontal translation 对应 pan,静止主体点加背景 zoom 形成 dolly-zoom。Figure Combined Control 中,物体运动与相机运动可以叠加,说明统一轨迹表示不仅简化用户接口,也允许多种运动约束同时作用。

Figure Comparison 解读:论文比较了 Wan2.1 ATI 与 Seaweed ATI 的可视化结果。作者观察到 Seaweed ATI 的 trajectory-instruction-following ability 略好,可能与输入 latent 的 zero-conditioning 差异有关;Wan2.1 ATI 在未受轨迹约束的位置上呈现更丰富的运动。这个结论提醒读者:ATI 是一种条件注入机制,最终效果仍受底座视频模型的运动先验、VAE latent 表示和 I2V conditioning 方式影响。

论文给出的定量表如下:

ATI Base ModelAcc@0.05Acc@0.01App. Rate
Seaweed-7B59.036.067.9
Wan2.1-14B55.934.765.5

这组数字说明 Seaweed-7B ATI 在三个指标上均略高于 Wan2.1-14B ATI:Acc@0.05 高 3.1 点,Acc@0.01 高 1.3 点,Appearance Rate 高 2.4 点。由于两个底座都使用同一类 trajectory instruction 思路,差异更可能来自底座模型与 conditioning 细节,而不是 ATI 公式本身完全不同。论文没有提供标准误差或显著性检验,也没有给出与 DragNUWA、MotionCtrl、商业产品等的同表数值对比,因此不能从正文定量表直接推断对所有 prior 的数值优势。

论文报告的成功现象包括:ATI 能处理相交点轨迹,即不同 tracking points 在某些时间步重叠时仍可生成合理视频;模型有时会寻找“替代但真实”的解来满足轨迹,例如当直接进行不合理物体形变较难时,模型可能通过相机旋转来满足用户给出的位移。这体现了生成模型的优点和风险:它不是刚性轨迹模拟器,而是在轨迹约束与视觉真实感之间寻找可生成的视频解释。

主要失败案例有两类。第一是极快运动,例如一个点在两帧内移动半个图像宽度,这会让模型难以准确跟随轨迹。原因可能是底座视频模型的运动先验、训练数据中高速位移的稀缺性,以及 Gaussian 注入在 latent 时间分辨率上的平滑都会限制瞬时大位移。第二是要求物体拆分的轨迹,例如强迫一个物体分成多个部分,模型可能不跟随轨迹或生成不自然畸变,论文举例为额外猫头。这个限制说明 ATI 控制的是 2D feature trajectories,不等价于具备物体拓扑编辑或物理切割能力。

从可复现角度看,公开代码对应用落地更友好:它提供 Wan2.1 ATI 推理、Hugging Face 模型下载路径、run_example.sh、YAML batch 输入、轨迹编辑器、输入/输出轨迹可视化和 motion transfer 工具。研究复现层面仍有缺口:论文中 5M clips 到 2.4M motion clips 的过滤细节、TAP-Net 批量标注流水线、Seaweed-7B 实现、全量 fine-tuning 脚本和完整训练超参没有在官方仓库中完整展开。因此这篇论文适合被理解为“实用的 trajectory-conditioned I2V 控制框架 + 已发布 Wan2.1 推理实现”,而不是一个完全开源训练 recipe。

综合评价:ATI 的价值在于把视频运动控制的交互抽象降低到“画轨迹”,同时把轨迹落实为 latent-space feature injection,而不是只作为 prompt 或外部后处理。对 Physical Video Generation 来说,它提供了一种轻量、可编辑、可和现有 I2V backbones 结合的运动条件接口。它的边界也很清楚:轨迹是软约束,不保证严格物理一致;复杂拓扑变化、高速运动、不可行的三维结构变化仍可能失败;论文定量评估规模较小,且没有给出与先前方法或商业系统的同表数值对照。若后续工作要继续推进,一个自然方向是把 ATI 与 3D/scene-level representation、物体分层跟踪、物理可行性判别或 RL-based trajectory reward 结合,让模型不仅跟随 2D 点,还能理解更高层的实体与相机几何。