Context Unrolling in Omni Models

1. Motivation (研究动机)

Omni 要解决的是当前”统一多模态模型”普遍只做能力聚合、却没有建立起跨模态推理机制这一结构性缺陷。

  • 现有方法的问题:现今的 unified multimodal 模型(BAGEL、Emu3.5、AnyGPT、4M、UniVAL、Ming-Omni 等)把多个模态塞进一个共享的 backbone,更多只做到了”multi-task container”——在一个网络里同时支持 understanding、image gen、edit,但各任务彼此独立,预测一般是直接的 映射。这种做法有两个明显短板:

    • 单模态输出忽略了其他模态携带的互补信息。例如做 T2I 生成时如果只依赖 text prompt,GenEval-2 上的 compositionality 分数会在 prompt 复杂度上升时急剧下滑(Omni baseline 在 GenEval-2 上只有 29.25 分,短 text thinking 加进来即提升到 37.35)。
    • 空间/几何推理能力严重不足。纯 text-only CoT 做 3D spatial 问题时,对 viewpoint 变换、遮挡等几何歧义束手无策(MMSI-Bench 上 Omni 直接预测只有 27.14 分;Motion 类别甚至是 0.0)。
  • 论文要解决的问题:提出 Context Unrolling 这一显式的推理机制——让 unified model 在产生最终输出之前,主动调用若干原子原语(atomic primitives),把它们产生的中间结果(text CoT、visual tokens、camera pose、novel views、depth map)作为异构 context 写入共享 workspace,再基于这个扩展后的 context 做条件推理。同时配套发布 Omni——一个原生训练在 text/image/video/3D geometry/hidden representation 上的 MoE 统一模型(3B active parameters),证明 context unrolling 可以作为涌现能力被利用。

  • 为什么值得研究:Context Unrolling 统一了两条以往并行发展的思路:multimodal CoT(文本链式思维)和 chain-of-visual-tokens(视觉展开)。它把 unification 从”多任务共用骨干”升级为**“多模态原子能力的可组合推理系统”**,为未来 RL 训练(学习何时/如何构建 context)、world model、multimodal agent 都打开了接口。作者以 GenEval-2 / MMSI-Bench / depth estimation 等多个基准为证据显示:同样的模型权重,通过给定更多 context,性能可以从 29.25 涨到 53.44(GenEval-2),从 27.14 涨到 34.17(MMSI),深度 δ₁ 从 83.21% 涨到 84.01%。


2. Idea (核心思想)

核心洞察:一个 unified multimodal model 的真正价值不是把 understanding/generation/3D 打包进同一个 backbone,而是让每种能力变成一个可被调用、可被组合、可被写回 context 的原子 primitive,从而把”直接推理”升级为”上下文构造后再推理”(context-conditioned inference)。

形式化地,作者把推理建模为两阶段——迭代的 context 构造 + context 条件解码(论文 Eq. 1):

其中 是多模态输入, 是某种原子原语(如 “describe”、“predict pose”、“roll out visual tokens”、“synthesize novel view”、“estimate depth”), 是 context composition, 是 T 步展开后的终态 context,最后由解码函数 基于 产生输出

与现有方法的根本区别

  • BAGEL(Omni 的直接前身)相比:BAGEL 把 understanding/gen/edit 放在同一个 MoT 架构里共享 backbone,支持 “think before generation”;Omni 则把训练模态扩展到 3D geometry(camera pose、depth)和 hidden representation,并把 context 构造本身当成一个可度量的能力轴——在 4 类任务上分别做 context ablation(baseline vs +thinking vs +textual context vs +visual context),验证 context 长度和结构的贡献远大于单纯的参数共享。
  • Emu3.5/Ming-Omni/AnyGPT 这类 “tokenize everything” 的 autoregressive 统一模型相比:它们把多模态塞进同一 token 序列,但从不显式建立”先产生中间模态、再产生最终答案”的 pipeline;Omni 通过 chain-of-thought 风格的 rollout 显式让 text-thinking、depth-caption、novel-view-synthesis 成为可插拔的 intermediate context。
  • Qwen3-VL/InternVL3.5 这类 VLM 相比:VLM 主要是 I→T 的单向理解模型,做不了 visual rollout;Omni 在相近参数规模(3B active)下能够兼顾 VLM 级的理解能力(AI2D 91.5、DocVQA 92.8)和专家级的生成能力(GenEval-2 54.12 超过 Z-Image 41.83)和 3D 几何能力(RealEstate10K pose AUC@30 达到 88.32,打平 VGGT 的 88.23)。

