【VLM】AdaCodec:用“预测视觉码”替代逐帧RGB输入

note

  • GOP = Group of Pictures(图像组),指视频中由一个 I-frame(关键参考帧) 和后续若干 P-frames(预测帧) 组成的一组连续帧
  • 研究动机:传统视频 MLLM 将每帧独立编码为视觉 Token,相邻帧大量内容重复,造成 Token 冗余、推理延迟高。作者借鉴视频编码中的 I/P 帧预测机制,只完整编码关键帧,其余帧仅保留变化信息。
  • 核心方法:
    • Adaptive GOP:根据相邻帧运动补偿后的预测误差(pcost),动态划分视频片段;误差过大则插入新的 I-frame。
    • I-frame 编码:使用原始 ViT 提取完整视觉特征,每帧约 256 Tokens。
    • P-frame 编码:通过块匹配计算运动向量(2通道)和像素残差(3通道),拼接成5通道输入,经轻量 P-tokenizer 压缩至 16 Tokens/帧。
  • 两阶段训练:
    • Stage 1:视觉特征蒸馏。先通过冻结视觉教师的特征蒸馏训练 P-tokenizer。
      • 使用冻结的视觉编码器提取目标帧特征,训练 P-tokenizer 和辅助预测器,让压缩后的 P-tokens 配合参考帧信息,尽可能恢复目标帧的视觉语义特征。这里恢复的是特征,不是 RGB 像素。
    • Stage 2:多模态对齐。再冻结视觉模块、仅微调 LLM,完成视频问答对齐。
      • 将 I-tokens 与 P-tokens 按时间顺序输入 LLM,通过多模态训练,让语言模型学会利用这种新视觉表示进行问答。
  • 实验结果:基于 Qwen3-VL-8B,在11个视频理解基准上验证:视觉 Token 减少 84.7%;TTFT:9.26s → 1.62s;端到端延迟:11.18s → 3.20s;5项通用视频基准平均分:74.0 → 75.7。
  • 技术评价:本质是将传统视频压缩的"关键帧 + 运动补偿 + 残差"思想迁移到 MLLM 的视觉 Token 表征层。区别于均匀抽帧或 Token Pruning,AdaCodec 直接消除跨帧冗余,在保留时序变化信息的同时降低推理成本。局限是需要额外训练 P-tokenizer 和适配 LLM,且尚未验证流式视频场景。
  • AdaCodec 的核心创新不是直接对 256 个视觉 Tokens 做剪枝,而是先利用运动补偿消除视频时间冗余,再通过可训练的 P-tokenizer,把帧间变化聚合成 16 个视觉 Tokens。

