# LLaVA-OneVision：单图、多图、视频于一个模型

> 在 LLaVA-OneVision（Li 等人，2024 年 8 月）之前，开放 VLM 的世界有几条分开的脉络：LLaVA-1.5 做单图，Mantis 和 VILA 这类做多图，Video-LLaVA 和 Video-LLaMA 这类做视频。每个赢下自己的基准，又在其他上面败北。LLaVA-OneVision 主张：一套课程就能训出一个模型，在全部三种场景上都占主导，而那些涌现的任务迁移效应（单图技能输出到视频、多图推理输出到单图）胜过各路专家之和。配方简单得有点骗人：一个跨场景保持恒定的视觉 token 预算，加上一套从单图到 OneVision（多图）再到视频的明确课程。本节课通读这个预算、这套课程，以及那些涌现行为。

**类型：** Build
**语言：** Python（标准库，token 预算求解器 + 课程规划器）
**前置要求：** Phase 12 · 05（LLaVA）、Phase 12 · 06（任意分辨率）
**预计时间：** ~180 分钟

## 学习目标

- 设计一个在单图、多图、视频输入下保持恒定的视觉 token 预算。
- 排出一套训练课程，把技能从单图迁移到视频而不发生灾难性遗忘。
- 解释为什么课程做对了，单个模型能在相同参数量下击败专家。
- 说出 LLaVA-OneVision 报告的三种涌现能力：多摄像头推理、set-of-mark prompting、iPhone 截图 agent。

## 问题背景

图像、多图、视频各自以不同方式给模型施压。

单图想要高分辨率 token（AnyRes，约 2880 个视觉 token）来抓住 OCR 和细节。每样本预算：一张图，2880 token。

多图想要若干张中等分辨率的图（每张约 576 token），好让跨图推理塞进上下文。每样本预算：4-8 张图，每张 576，共 2300-4600 token。

视频想要很多帧低分辨率的图（池化后每帧约 196 token）来捕捉时间动态。每样本预算：8-32 帧，每帧 196，共 1600-6200 token。

如果你训分开的模型，就挑一个预算。如果你训一个模型，就需要预算在跨场景时合理地伸缩而不撑爆上下文。

OneVision 之前，默认答案是"训一个场景，无视其他"。Video-LLaVA 靠额外训练阶段把视频后装到一个图像模型上。LLaVA-NeXT 用切块加了多图支持。没有谁能干净地搞定全部三个。

## 核心概念

### OneVision token 预算

LLaVA-OneVision 挑了一个统一的视觉 token 预算，每样本约 3000-4000 token，按场景做不同分配：

- 单图：AnyRes-9（3x3 tile + 缩略图），每个 tile 在 384 下 729 个 patch，激进的 2x2 双线性池化 → 每 tile 182。总计：9 * 182 + 182 = 1820 token。或 AnyRes-4 每 tile 729 = 2916 + 729。
- 多图：每张图中等分辨率（384，不切块），729 token 不池化。预算 6 张图 → 4374 token。
- 视频：32 帧 384 分辨率，配激进的 3x3 双线性池化 → 每帧 81 token。总计：32 * 81 = 2592 token。

这个分配让总 token 大致恒定。LLM 永远不会看到一个撑爆它上下文的 batch。编码器按场景产出不同的几何形状，但 LLM 消费的是同一份预算。

### 三阶段课程

LLaVA-OneVision 分三阶段训练：

1. 单图 SFT（SI 阶段）。全部数据都是单图加文本。在高分辨率 AnyRes 输入上训练。这教会感知、OCR 和细粒度理解。用 LLaVA-NeXT 数据加 OneVision 专属的单图数据。
2. OneVision SFT（OV 阶段）。混合单图 + 多图 + 视频（均匀采样帧）。在统一 token 预算上训练。这教会模型处理异质的 batch 形状。不重置权重——从 SI 阶段接着来。
3. 任务迁移（TT 阶段）。继续在一个目标任务配比上训，通常按产品偏重多图或视频。可选的部署微调。

关键：课程顺序很要紧。先训视频或先训多图，比先训单图产出的图像性能更差，即便数据相同。论文对此做了明确消融。

### 课程为什么有效

单图训练打下感知基础。patch token 携带细粒度视觉特征；LLM 学会把它们与文本整合。多图和视频引入结构性挑战（哪张图是哪张、什么先发生），没有强感知基础很难学。

如果你把所有场景从头一起训，模型对感知欠拟合（每个 batch 里单图数据有限）、对结构过拟合（大量多图/视频数据）。结果是：一个会遵循跨图推理模式但视觉上很浅的模型。

课程排序让你从 SI 阶段拿到感知强度，再从 OV 阶段拿到组合/时间推理，两者都不丢。

### 涌现的跨场景技能

LLaVA-OneVision 论文报告了三种涌现能力：