3. Method (方法)

3.1 Overall framework(整体框架)

Figure 1 解读:图像化比喻——Omni 是一个”双贝果”结构:左侧贝果代表输入端包含 Image、Video 两大原始模态;右侧贝果代表输出端包含 Text、3D geometry 等结构化模态;连接两者的中间枢纽是”Hidden Representation”——这是 Omni 独有的latent reasoning space,用来承载跨模态的潜变量推理。整个模型把所有这些模态统一成一个原生多模态训练目标(natively trained),任务-agnostic 地学习 shared multimodal knowledge manifold

Omni 的架构沿用 BAGEL 的设计哲学——Mixture-of-Transformer-Experts (MoE),但在以下几个维度做了扩展:

维度BAGELOmni
激活参数7B active / 14B total3B active(MoE)
训练模态text + imagetext + image + video + 3D geometry + hidden representation
能力范围und, gen, edit(单图场景)+ video gen/edit, 3D pose/depth, spatial reasoning
Context typestext CoTtext CoT + visual tokens + depth caption + camera pose + novel view synthesis
推理方式直接预测 or text-think 预测Context Unrolling:

训练数据在 BAGEL 的 interleaved image-text 基础上加入reasoning-oriented multimodal content(长结构化描述、dense attributes、spatial grounding、depth maps、camera transformations),并引入 hidden reasoning space 作为专门的 latent 推理空间。

3.2 Key components(关键组件:4 个原子原语在 4 个任务上的效果)

Omni 的核心贡献是把 context unrolling 机制在四个不同任务上做了详细的逐级消融,每一个 ablation 都直接量化了每种 context primitive 对最终指标的贡献。

3.2.1 Visual Understanding — Text CoT as Context

对一个标准的 VLM 任务,允许模型先做 text-thinking(spontaneous CoT-style text rollout)再作答:

Table 1 (downsampled 理解 benchmark)

ContextBLINK↑MMStar↑MMBench-V11↑SimpleVQA↑AI2D↑Chartqa↑Docvqa↑HallusionBench↑Erqa↑MMSI↑
Omni (direct)60.859.476.250.490.285.593.569.641.531.5
+ thinking61.666.577.151.492.388.094.071.344.532.6

直觉:text-think 在 composition reasoning 最重要的 MMStar 上提升 +7.1 分、Chartqa +2.5、Erqa +3.0——CoT 并不是”装饰性文字”,它通过显式的 fine-grained 语义分解降低了推理歧义。但对 OCR-heavy 的 DocVQA,thinking 只带来 +0.5,说明 context 的贡献取决于任务是否有 composition 不确定性。

3.2.2 Visual Generation — Text + Visual Tokens as Context

GenEval2 解读:横轴是 context 类型的累加(Baseline → +Short Text → +Long Text → +Visual Token → +Short+Visual → +Long+Visual),纵轴是 GenEval2 总分。从 29.2 一路涨到 53.4,单点总增益 +24.2 分。关键观察:纯 text(+37.4 / +43.9)与纯 visual token(+48.0)已经各有可观贡献,而二者组合(+Long+Visual = 53.4)最强——说明textual 和 visual context 提供的是非冗余的、互补的约束

Table 2 (GenEval-2 主结果)

ContextTIFAGMObjectAttributeCountPositionVerb
Omni29.2591.6490.0052.0377.6726.25
+ short text37.3593.1892.4560.1476.9238.83
+ long text43.9491.8691.1367.0377.0338.31
+ visual48.0294.4292.9666.9279.2853.96
+ short + visual49.1693.1392.6868.3676.8343.34
+ long + visual53.4492.3492.3272.9880.2342.81
+ oracle text (Gemini-3 Pro)52.2095.7287.3567.9191.6943.31
+ oracle text + visual57.2194.7797.8969.4790.6456.00