文章目录

    • note
    • 结论
    • [一、研究动机:逐帧 RGB 输入的问题不是"帧多",而是"重复信息多"](#一、研究动机:逐帧 RGB 输入的问题不是“帧多”,而是“重复信息多”)
    • [二、核心方法:预测代价决定 I 帧位置,运动与残差组成 P-token](#二、核心方法:预测代价决定 I 帧位置,运动与残差组成 P-token)
      • [2.1 整体流程](#2.1 整体流程)
      • [2.2 自适应 GOP:何时重置 I 帧?](#2.2 自适应 GOP:何时重置 I 帧?)
      • [2.3 双分支接口:I 帧提供状态,P-token 提供变化](#2.3 双分支接口:I 帧提供状态,P-token 提供变化)
      • [2.4 完整推理流程](#2.4 完整推理流程)
      • [2.5 P-tokenizer 内部如何压缩成 16 Tokens](#2.5 P-tokenizer 内部如何压缩成 16 Tokens)
    • [三、训练方法:先让 P-token 能重建目标帧的视觉特征,再学习多模态问答](#三、训练方法:先让 P-token 能重建目标帧的视觉特征,再学习多模态问答)
      • [第一阶段:让 P-token 对齐冻结视觉教师](#第一阶段:让 P-token 对齐冻结视觉教师)
      • [第二阶段:冻结视觉侧,训练 LLM 使用预测视觉码](#第二阶段:冻结视觉侧,训练 LLM 使用预测视觉码)
      • 两阶段训练流程图
    • [四、实验结果:AdaCodec 在多个预算下形成性能---效率优势](#四、实验结果:AdaCodec 在多个预算下形成性能—效率优势)
      • [4.1 三个长视频基准:32k 跨过 224k 基线](#4.1 三个长视频基准:32k 跨过 224k 基线)
      • [4.2 预算扫描:优势跨越多个 token 规模](#4.2 预算扫描:优势跨越多个 token 规模)
      • [4.3 时序、通用视频与感知基准](#4.3 时序、通用视频与感知基准)
    • 五、效率结果:准确率与响应速度同时改善
      • [5.1 主要效率指标](#5.1 主要效率指标)
      • [5.2 延迟收益从何而来?](#5.2 延迟收益从何而来?)
    • [六、消融实验:P-token 的价值来自"预测变化",而不是再给模型看一张小图](#六、消融实验:P-token 的价值来自“预测变化”,而不是再给模型看一张小图)
      • [6.1 为什么不用低分辨率 RGB?](#6.1 为什么不用低分辨率 RGB?)
      • [6.2 为什么不是 RGB 信息越多越好?](#6.2 为什么不是 RGB 信息越多越好?)
      • [6.3 压缩率为什么没有达到理论最小值?](#6.3 压缩率为什么没有达到理论最小值?)
    • 七、综合评价
    • Reference

结论

AdaCodec:面向视频 MLLM 的预测式视觉 Token 压缩

AdaCodec: A Predictive Visual Code for Video MLLMs

AdaCodec 的核心创新不是"少抽帧",也不是把视频文件压缩得更小,而是改变了视频进入多模态大模型的方式:

  • 预测代价低的帧:不再完整编码,只传运动向量和 RGB 残差;
  • 预测代价高的帧:作为完整参考帧,进入原生 ViT;
  • LLM 看到的不是一串彼此独立的 RGB 帧,而是"参考状态+时间变化"交错的视觉代码。

因此,AdaCodec 同时获得三项收益:

  1. 节省 token:平均只保留约 15.4% 的视觉 token;
  2. 降低延迟:通用评测中,首 token 时间由 9.26 秒降至 1.62 秒;
  3. 保持或提高准确率:五项通用视频基准平均分由 74.0 提高到 75.7。

最强的一组结果来自长视频:AdaCodec 只使用 32k 视觉 token ,即在约七分之一预算下,仍然超过逐帧 RGB 的 224k 基线。

**看图指引:**先看论文 Figure 2,重点看左侧的宏块运动估计、右侧的 I/P 双分支编码,以及视觉 token 如何按时间顺序送入 LLM。这张图可以一次性建立对 AdaCodec 的整体理解。


一、研究动机:逐帧 RGB 输入的问题不是"帧多",而是"重复信息多"

视频相邻帧通常共享大量对象、背景和画面布局。逐帧 RGB 编码会把先前帧已经表达过的信息反复送入语言模型,造成三重问题:

问题 具体表现
上下文冗余 稳定背景和重复对象反复占据视觉前缀
采样矛盾 稀疏采样容易漏掉短时动作,密集采样则增加 token 和延迟
成本增长 视觉 token 数量大致随采样帧数线性增长

现有高效视频 MLLM 方法主要分为三类:

  1. 选择或下采样更少帧;
  2. 在 ViT 之后压缩、合并或剪枝 token;
  3. 使用记忆、长上下文或在线状态管理历史信息。

这些路线都能降低部分成本,但它们有一个共同前提:保留下来的每一帧仍然是一张独立 RGB 图像。

AdaCodec 的切入点更直接:如果当前帧的大部分内容可以由前一帧预测,就不必再向 LLM 发送一个完整 RGB 帧;只有当预测失败时,才插入新的完整参考帧。

**看图指引:**可结合论文 Figure 1 和相关工作,重点关注表格中对"帧选择、token 压缩、记忆方法"的分类。阅读时要区分两条路线:

  • 如何减少 RGB 帧数量或 token 数量
  • 是否改变 RGB 帧这一基本视觉接口

AdaCodec 属于后者。

为什么不直接复用传统视频编解码器?

传统视频编解码器也使用 I 帧和 P 帧,但其目标是:

  • 生成标准兼容的比特流;
  • 降低传输码率;
  • 保证人类观看时具有较好的重建质量。

AdaCodec 的目标完全不同:它生成的是给 LLM 消费的视觉 token ,优化的是理解性能、上下文预算和推理延迟,而不是可播放视频的压缩率。因此,论文对宏块划分、运动参考、搜索窗口、GOP 调度等机制进行了重新设计。

重要边界:"视觉 token 减少 84.7%"不能改写成"视频文件体积压缩 84.7%"。AdaCodec 输出的不是标准视频比特流。


二、核心方法:预测代价决定 I 帧位置,运动与残差组成 P-token

2.1 整体流程

AdaCodec 把视频组织成若干自适应 GOP:

  • GOP 的第一帧是 I 帧;
  • 后续帧是 P 帧;
  • 每个 P 帧从前一采样帧估计运动和残差;
  • 当预测代价超过阈值时,从当前帧开始新的 GOP。

I 帧编码

I 帧使用原生 ViT 编码,获得完整空间表征,承担对象、背景和布局等参考信息。论文中,I 帧输出 256 个视觉 token。

P 帧编码

对当前宏块,AdaCodec 在前一采样帧的局部搜索窗中寻找最匹配的参考块,同时考虑像素差异和位移惩罚:

  • 运动向量:当前块相对于参考块的位移;
  • 残差:当前块与预测块之间的像素差异;
  • P 帧输入:残差图和运动场拼接成五通道输入;
  • P-token:经 P-tokenizer 后输出 16 个 token。

因此,I 帧与 P 帧的 token 数量比为:256:16=16:1

看图指引:看论文 Figure 2 中的局部块匹配部分,重点观察:

  • 运动向量如何从前一采样帧指向当前帧;
  • 当前块如何由参考块和残差重建;
  • P 帧携带的是"变化",而不是完整场景。

2.2 自适应 GOP:何时重置 I 帧?

AdaCodec 不是每隔固定几帧插入一个 I 帧,而是利用运动估计产生的预测代价进行决策:

  • 当前帧可以由前一帧较准确预测:继续作为 P 帧;
  • 当前帧难以预测:预测代价超过阈值 γ,重置新的 I 帧;
  • 第一帧始终作为 I 帧。

阈值在训练划分上调整,目标为"每个 GOP 的中位数包含 8 个 P 帧";预测链上限设为 16 个 P 帧。

这种设计使预算由固定时间轴分配,转向按预测难度动态分配:

  • 异常识别等稳定视频:GOP 可以较长;
  • 第一视角、频繁切换或快速运动视频:I 帧重置更频繁;
  • 静态片段:持续使用低成本 P-token。

看图指引:查看论文 Table 3 和 Figure 4。重点比较不同视频类别的平均 GOP 长度,尤其是:

  • 异常识别:16.69
  • 教程类:12.22
  • 第一视角:9.07

这解释了 AdaCodec 的压缩率为什么不是视频级别的固定值。

2.3 双分支接口:I 帧提供状态,P-token 提供变化

视觉单元 输入 编码方式 Token 数量 主要作用
I 帧 完整 RGB 帧 原生 ViT 256 建立完整视觉参考状态
P 帧 运动向量+残差 P-tokenizer 16 描述位置、对象和运动变化
最终输入 I/P 交错的视觉代码 按时间顺序送入 LLM 动态变化 形成"参考状态+时序变化"的序列

AdaCodec 不是用一张小图简单替代全分辨率 RGB 图,而是把两种不同性质的信息分开表达:

  • 空间完整性优先给 I 帧;
  • 时序变化优先给 P 帧。

LLM 需要学习的信息也由"每帧都是新场景"转变为"在当前参考状态下发生了什么变化"。

2.4 完整推理流程

#mermaid-svg-KYdLE79Y7XlbLIdK{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-KYdLE79Y7XlbLIdK .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-KYdLE79Y7XlbLIdK .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-KYdLE79Y7XlbLIdK .error-icon{fill:#552222;}#mermaid-svg-KYdLE79Y7XlbLIdK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-KYdLE79Y7XlbLIdK .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-KYdLE79Y7XlbLIdK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-KYdLE79Y7XlbLIdK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-KYdLE79Y7XlbLIdK .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-KYdLE79Y7XlbLIdK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-KYdLE79Y7XlbLIdK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-KYdLE79Y7XlbLIdK .marker{fill:#333333;stroke:#333333;}#mermaid-svg-KYdLE79Y7XlbLIdK .marker.cross{stroke:#333333;}#mermaid-svg-KYdLE79Y7XlbLIdK svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-KYdLE79Y7XlbLIdK p{margin:0;}#mermaid-svg-KYdLE79Y7XlbLIdK .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-KYdLE79Y7XlbLIdK .cluster-label text{fill:#333;}#mermaid-svg-KYdLE79Y7XlbLIdK .cluster-label span{color:#333;}#mermaid-svg-KYdLE79Y7XlbLIdK .cluster-label span p{background-color:transparent;}#mermaid-svg-KYdLE79Y7XlbLIdK .label text,#mermaid-svg-KYdLE79Y7XlbLIdK span{fill:#333;color:#333;}#mermaid-svg-KYdLE79Y7XlbLIdK .node rect,#mermaid-svg-KYdLE79Y7XlbLIdK .node circle,#mermaid-svg-KYdLE79Y7XlbLIdK .node ellipse,#mermaid-svg-KYdLE79Y7XlbLIdK .node polygon,#mermaid-svg-KYdLE79Y7XlbLIdK .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-KYdLE79Y7XlbLIdK .rough-node .label text,#mermaid-svg-KYdLE79Y7XlbLIdK .node .label text,#mermaid-svg-KYdLE79Y7XlbLIdK .image-shape .label,#mermaid-svg-KYdLE79Y7XlbLIdK .icon-shape .label{text-anchor:middle;}#mermaid-svg-KYdLE79Y7XlbLIdK .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-KYdLE79Y7XlbLIdK .rough-node .label,#mermaid-svg-KYdLE79Y7XlbLIdK .node .label,#mermaid-svg-KYdLE79Y7XlbLIdK .image-shape .label,#mermaid-svg-KYdLE79Y7XlbLIdK .icon-shape .label{text-align:center;}#mermaid-svg-KYdLE79Y7XlbLIdK .node.clickable{cursor:pointer;}#mermaid-svg-KYdLE79Y7XlbLIdK .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-KYdLE79Y7XlbLIdK .arrowheadPath{fill:#333333;}#mermaid-svg-KYdLE79Y7XlbLIdK .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-KYdLE79Y7XlbLIdK .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-KYdLE79Y7XlbLIdK .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KYdLE79Y7XlbLIdK .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-KYdLE79Y7XlbLIdK .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KYdLE79Y7XlbLIdK .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-KYdLE79Y7XlbLIdK .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-KYdLE79Y7XlbLIdK .cluster text{fill:#333;}#mermaid-svg-KYdLE79Y7XlbLIdK .cluster span{color:#333;}#mermaid-svg-KYdLE79Y7XlbLIdK div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-KYdLE79Y7XlbLIdK .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-KYdLE79Y7XlbLIdK rect.text{fill:none;stroke-width:0;}#mermaid-svg-KYdLE79Y7XlbLIdK .icon-shape,#mermaid-svg-KYdLE79Y7XlbLIdK .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KYdLE79Y7XlbLIdK .icon-shape p,#mermaid-svg-KYdLE79Y7XlbLIdK .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-KYdLE79Y7XlbLIdK .icon-shape .label rect,#mermaid-svg-KYdLE79Y7XlbLIdK .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KYdLE79Y7XlbLIdK .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-KYdLE79Y7XlbLIdK .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-KYdLE79Y7XlbLIdK :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是
否
输入:视频 V + 用户问题 Q
视频抽帧:得到时间序列 x0, x1, ..., xT
初始化:x0 设为 I-frame
逐帧处理 xt
与前一采样帧 xt-1 做 Block Matching
计算运动向量 M 与 RGB 残差 R
汇总块匹配预测代价 pcost
pcost > 阈值 γ

或 GOP 达到长度上限?
开启新 GOP:当前帧设为 I-frame
当前帧设为 P-frame
RGB 图像 → 原始 ViT
输出 256 I-Tokens
拼接 R(3通道) + M(2通道)
5通道张量 → P-tokenizer
输出 16 P-Tokens
按时间顺序拼接 I-Tokens 与 P-Tokens
加入问题 Q,输入 LLM
LLM Prefill + Decode
输出视频问答结果

2.5 P-tokenizer 内部如何压缩成 16 Tokens

#mermaid-svg-KLax6X5TTtTP4PP7{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-KLax6X5TTtTP4PP7 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-KLax6X5TTtTP4PP7 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-KLax6X5TTtTP4PP7 .error-icon{fill:#552222;}#mermaid-svg-KLax6X5TTtTP4PP7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-KLax6X5TTtTP4PP7 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-KLax6X5TTtTP4PP7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-KLax6X5TTtTP4PP7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-KLax6X5TTtTP4PP7 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-KLax6X5TTtTP4PP7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-KLax6X5TTtTP4PP7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-KLax6X5TTtTP4PP7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-KLax6X5TTtTP4PP7 .marker.cross{stroke:#333333;}#mermaid-svg-KLax6X5TTtTP4PP7 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-KLax6X5TTtTP4PP7 p{margin:0;}#mermaid-svg-KLax6X5TTtTP4PP7 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-KLax6X5TTtTP4PP7 .cluster-label text{fill:#333;}#mermaid-svg-KLax6X5TTtTP4PP7 .cluster-label span{color:#333;}#mermaid-svg-KLax6X5TTtTP4PP7 .cluster-label span p{background-color:transparent;}#mermaid-svg-KLax6X5TTtTP4PP7 .label text,#mermaid-svg-KLax6X5TTtTP4PP7 span{fill:#333;color:#333;}#mermaid-svg-KLax6X5TTtTP4PP7 .node rect,#mermaid-svg-KLax6X5TTtTP4PP7 .node circle,#mermaid-svg-KLax6X5TTtTP4PP7 .node ellipse,#mermaid-svg-KLax6X5TTtTP4PP7 .node polygon,#mermaid-svg-KLax6X5TTtTP4PP7 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-KLax6X5TTtTP4PP7 .rough-node .label text,#mermaid-svg-KLax6X5TTtTP4PP7 .node .label text,#mermaid-svg-KLax6X5TTtTP4PP7 .image-shape .label,#mermaid-svg-KLax6X5TTtTP4PP7 .icon-shape .label{text-anchor:middle;}#mermaid-svg-KLax6X5TTtTP4PP7 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-KLax6X5TTtTP4PP7 .rough-node .label,#mermaid-svg-KLax6X5TTtTP4PP7 .node .label,#mermaid-svg-KLax6X5TTtTP4PP7 .image-shape .label,#mermaid-svg-KLax6X5TTtTP4PP7 .icon-shape .label{text-align:center;}#mermaid-svg-KLax6X5TTtTP4PP7 .node.clickable{cursor:pointer;}#mermaid-svg-KLax6X5TTtTP4PP7 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-KLax6X5TTtTP4PP7 .arrowheadPath{fill:#333333;}#mermaid-svg-KLax6X5TTtTP4PP7 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-KLax6X5TTtTP4PP7 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-KLax6X5TTtTP4PP7 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KLax6X5TTtTP4PP7 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-KLax6X5TTtTP4PP7 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KLax6X5TTtTP4PP7 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-KLax6X5TTtTP4PP7 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-KLax6X5TTtTP4PP7 .cluster text{fill:#333;}#mermaid-svg-KLax6X5TTtTP4PP7 .cluster span{color:#333;}#mermaid-svg-KLax6X5TTtTP4PP7 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-KLax6X5TTtTP4PP7 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-KLax6X5TTtTP4PP7 rect.text{fill:none;stroke-width:0;}#mermaid-svg-KLax6X5TTtTP4PP7 .icon-shape,#mermaid-svg-KLax6X5TTtTP4PP7 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-KLax6X5TTtTP4PP7 .icon-shape p,#mermaid-svg-KLax6X5TTtTP4PP7 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-KLax6X5TTtTP4PP7 .icon-shape .label rect,#mermaid-svg-KLax6X5TTtTP4PP7 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-KLax6X5TTtTP4PP7 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-KLax6X5TTtTP4PP7 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-KLax6X5TTtTP4PP7 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 当前 P-frame xt
运动估计 + 残差计算
前一采样帧 xt-1
运动向量 M:H×W×2
RGB 残差 R:H×W×3
Concat:H×W×5
5通道 Patch Embedding
Patch Tokens
16个可学习 Latent Tokens
ViT Transformer
Patch Token 输出
16个 Latent Token 输出
不传给 LLM
P-Tokens + 时间位置编码
送入 LLM 视觉输入序列


三、训练方法:先让 P-token 能重建目标帧的视觉特征,再学习多模态问答

AdaCodec 采用两阶段训练,避免视觉表征学习与多模态指令学习相互干扰。

第一阶段:让 P-token 对齐冻结视觉教师

第一阶段训练 P-tokenizer 和辅助预测器,目标是:

给定 I 帧和 P 帧的运动、残差信息,预测目标 RGB 帧在冻结教师编码器中的视觉特征。

损失由两部分组成:

  • L1 损失:约束目标特征与预测特征的逐维接近程度;
  • 余弦损失:约束两者方向一致。

这一步非常关键。AdaCodec 并不要求 P-token 重建出"人眼可观看的像素",而是要求它能够在 LLM 使用的视觉特征空间中描述目标帧。

第二阶段:冻结视觉侧,训练 LLM 使用预测视觉码

第二阶段使用时间顺序交错的视觉代码,配合问题和答案进行自回归训练。训练时:

  • 冻结视觉侧;
  • 训练语言模型阅读预测视觉代码;
  • 数据混合包含 3,904,313 条样本。

训练过程先使用 64k 视觉 token 预算 训练 40,000 步 ,再在 224k 预算 下训练 5,000 步。

这种解耦带来两个优势:

  1. P-token 先建立稳定的视觉预测语义;
  2. LLM 再学习如何基于变化信号进行问答和时间推理。

相应代价是:第二阶段无法反向修复第一阶段遗漏的视觉表征问题。

两阶段训练流程图

推理阶段只需要 I-frame Encoder、P-tokenizer 和 LLM。但 P-tokenizer 不能未经训练就直接将视觉信息压缩为有用的 16 Tokens。
#mermaid-svg-vDNVmFHAaQzbWMWA{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-vDNVmFHAaQzbWMWA .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-vDNVmFHAaQzbWMWA .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-vDNVmFHAaQzbWMWA .error-icon{fill:#552222;}#mermaid-svg-vDNVmFHAaQzbWMWA .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-vDNVmFHAaQzbWMWA .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-vDNVmFHAaQzbWMWA .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-vDNVmFHAaQzbWMWA .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-vDNVmFHAaQzbWMWA .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-vDNVmFHAaQzbWMWA .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-vDNVmFHAaQzbWMWA .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-vDNVmFHAaQzbWMWA .marker{fill:#333333;stroke:#333333;}#mermaid-svg-vDNVmFHAaQzbWMWA .marker.cross{stroke:#333333;}#mermaid-svg-vDNVmFHAaQzbWMWA svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-vDNVmFHAaQzbWMWA p{margin:0;}#mermaid-svg-vDNVmFHAaQzbWMWA .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-vDNVmFHAaQzbWMWA .cluster-label text{fill:#333;}#mermaid-svg-vDNVmFHAaQzbWMWA .cluster-label span{color:#333;}#mermaid-svg-vDNVmFHAaQzbWMWA .cluster-label span p{background-color:transparent;}#mermaid-svg-vDNVmFHAaQzbWMWA .label text,#mermaid-svg-vDNVmFHAaQzbWMWA span{fill:#333;color:#333;}#mermaid-svg-vDNVmFHAaQzbWMWA .node rect,#mermaid-svg-vDNVmFHAaQzbWMWA .node circle,#mermaid-svg-vDNVmFHAaQzbWMWA .node ellipse,#mermaid-svg-vDNVmFHAaQzbWMWA .node polygon,#mermaid-svg-vDNVmFHAaQzbWMWA .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-vDNVmFHAaQzbWMWA .rough-node .label text,#mermaid-svg-vDNVmFHAaQzbWMWA .node .label text,#mermaid-svg-vDNVmFHAaQzbWMWA .image-shape .label,#mermaid-svg-vDNVmFHAaQzbWMWA .icon-shape .label{text-anchor:middle;}#mermaid-svg-vDNVmFHAaQzbWMWA .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-vDNVmFHAaQzbWMWA .rough-node .label,#mermaid-svg-vDNVmFHAaQzbWMWA .node .label,#mermaid-svg-vDNVmFHAaQzbWMWA .image-shape .label,#mermaid-svg-vDNVmFHAaQzbWMWA .icon-shape .label{text-align:center;}#mermaid-svg-vDNVmFHAaQzbWMWA .node.clickable{cursor:pointer;}#mermaid-svg-vDNVmFHAaQzbWMWA .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-vDNVmFHAaQzbWMWA .arrowheadPath{fill:#333333;}#mermaid-svg-vDNVmFHAaQzbWMWA .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-vDNVmFHAaQzbWMWA .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-vDNVmFHAaQzbWMWA .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vDNVmFHAaQzbWMWA .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-vDNVmFHAaQzbWMWA .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vDNVmFHAaQzbWMWA .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-vDNVmFHAaQzbWMWA .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-vDNVmFHAaQzbWMWA .cluster text{fill:#333;}#mermaid-svg-vDNVmFHAaQzbWMWA .cluster span{color:#333;}#mermaid-svg-vDNVmFHAaQzbWMWA div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-vDNVmFHAaQzbWMWA .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-vDNVmFHAaQzbWMWA rect.text{fill:none;stroke-width:0;}#mermaid-svg-vDNVmFHAaQzbWMWA .icon-shape,#mermaid-svg-vDNVmFHAaQzbWMWA .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-vDNVmFHAaQzbWMWA .icon-shape p,#mermaid-svg-vDNVmFHAaQzbWMWA .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-vDNVmFHAaQzbWMWA .icon-shape .label rect,#mermaid-svg-vDNVmFHAaQzbWMWA .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-vDNVmFHAaQzbWMWA .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-vDNVmFHAaQzbWMWA .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-vDNVmFHAaQzbWMWA :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} Stage 2:多模态对齐
视频 + 问答训练数据
冻结 I-frame Encoder 和 P-tokenizer
生成 I/P 混合视觉 Tokens
可训练 LLM
Next Token Prediction Loss
Stage 1:视觉特征对齐
反向传播
反向传播
训练视频:参考帧、P-frames、目标帧
冻结 Teacher ViT 提取目标帧特征
运动向量 + 残差
可训练 P-tokenizer
16个 P-Tokens
参考帧 I-Tokens
辅助特征预测器 H
预测目标帧视觉特征
Feature Alignment Loss
移除辅助特征预测器


四、实验结果:AdaCodec 在多个预算下形成性能---效率优势

4.1 三个长视频基准:32k 跨过 224k 基线

长视频基准 RGB 基线,224k AdaCodec,32k AdaCodec,224k
MLVU 62.2 62.7 65.3
LongVideoBench 62.4 63.2 67.8
LVBench 58.0 58.2 58.4

三个任务中,32k AdaCodec 均已超过 224k RGB 基线;224k AdaCodec 进一步扩大了 LongVideoBench 上的优势。

看图指引:重点查看论文 Table 2。建议同时横向比较:

  • 32k AdaCodec 与 224k RGB 基线;
  • 224k AdaCodec 与 224k RGB 基线。

不要只关注单个任务,应比较三个长视频任务的收益稳定性。

这项结果说明,AdaCodec 并非依靠偶然取得某一组高分,而是在不同长视频任务上形成了一致的预算效率优势。但收益幅度并不完全相同:LongVideoBench 的改进明显,LVBench 的改进则相对较小。

4.2 预算扫描:优势跨越多个 token 规模

论文在 MLVU、LongVideoBench 和 LVBench 上比较 32k、64k、128k、224k 四种预算。AdaCodec 在全部预算下均优于逐帧 RGB 基线,且 32k 已超过 RGB 的 224k 结果。

这比"只在某一个预算点取得更好结果"更有说服力,说明优势来自视觉接口设计,而不是单一运行点调参。

看图指引:查看论文中的预算扫描曲线。重点观察两条信息:

  1. AdaCodec 与 RGB 基线的差距是否随预算变化而缩小;
  2. 不同长视频任务是否具有一致趋势。

需要注意,论文没有把其他压缩方法全部纳入同一组密集预算曲线,因此目前证据只能支持"相对于论文设定的 RGB 基线更优",不能据此直接宣布对所有视频压缩方法形成绝对优势。

4.3 时序、通用视频与感知基准

任务类别 AdaCodec,32k AdaCodec,224k
TempCompass 75.8 75.9
MotionBench 58.8 59.9
TOMATO 39.8 40.0
Video-MME 75.0 75.5
MVBench 75.3 76.6
NExT-QA 83.1 84.2
PerceptionTest 75.1 80.5
EgoSchema 70.2 70.4

在匹配 token 预算时,论文还通过提高采样密度更充分地利用预算。因此,224k 条件下的部分增益同时包含:

  • P-token 节省出来的上下文余量;
  • 同一总预算下更密集的时间采样。

所以,这部分结果更准确的结论是:AdaCodec 提供了增加时间覆盖的空间,而且 P-token 足以避免冗余 RGB 信息抵消这一收益。


五、效率结果:准确率与响应速度同时改善

5.1 主要效率指标

论文对 11,347 段通用评测视频进行了效率统计:

指标 RGB 基线 AdaCodec 变化
平均每视频视觉 token 55,893.2 8,550.4 -84.7%
相对 token 比例 100% 约 15.3% ---
Codec 构建时间 --- 0.12 秒 CPU 新增开销
首 token 时间,TTFT 9.26 秒 1.62 秒 约 -82.5%
端到端延迟,E2EL 11.18 秒 3.20 秒 约 -71.4%
峰值显存 34.6 GB 36.5 GB +1.9 GB
五项通用基准平均分 74.0 75.7 +1.7

这组结果的关键不是单纯更快,而是更少 token、更高平均分、更低 TTFT三者同时成立。

看图指引:查看论文 Table 4。建议优先关注:

  • 视觉 token 下降幅度;
  • TTFT 与端到端延迟的下降幅度;
  • 平均分是否同步提高。

三者必须同时成立,才能称为真正的 Pareto 改进。

5.2 延迟收益从何而来?

延迟改善的直接原因是视觉前缀显著缩短,LLM 需要预填充的内容减少。实验环境为:

  • 单卡 H800;
  • Codec 构建使用 16 核 CPU;
  • Codec 构建平均耗时 0.12 秒。

0.12 秒相对 9.26 秒到 1.62 秒的主要收益较小,但这只是论文的单机实验环境。真实服务中还需要考虑:

  • 视频是否已经解码;
  • CPU 与 GPU 能否流水化;
  • 预处理与推理是否存在排队;
  • 批量、分辨率和并发条件;
  • P99 尾延迟与吞吐。

因此,当前数据适合证明接口具有明确优势,但不能直接代表高并发服务中的最终系统收益。


六、消融实验:P-token 的价值来自"预测变化",而不是再给模型看一张小图

论文在保持 GOP 覆盖条件基本匹配的情况下,比较不同 P 帧输入方案:

P 帧方案 长视频平均 时序平均 通用平均
仅 I 帧 52.7 48.5 68.2
全 RGB P 帧 58.6 55.6 74.0
未训练缩略图 P 帧 58.2 53.8 73.6
训练缩略图 P 帧 61.4 54.4 73.2
AdaCodec 运动残差 P-token 63.8 58.2 75.7

6.1 为什么不用低分辨率 RGB?

训练后的缩略图 P 帧比全 RGB 方案更省 token,但三个任务类别上仍低于 AdaCodec:

任务类别 训练缩略图 AdaCodec
长视频 61.4 63.8
时序 54.4 58.2
通用 73.2 75.7

这说明 AdaCodec 的优势不只是"模型又多看到一张小图"。运动向量和残差携带的"从上一状态发生了什么变化",不能由单张低分辨率 RGB 图完全替代。

6.2 为什么不是 RGB 信息越多越好?

全 RGB P 帧保留了比 AdaCodec 更完整的单帧外观信息,但其结果并未占优:

任务类别 全 RGB P 帧 AdaCodec
长视频 58.6 63.8
时序 55.6 58.2
通用 74.0 75.7

这表明在有限预算下,更多 RGB 细节未必能抵消更长的视觉前缀。AdaCodec 的价值是把有限的上下文优先用于:

  • 完整参考帧;
  • 紧凑的时序变化;
  • 更广的时间覆盖。

6.3 压缩率为什么没有达到理论最小值?

当 GOP 达到最大长度,即 1 个 I 帧加 16 个 P 帧时,理论最低 token 比例为:

256 + 16 × 16 256 + 17 × 256 = 512 4608 ≈ 11.8 % \frac{256+16\times16}{256+17\times256} =\frac{512}{4608} \approx11.8\% 256+17×256256+16×16=4608512≈11.8%

实际平均 GOP 长度为 10.21 帧 ,P 帧数为 9.21 帧 ,平均保留约 15.4% 的视觉 token。

两者之间存在差距,说明实际视频的动态变化迫使系统更频繁地插入 I 帧。这也可以视为一种保护机制:AdaCodec 没有为了追求更高压缩率而强行维持过长预测链。


七、综合评价

核心贡献

  1. 提出预测视觉码作为视频 MLLM 的视觉接口

    只有预测代价高的帧才使用完整 RGB 编码;可预测帧只传递运动和残差。

  2. 将视频编解码思想重新设计为面向 LLM 的表示

    改变宏块、运动参考、搜索窗口、GOP 调度等机制,目标不再是比特率或人类可观看重建。

  3. 构建 I/P 双分支 token 接口

    I 帧负责完整空间状态,P-token 负责时序变化,两者按时间顺序进入 LLM。

  4. 提供从视觉表征到多模态对齐的两阶段训练

    先让 P-token 对齐目标帧的教师视觉特征,再让 LLM 学习阅读预测视觉代码。

  5. 在 11 个基准上验证性能---效率优势

    32k AdaCodec 跨过 224k RGB 基线,同时降低 TTFT 和端到端延迟。

方法本质

AdaCodec 解耦了视频理解中的两种需求:

  • 时间覆盖:用低成本 P-token 覆盖更多时间点;
  • 空间细节:只在必要时使用完整 I 帧。

传统逐帧 RGB 输入的问题在于,这两项需求被绑定在一起:增加时间覆盖,就必须同比例增加完整视觉 token。AdaCodec 的核心正是解除这种绑定。

适用条件与局限

该方法更契合以下视频:

  • 相邻帧存在明显时间冗余;
  • 变化主要可由运动、出现、消失和局部残差表达;
  • 需要较长时序覆盖;
  • 对首 token 时间和上下文成本敏感。

论文尚未重点验证的场景包括:

  • 严重遮挡;
  • 低纹理或重复纹理;
  • 强模糊和快速闪光;
  • 字幕覆盖、画中画、视频拼接;
  • 真实流式服务和并发服务;
  • 动态分辨率条件下的稳定性。

此外,pcost 衡量的是局部预测难度,并非严格语义重要性。它不能单独区分:

  • "预测误差大但语义不重要";
  • "误差较小却包含关键动作"。

因此,AdaCodec 的强项是基于时间冗余进行预算分配,而不是理解事件语义后再决定采样。

实践意义

AdaCodec 适合作为视频 MLLM 前端接口研究,而不是传统视频压缩器的替代品。它的潜在组合方式包括:

  • 与帧选择方法叠加,优化 I 帧候选;
  • 与 token 压缩方法叠加,进一步压缩 I 帧或 P-token;
  • 与记忆机制叠加,管理跨 GOP 的长期状态;
  • 与事件检测或语义不确定性结合,优化 I 帧重置。

值得继续研究的问题包括:

  • 让 I 帧选择同时考虑语义重要性;
  • 根据 P 帧复杂度动态分配 16 个 token;
  • 支持动态分辨率;
  • 研究跨 GOP 的长期预测;
  • 在真实流式系统中验证延迟和吞吐收益。

Reference

1 AdaCodec: A Predictive Visual Code for Video MLLMs(PDF)

https://arxiv.org/pdf/2606.02569

相关推荐
深圳市快瞳科技有限公司2 小时前
野外鸟类AI识别落地实录:输入适配、结构化输出、去重聚合与置信度分流的工程实践
算法·计算机视觉·鸟类识别·鸟类ai识别·野外鸟类观测·林业调查
zwc321043205510 小时前
Day 2:图像内存、数据类型与stride
c++·人工智能·opencv·算法·计算机视觉
誰能久伴不乏11 小时前
OpenCV 入门(二):像素访问、ROI 与深浅拷贝
人工智能·opencv·计算机视觉
zwc321043205512 小时前
第四周第五天——重构成类
c++·人工智能·opencv·算法·计算机视觉
椒颜皮皮虾྅13 小时前
模型部署不再卡在环境上:DeploySharp 四大推理引擎与 Windows/Linux 离线交付实战
linux·运维·开发语言·人工智能·windows·计算机视觉·cuda
zwc321043205514 小时前
Day 5:threshold与inRange阈值分割
c++·图像处理·人工智能·opencv·算法·计算机视觉
拜小白1 天前
【论文解读】ZInD:带标注平面图、360° 全景与 3D 房间布局的 Zillow 室内数据集
深度学习·计算机视觉·全景图
美狐美颜sdk1 天前
视频美颜SDK中的YUV与RGBA格式有什么区别?直播APP开发解析
人工智能·计算机视觉·音视频·美颜sdk·直播美颜sdk·视频美颜sdk
沃达德软件1 天前
智慧无人机图像识别分析技术
人工智能·目标检测·计算机视觉·目标跟踪·视觉检测·无人机