1. 多摄像头推理。分开在多图 + 视频上训练；推理时被要求推理一个多摄像头的驾驶场景。尽管训练中从没见过这种确切格式，模型仍正确整合了这些视角。
2. set-of-mark prompting。用户用编号标记标注图中的物体；模型推理"标记 3 相对于标记 7 在做什么"。既没在标记上训、也没在标注上训；从空间 grounding + 多图引用的组合中学到。
3. iPhone 截图 agent。用户给一张 iPhone 屏幕截图，要求规划下一次点击。在 UI 截图、用户工作流视频和多图前后对上训过。泛化到了 agent 用例。

这些不是被训练的任务；它们从课程的组合结构里涌现出来。

### 视觉 token 池化

token 预算需要池化。OneVision 在二维 patch 网格上用双线性插值：24x24 = 576 个 patch 变成 12x12 = 144（2 倍）或 8x8 = 64（3 倍）。池化在 patch 网格空间里做，而非 token 空间，以保留局部性。

每个场景的池化倍数本身就是个超参数。池化越少 = token 越多 = 表示越丰富。池化越多 = token 越少 = 塞得下越多帧/图。

### LLaVA-OneVision-1.5

2025 年的续作（LLaVA-OneVision-1.5，arXiv 2509.23661）在训练数据、模型权重和代码上都"完全开放"。在部分基准上追平了与专有模型的差距，并使这套配方民主化。同样的课程，更多的数据，更好的基座 LLM。无架构改动。

### 与 Qwen2.5-VL 的对比

Qwen2.5-VL（第 12.09 课）做了不同选择。它用 M-RoPE 和动态 FPS，而非固定池化。它的预算随输入伸缩——一段 1 分钟视频比一段 5 秒视频用更多 token。LLaVA-OneVision 固定预算、伸缩池化。两者都有效；它们在可配置性和可预测性之间做了不同取舍。

## 实际使用

`code/main.py` 是一个面向 OneVision 式 VLM 的课程与预算规划器。给定每样本的 token 预算和一个目标场景配比（比如 40% 单图、30% 多图、30% 视频），它：

- 为每个场景分配分辨率、池化倍数和帧数。
- 检查每个场景都塞进共享预算。
- 报告预期 token 数、LLM FLOPs，以及哪些场景 token 不足。
- 打印一份逐阶段的训练计划。

用它来规划一次 OneVision 微调，或者给一个 VLM 部署的每请求成本做合理性检查。

## 拿去用

本节课产出 `outputs/skill-onevision-budget-planner.md`。给定一个目标任务分布和一个每样本预算，它产出 AnyRes 倍数、每帧池化、视频帧数和课程阶段权重。每当你训练或微调一个统一场景的 VLM 时就用它。

## 练习

1. 你的产品支持 80% 单图、10% 多图（2-4 张）、10% 视频（8-16 帧）。设计 token 预算。你会把不做重多图省下的额外预算放到哪里？

2. 读 LLaVA-OneVision 第 4.3 节（涌现能力）。提出一个课程很可能解锁、但论文没报告的第四种涌现技能。

3. 调换课程顺序——先训多图，再单图，再视频。预测哪些基准会退化、为什么。

4. 论文报告的视频基准只在每样本 8 帧上训练。这能泛化到推理时的 30 秒视频吗？什么先崩——token 预算还是时间推理？

5. 把 24x24 patch 双线性池化到 12x12，是每维 4 倍缩减。用标准库 Python 实现这个池化，并验证每个 2x2 块上的均值与双线性输出相符。

## 关键术语

| 术语 | 大家怎么说 | 它实际指什么 |
|------|-----------------|------------------------|
| OneVision 场景 | "单图、多图或视频" | 统一 VLM 处理的三种输入形状之一；预算跨它们保持恒定 |
| token 预算 | "每样本多少 token" | LLM 每个训练/推理样本看到的视觉 token 总数，通常 3000-4000 |
| 课程 | "训练顺序" | 为涌现迁移而选的阶段排序（单图 → 多图 → 视频） |
| 双线性池化 | "token 收缩" | 对 patch 网格（二维）做双线性插值以减少 token 数同时保留局部性 |
| 涌现技能 | "没训过，照样能用" | 因课程组合而在推理时出现、却无对应训练数据的能力 |
| AnyRes-k | "k-tile 设置" | k 个固定分辨率子 tile 加一张缩略图，典型 k ∈ {4, 9} |
| 任务迁移 | "跨场景泛化" | 单图上学的技能经共享骨干应用到视频（反之亦然） |

## 延伸阅读

- [Li et al. — LLaVA-OneVision (arXiv:2408.03326)](https://arxiv.org/abs/2408.03326)
- [LLaVA-OneVision-1.5: Fully Open Framework (arXiv:2509.23661)](https://arxiv.org/abs/2509.23661)
- [Lin et al. — Video-LLaVA (arXiv:2311.10122)](https://arxiv.org/abs/2311.10122)
- [Lin et al. — VILA (arXiv:2312.07533)](https://arxiv.org/abs/2312.07533)
- [Wang et al. — Qwen2-VL (arXiv:2409.12191)](https://arxiv.org/abs/2409.12191)