Atomicity 子表(inhouse evaluation,衡量不同 compositional 复杂度下的鲁棒性)

ContextOverallObjectAttributeRelation
Omni0.560.600.580.53
+ short0.590.680.610.58
+ long0.610.720.640.57
+ visual0.610.700.650.62
+ short + visual0.640.740.650.62
+ long + visual0.660.740.690.64
+ oracle0.710.750.730.74
+ oracle + visual0.730.790.760.73

重要发现

  • Oracle 上限分析:当把 textual context 换成 Gemini-3 Pro 产生的高质量 rewrite,TIFAGM 直接到 52.20;再加 self-rollout 的 visual tokens 继续升到 57.21。即使在 oracle text 已经非常强的情况下,visual token context 仍然贡献 +5.0 分,证明两者的正交性。
  • Atomicity under compositional stress:在复杂度更高的 atomicity 测试中(prompt 要求多个原子约束),Overall atomicity 从 baseline 的 0.56 单调升到 +long + visual 的 0.66;若使用 Gemini-3 Pro oracle text 再叠加 visual tokens,继续涨到 0.73。Relation 子项增益最显著(0.53 → 0.64 → 0.73),说明 context unrolling 对空间/语义关系约束最敏感。

做法:short thinking 平均消耗 100 tokens,long thinking 消耗 250 tokens;visual tokens 是 Omni 自己 rollout 的 discrete visual tokens,携带显式的结构/布局信号。

3.2.3 Spatial Understanding — Geometry as Context

Figure (mmsi) 解读:MMSI spatial understanding 得分随 context 增强的单调上升。Baseline 27.1 → +General Thinking 28.1 → +Textual Contexts(camera pose)30.1 → +Visual Contexts(novel view synthesis)34.2。从 textual 到 visual 的一跳单独贡献 +4.1 分,是所有阶段里单步收益最大的。

Figure 3 解读:给定两张室内照片和问题”拍 photo1 时,黑色小沙发相对于我在哪里?“(正确答案 A: On your right),展示 4 种推理路径:

  • Baseline(direct predict):错答 C
  • With Thinking(text CoT):推理说 “photo 2 shows a sofa in front…” 最终仍错答 C——纯文本 CoT 无法解决视角变换歧义
  • With 3D Textual Context(relative camera pose):先调用 “Bakery” 原语生成 <campose>1.041259 0.007027 0.328047 -0.201365 -0.271789 -0.020875</campose> 相机相对运动,再 CoT “camera move right and turn left, so in the first image, it may in my right direction…” → 正确答 A
  • With 3D Visual Context(NVS):调用”Bakery”从 photo1 合成 Up/Down/Left/Right 四个方向的 novel views,CoT 基于“‘look right’ synthetic image shows the lounge chairs matching the real photo2’s right side” → 正确答 A

两种 3D context 都能把 baseline 失败的 case 救回来——几何信息通过文本(pose)或视觉(synthesized view)两种形式注入都有效,但 visual context 更强(34.17 vs 30.15)。

Table 3 (MMSI-Bench 200 题子集)

ContextOverallMSRMotionPositional Relationship
Omni27.1417.650.019.63
+ thinking28.1517.6533.3330.25
+ textural contexts (camera pose)30.1511.7633.3333.95
+ visual contexts (novel views)34.1726.4733.3335.80

3.2.4 3D Geometry — Depth Caption + Visual Tokens as Context

Figure (depth) 解读:δ₁ accuracy 从 83.2(baseline) → 83.3(+detailed caption,几乎无增益) → 83.9(+depth caption) → 84.0(+visual tokens)。注意 detailed caption(通用描述)不能帮到深度估计,只有task-relevant 的 “depth caption”(关注前后顺序、遮挡、支撑关系等空间线索)才有效。

Figure 4 解读:每一列展示一张 RGB 输入下的深度估计对比。第二行 “w/o. caption & visual tokens” 的 baseline 错估植物叶片(第一列)、遗漏天花板灯(第三列);第三行 “+depth caption” 帮助识别物体但仍然把灯光面和灯具误放在同一深度;第四行 “+visual tokens” 进一步分辨墙面前后关系,把照亮区域正确归到墙面深度。

Table 4

Contextδ1↑AbsRel↓
Omni83.21%0.2028
+ detailed caption83.27%0.2029
+ depth caption83.88%0.1988
+ visual contexts84.01%0.1970

关键教训:context unrolling 最有效时,context 必须task-relevant、constraint-like,而不是”啰嗦的描述”。verbose 不等于 useful。

3.3 Key formulas 总览

机制公式作用
Context Unrolling 迭代逐步累积 context
Context-conditioned decoding最终输出基于终态 context
Depth formulation深度估计从 I→D 直接映射变成 context 条件推理

3.4 Pseudocode(伪代码)

关于代码可用性:Omni 本身尚未单独开源(截至论文发布仅为 Seed 内部 technical report),但作者明确声明 “following the design philosophy of BAGEL”;BAGEL 完整开源在 ByteDance-Seed/BAGEL。以下伪代码主体参考 BAGEL 的结构,Omni 扩展部分(3D geometry context、visual token rollout、hidden reasoning space)按论文描述补全。

Context Unrolling 推理主循环(基于论文 Eq. 1 的具体实现):

import torch
import torch.nn as nn
 
class OmniContextUnroller:
    """Implements C_{t+1} = C_t ⊕ φ_t(x, C_t) then y = ψ(x | C_T)."""
    
    def __init__(self, model, primitives: dict, tokenizer):
        self.model = model
        self.primitives = primitives
        self.tokenizer = tokenizer
    
    def unroll(self, x: dict, task: str, max_steps: int = 4):
        """
        x:       multimodal input dict, e.g., {"image": [...], "question": "..."}
        task:    'understanding' | 'generation' | 'spatial' | 'depth'
        Returns: final output y
        """
        context = {"text": [], "visual": [], "pose": None, "views": None,
                   "depth_caption": None}
        plan = self._plan_for_task(task, x)
        
        for t, phi_name in enumerate(plan[:max_steps]):
            phi = self.primitives[phi_name]
            result = phi(x, context, self.model)
            context = self._compose(context, phi_name, result)
        
        y = self._decode(x, context)
        return y, context
    
    def _plan_for_task(self, task, x):
        """Omni's heuristic context schedule per paper Section 2."""
        if task == "understanding":
            return ["text_think"]
        elif task == "generation":
            return ["text_think_long", "visual_token_rollout"]
        elif task == "spatial":
            return ["camera_pose_estimate", "novel_view_synthesis", "text_think"]
        elif task == "depth":
            return ["depth_caption", "visual_token_rollout"]
        else:
            raise ValueError(f"Unknown task: {task}")
    
    def _compose(self, context, phi_name, result):
        if phi_name in ("text_think", "text_think_long", "depth_caption"):
            context["text"].append(result)
        elif phi_name == "visual_token_rollout":
            context["visual"].append(result)
        elif phi_name == "camera_pose_estimate":
            context["pose"] = result
            context["text"].append(f"<campose>{result}</campose>")
        elif phi_name == "novel_view_synthesis":
            context["views"] = result
            context["visual"].append(result)
        return context
    
    def _decode(self, x, context):
        merged_prompt = self._merge_context_into_prompt(x, context)
        return self.model.generate(merged_prompt)
    
    def _merge_context_into_prompt(self, x, context):
        pieces = [x.get("question", "")]
        for txt in context["text"]:
            pieces.append(f"<think>{txt}</think>")
        for vis in context["visual"]:
            pieces.append(f"<visual_tokens>{vis}</visual_tokens>")
        return " ".join(pieces)

Atomic primitives(论文提到的 5 个)

def text_think(x, context, model, max_new_tokens=100):
    """Short thinking (~100 tokens) for understanding / generation."""
    prompt = f"{x['question']}\nThink step by step:"
    return model.generate_text(prompt, max_new_tokens=max_new_tokens)
 
 
def text_think_long(x, context, model, max_new_tokens=250):
    """Long thinking (~250 tokens) with structural layout for T2I."""
    prompt = (f"Describe the target image in detail including attributes, "
              f"counts, spatial relations, and coarse layout:\n{x['prompt']}")
    return model.generate_text(prompt, max_new_tokens=max_new_tokens)
 
 
def visual_token_rollout(x, context, model, n_tokens=1024):
    """Roll out discrete visual tokens that carry structural cues.
    These are Omni's self-predicted visual representations used as additional
    conditioning for downstream decoding."""
    visual_tokens = model.rollout_visual_tokens(
        prompt=x.get("prompt") or x.get("question"),
        text_context=context["text"],
        n_tokens=n_tokens,
    )
    return visual_tokens
 
 
def camera_pose_estimate(x, context, model):
    """3D textual context: estimate relative camera pose from two images."""
    assert len(x["image"]) >= 2
    pose = model.predict_camera_pose(x["image"])
    return pose
 
 
def novel_view_synthesis(x, context, model):
    """3D visual context: synthesize up/down/left/right views from input."""
    directions = ["up", "down", "left", "right"]
    views = {}
    for d in directions:
        views[d] = model.synthesize_view(x["image"][0], direction=d)
    return views
 
 
def depth_caption(x, context, model, max_new_tokens=150):
    """Task-relevant geometric caption: front/back ordering, occlusion, support."""
    prompt = (f"Describe only the spatial/depth structure of this image: "
              f"front/back ordering of objects, occlusion, support/contact.")
    return model.generate_text(prompt, image=x["image"][0],
                                max_new_tokens=max_new_tokens)

Context-conditioned generation(基于 BAGEL 的 flow-matching 生成主流程):

def context_conditioned_generate_image(model, prompt, text_context_list,
                                         visual_token_context, n_steps=50):
    """Unified flow-matching generation with text + visual context.
    Follows BAGEL's generation pipeline, but conditioned on multiple context
    streams in the transformer cross-attention."""
    
    text_ids = model.tokenize(prompt + " " + " ".join(text_context_list))
    text_emb = model.embed_text(text_ids)
    
    if visual_token_context is not None:
        vis_emb = model.embed_visual_tokens(visual_token_context)
        cond_emb = torch.cat([text_emb, vis_emb], dim=1)
    else:
        cond_emb = text_emb
    
    latent = torch.randn(model.latent_shape, device=model.device)
    for t in torch.linspace(0, 1, n_steps):
        velocity = model.dit(latent, timestep=t, condition=cond_emb)
        latent = latent + (1 / n_steps) * velocity
    
    image = model.vae_decode(latent)
    return image

Training objective(Omni 扩展 BAGEL 的联合目标,按论文描述):

def omni_training_step(model, batch, config):
    """Omni training mixes text CE, image/video MSE (flow matching), and 
    3D geometry objectives. Based on BAGEL's pretrain_unified_navit.py."""
    
    loss_dict = model(**batch)
    
    ce_loss = loss_dict["ce"]
    loss = 0.0
    if ce_loss is not None:
        loss = loss + config.ce_weight * ce_loss
    
    mse_loss = loss_dict["mse"]
    if mse_loss is not None:
        loss = loss + config.mse_weight * mse_loss
    
    if "pose_loss" in loss_dict:
        loss = loss + config.pose_weight * loss_dict["pose_loss"]
    if "depth_loss" in loss_dict:
        loss = loss + config.depth_weight * loss_dict["depth_loss"]
    
    return loss, loss_dict

3.5 Code-to-paper mapping table

Code reference: main @ 056b5fd5 (2025-10-27) — 伪代码与映射基于 BAGEL 仓库此次 commit;Omni 本身未单独开源,其扩展部分(3D primitives、hidden reasoning space、context unrolling 推理流)以论文描述为准。

Paper ConceptSource FileKey Class/Function
统一 MoE backbone(Omni 继承 BAGEL)modeling/bagel/bagel.pyBagel
Qwen2 NaViT 语言+视觉混合 backbonemodeling/bagel/qwen2_navit.pyQwen2ForCausalLM / Qwen2Model(含 Qwen2MoTDecoderLayerQwen2MoEDecoderLayerPackedAttention(MoT)
SigLIP NaViT 视觉编码器modeling/bagel/siglip_navit.pySiglipVisionModel(内部 SiglipVisionTransformer + RotaryEmbedding2D
统一训练目标(CE + MSE)train/pretrain_unified_navit.pymain()(训练循环中的 loss_dict["ce"] + loss_dict["mse"]
VAE autoencodermodeling/autoencoder.pyAutoEncoder
Inference pipelineinferencer.py主入口
缓存/Taylorseermodeling/cache_utils/taylorseer.pyTaylorseer
Context Unrolling 主流程(Omni 新增)论文 Section 2,未开源Eq. 1 的迭代实现
3D primitives(pose、NVS、depth)(Omni 新增)论文 Section 3.4,未开源参见 VGGT、Depth-Anything-3 作为能力对标

4. Experimental Setup (实验设置)

  • 数据集(论文 Section 3 分维度评测):

    • Multimodal Understanding: BLINK、MMStar、MMBench-v11、VlmsAreBlind、SimpleVQA、RealWorldQA、TextVQA、AI2D、ChartQA、DocVQA、HallusionBench、MuirBench、ERQA、MMSI-Bench、MVBench、Video-MME
    • Image Generation: GenEval-2、DPG、LongText-EN、LongText-CN、Inhouse eval;Editing 用 GEdit-Bench-EN
    • Video Generation: VBench1.0(T2V)、FiVE Benchmark(video editing)
    • 3D Geometry: RealEstate10K、CO3Dv2(camera pose)、NYU/KITTI/SINTEL/ETH3D/DIODE(monocular depth)
    • Context Unrolling 消融(Tables 1–4): downsampled understanding benchmark、200 题 MMSI 子集、深度估计 benchmark
  • Baseline 方法

    • 理解 VLM: Qwen3-VL-30B-A3B-Instruct、InternVL3.5-30B-A3B(均用同一 Qwen3-30A3 LLM 骨干,便于公平对比)
    • T2I: Qwen-Image、Z-Image、Flux.2-klein-9B
    • Image Editing: Flux-Kontext-dev、Step1X-Edit-v1.1/v1.2、Emu-3.5、Z-Image-Edit、Qwen-Image-Edit
    • T2V: Wan2.1、Hunyuan Video
    • Video Editing: TokenFlow、DMT、VidToMe、AnyV2V、VideoGrain、Pyramid-Edit、Wan-Edit
    • Camera pose: Flare、Cut3r、VGGT
    • Depth: Marigold、Cut3r、Depth-Anything-3(DA3 giant)、VGGT
    • Oracle text context: Gemini-3 Pro(zero-shot rewriting)
  • 评估指标

    • 理解: 各 benchmark 的 accuracy 或 F1 分数
    • 生成: GenEval-2 TIFAGM、DPG 总分、LongText-EN/CN 分数、GEdit-Bench-EN 的 G_SC(语义一致性)、G_PQ(感知质量)、G_O(总体)
    • 视频: VBench Total/Quality/Semantic score;FiVE 的 Structure dist、PSNR、LPIPS、SSIM、CLIPS、Fid S、YN/MC 偏好、∪/∩ 准确
    • 3D pose: AUC@30、RPE trans、RPE rot(越低越好)
    • 深度: δ₁(越高越好)、AbsRel(越低越好)
  • 训练配置:论文未公布完整训练细节。已知:

    • 架构: MoE,3B active parameters(总参数未公开,预期 > 14B)
    • 设计哲学基于 BAGEL(7B active / 14B total),继承其 MoT + NaViT 结构
    • 原生训练数据跨 text / image / video / 3D geometry / hidden representation
    • 输出分辨率: video 仅支持 480×640, 12s duration(作者承认离 SOTA 视频生成模型仍有差距)

5. Experimental Results (实验结果)

5.1 Multimodal Understanding (Table 5)

BenchmarkQwen3-VL-30B-A3BInternVL3.5-30B-A3BOmni
BLINK67.760.463.0
MMStar78.472.063.8
MMBench-v1178.484.875.3
VlmsAreBlind67.5-76.4
SimpleVQA52.7-53.3
RealWorldQA73.772.376.0
TextVQA-80.581.0
AI2D85.086.891.5
ChartQA86.887.486.9
DocVQA95.094.292.8
HallusionBench61.553.870.1
MuirBench73.053.164.2
ERQA51.341.545.0
MMSI-Bench30.327.531.5
MVBench72.372.168.4
Video-MME (w/o sub)74.568.767.2

关键观察:Omni 在 AI2D、HallusionBench、RealWorldQA、VlmsAreBlind、MMSI-Bench 这五个”需要真实世界 / 空间推理”的 benchmark 上超过 Qwen3-VL(同 LLM backbone、同激活量级),其中 HallusionBench +8.6、VlmsAreBlind +8.9、AI2D +6.5。但在纯文本密集型 benchmark(MMStar、MMBench、DocVQA)上落后于经过重型 post-training 的 Qwen3-VL,作者归因于”no heavy post-training and distillation”。

5.2 Image Generation (Table 6)

ModelGenEval2↑DPG↑LongText-EN↑LongText-CN↑Inhouse↑
Qwen-Image30.6788.3294.394.655.16
Z-Image41.8388.1493.593.655.19
Flux.234.5983.8460.70.549.91
Omni54.1288.5597.596.863.87

GenEval2 54.12 vs Z-Image 41.83 的优势达 +12.3 分,这是论文最大的生成侧亮点。

Image Editing (GEdit-Bench-EN)

ModelG_SCG_PQG_O
Flux-Kontext-dev7.167.376.51
Step1X-Edit-v1.17.667.356.97
Step1X-Edit-v1.27.777.657.24
Emu-3.58.117.707.59
Z-Image-Edit8.117.727.57
Qwen-Image-Edit8.157.867.54
Omni8.427.857.75

5.3 Video Generation (Tables 7 & 8)

T2V on VBench1.0:

ModelTotal↑Quality↑Semantic↑
Wan2.183.6985.5976.11
Hunyuan Video83.4385.0776.88
Omni83.3583.1184.29

Omni 在 Semantic score 上压倒性领先(+8.18 比 Wan2.1、+7.41 比 Hunyuan),但 Quality score 落后——作者坦承这是因为 Omni 分辨率限制在 480×640、只支持 12 秒。

Video Editing on FiVE Benchmark(Table 8,完整列展示,符号含义:Struct Dist ↓ 越小越好,PSNR ↑ 越大越好,LPIPS ↓,SSIM ↑,CLIPS ↑,CLIPS.edit ↑,Fid S ↑,YN ↑,MC ↑,∪ ↑,∩ ↑,Acc ↑):

MethodStruct Dist ×10³ ↓PSNR ↑LPIPS ×10³ ↓SSIM ×10² ↑CLIPS ↑CLIPS.edit ↑Fid S ×10² ↑YN ↑MC ↑∪ ↑∩ ↑FiVE Acc ↑
TokenFlow35.6219.06263.6172.5126.4621.1589.0019.3635.5136.6818.1827.43
DMT85.9514.71404.6051.6426.6621.4482.3034.7862.0662.9833.8648.42
VidToMe22.3721.15263.9170.6926.8421.0590.0620.0333.5036.2017.3426.77
AnyV2V71.3615.90348.5950.7724.8919.7260.3630.6245.4248.9627.0938.02
VideoGrain12.4027.05185.2179.1325.6920.3188.5730.5043.9744.3030.1737.23
Pyramid-Edit28.6520.84276.5971.7226.8220.2080.5933.6754.0156.3631.3143.84
Wan-Edit12.5325.5794.6182.5526.3921.2389.4341.4152.5355.7238.2246.97
Omni34.9422.95217.5573.7826.9221.1984.2262.8381.8184.3360.2372.41

视频编辑上 Omni 以 FiVE 总 accuracy 72.41 明显超过所有 baseline(次好 DMT 48.42 领先 +23.99 分),尤其在偏语义的 YN / MC / ∪ / ∩ 四个 instruction-following 维度上压倒所有 baseline(例如 ∩ 从 Wan-Edit 的 38.22 提到 60.23,绝对值几乎翻倍);而在纯结构保真的 Struct Dist / PSNR / LPIPS / SSIM 上 Wan-Edit 仍领先,说明 Omni 更偏向”按指令做正确编辑”而非”最大保留原视频像素”。

5.4 3D Geometry (Tables 9 & 10)

Camera Pose Estimation

MethodRealEstate10K AUC@30↑CO3Dv2 AUC@30↑
Flare84.4272.23
Cut3r85.3275.62
VGGT88.2386.23
Omni88.3275.21

Monocular Depth (δ₁)

MethodNYUKITTISINTELETH3DDIODE
Marigold92.7587.8762.2497.1281.64
Cut3r91.6486.4255.6495.3475.21
DA3 giant94.7893.9666.5498.7982.69
VGGT96.1094.2966.1198.3582.15
Omni96.2296.9274.2798.9183.83

Omni 在深度估计上5 个 benchmark 全部 SOTA,其中 KITTI +2.63、SINTEL +7.73 是显著提升。作者的解读是:depth prediction 不再是独立回归任务,而是”context-conditioned inference”——视觉 token rollout 提供的结构先验 + depth caption 的空间约束,让 unified model 在小参数规模下超过专门模型。

5.5 Ablation: Context Unrolling 的系统性收益

把 Tables 1–4 的 context unrolling 消融汇总成下表(取每个任务上 baseline 到最佳 context 的总增益):

任务Baseline → 最佳 context提升幅度
Visual Understanding (MMStar)59.4 → 66.5+7.1
Visual Generation (GenEval-2)29.25 → 53.44+24.19
Spatial Understanding (MMSI)27.14 → 34.17+7.03
3D Geometry (δ₁)83.21 → 84.01+0.80

可视化 context unrolling 的收益曲线

三张图共同证明了论文主张:context 的累积是单调贡献的,且 text 与 visual context 互补。特别是生成任务上 +24 分的增益比模型参数从 3B 到 7B 带来的收益大很多——这是支持”unified model 的价值在于 context unrolling 而非参数聚合”这一主张的最强证据。

5.6 作者自述的局限性

  • 视频生成侧:当前 Omni 只能产生 480×640 分辨率、12 秒时长的视频,落后于 Wan2.1 / Hunyuan 的 720p+ 能力。作者认为这是算力预算限制,未来 scale up 会改善
  • Oracle gap:GenEval-2 上 self-rollout context(53.44)仍低于 oracle text + visual(57.21),说明当前模型 rollout 出来的 context 本身存在 noise 和 hallucination,限制了 context unrolling 的上限
  • Object-centric 3D 场景:CO3Dv2 的 pose estimation 上 Omni 落后 VGGT(75.21 vs 86.23),作者归因于 3D 训练数据未充分覆盖 object-centric 场景
  • Post-training 尚未做:当前实验都是 supervised/standard evaluation,RL-style 训练(学习”何时调用哪个 primitive”的 policy)留作 future work

5.7 总体结论

Omni 的实验矩阵得出了三条一致的论断:

  1. “Unified ≠ Multi-task Container”:跨 4 个任务的 context ablation 共同说明,一个 unified model 的增量价值来自把各项能力作为原子 primitive 动态组装到 shared workspace 中,而不是单纯”一个骨干做多个事”。GenEval-2 +24 分、MMSI +7 分、MMStar +7 分,这些绝非仅靠参数共享能解释。
  2. Textual & Visual Context 是正交的:无论是 T2I 生成(Table 2 的 oracle + visual 比 oracle 单独再涨 +5)、spatial reasoning(+visual contexts 比 +textual contexts 再涨 +4)、还是 depth 估计(+visual tokens 对 +depth caption 的边际增益),都一致显示两者提供非冗余约束。
  3. Native multimodal pretraining 会涌现 context unrolling:这是一种 emergent capability——模型在训练中未被显式教”何时 think、何时 rollout visual tokens”,但自然学到了在合适任务上调用合适 primitive。这意味着未来 RL post-training 有巨大空间——学习一个”context-construction policy”,根据输入难度和任务类型自适应决定何时及如何展开 context。