From Pixels to Words — Towards Native One-Vision Models at Scale

Paper: arXiv:2605.28820 Code: EvolvingLMMs-Lab/NEO Code reference: main @ 73257166 (2026-05-28)

1. Motivation (研究动机)

当前主流 VLM 通常把视觉理解拆成“视觉编码器 + projector + LLM”:image / video encoder 先把像素压缩成视觉表示,再交给语言模型做推理。这条路线性能强,但论文指出它对“one-vision”能力有三个结构性瓶颈:第一,视觉侧被迫在 image encoder 与 video encoder 之间分工,前者擅长静态 frame-level 表征但缺少时序推理,后者强调 temporal dynamics 但对单图、多图、交错图文输入不够统一;第二,像素级信号在 encoder 边界处被提前压缩,早期 pixel-word interaction 被切断,多图比较、视频跨帧定位、空间几何关系都必须在后层间接补偿;第三,模块化系统的 scaling 需要平衡 VE 与 LLM 的容量、优化和部署,长视频或高分辨率输入还不能像 decoder-only LLM 那样自然复用 KV cache。

Native VLM 的目标是取消外部视觉编码器,让 image patches 与 text tokens 在同一个 decoder-only backbone 内从浅层开始交互。已有 Fuyu、EVE、NEO 等工作证明“直接把视觉 patch 放进 LLM”可行,但大多集中在单图或较窄的视频理解场景;论文认为真正困难的是把 single-image understanding、multi-image reasoning、video comprehension 与 spatial intelligence 同时统一到同一套 native primitive 中。

这篇论文要解决的具体问题是:在不依赖 pretrained visual encoder、auxiliary adapter 或 post-hoc fusion 的情况下,构建一个可扩展的 native one-vision foundation model,使视觉感知、跨帧对应、像素-文字对齐、空间几何推理都在一个 monolithic backbone 中端到端学习。若这条路线成立,VLM 的多模态能力可以更接近 LLM 的统一建模范式:输入形式从单图扩展到多图和视频时,不需要更换视觉塔或额外融合模块,而是只改变 serialization、position / attention 规则和训练数据配方。

2. Idea (核心思想)

核心 insight 是:one-vision 不应把“图像理解”和“视频理解”分别交给不同 encoder,而应把每张图像或每个采样帧视为同一序列中的 visual unit,让视觉 token 与文本 token 在同一个 decoder-only backbone 中共享位置编码、注意力规则和 next-token objective。这样,跨图比较和跨帧时序关系不是后接 projector 的副产物,而是从浅层开始与 pixel-pixel / pixel-word interaction 一起形成。

NEO-ov 的关键创新是把 NEO 的 native primitive 扩展成 one-vision primitive:轻量 patch embedding 把任意分辨率图像变成视觉 token;Unified Visual Serialization 把单图、多图、视频统一成 <img> ... </img> 片段;Unified Spatial-Temporal Attention 在同一 visual unit 内允许 bidirectional spatial attention,而跨 visual unit 与文本保持 autoregressive causal order;三阶段训练从 Pre-Buffer alignment 到 spatial-temporal mid-training 再到 instruction tuning,逐步打开模型能力。

与 InternVL / Qwen-VL 这类 modular VLM 的 fundamental difference 在于:modular VLM 的视觉 encoder 先独立产生压缩视觉特征,LLM 只能读取已经过边界处理的 token;NEO-ov 让视觉 patch、图像内空间位置、视频帧顺序和文本上下文共同进入同一 backbone,pixel-word alignment 与 pixel-pixel reasoning 都在主干内部发生。与早期 native VLM 相比,NEO-ov 的新焦点不是“能不能吃单图 patch”,而是让同一 primitive 支持多图、长视频和空间智能。

3. Method (方法)

3.1 Overall framework:encoder-free native one-vision backbone

Figure 1 解读:整套模型把 image / video 与 text 都转成 token sequence:图像或视频帧先经 lightweight patch embedding 变成 visual tokens,文本经原 LLM tokenizer 变成 word tokens;二者被 <img></img> 包住后送进同一个 decoder-only backbone。图中最重要的是没有外部 visual encoder、adapter 或 late fusion,所有 pixel-word alignment、pixel-pixel interaction 和 spatial-temporal reasoning 都由 stacked native primitives 在主干内完成。

直觉上,NEO-ov 想避免“视觉塔先压缩、语言塔后解释”的信息瓶颈。对于 OCR、空间关系、多图比较这类任务,关键信息往往存在于局部 patch、文字区域和跨图对应关系中;如果 visual encoder 在浅层就把它压缩成固定语义向量,后续 LLM 很难恢复细节。Native backbone 的好处是:每个视觉 token 从一开始就可以在同一层级与其他视觉 token 和文本 token 建立关系,模型可以把“看清局部”和“按语言问题筛选局部”合并成一个端到端过程。

3.2 Lightweight patch embedding 与 Pre-Buffer

论文把输入图像 编码为视觉 token: 其中 是 2D RoPE embedding。论文说明 的 stride 为 16, 的 stride 为 2,因此最终大约每个 图像区域产生一个 visual token。代码中对应 VLMTrainKit/neo/model/modeling_neo_vit.pyNEOVisionEmbeddings 先用 patch_embedding = nn.Conv2d(..., kernel_size=patch_size, stride=patch_size),再用 dense_embedding = nn.Conv2d(..., kernel_size=downsample_factor, stride=downsample_factor),默认 patch_size=16downsample_ratio=0.5

Pre-Buffer 是 native backbone 的前置缓冲层:论文写到 NEO-ov 初始化 Pre-Buffer 与 Post-LLM,语言 backbone 使用 Qwen3-1.7B 与 Qwen3-8B;Pre-Buffer 层数在 2B 版本为 12 层、9B 版本为 6 层。它的作用不是传统视觉编码器,而是在进入主 LLM 语义空间前保留更丰富的中间视觉上下文,使视觉 patch 的空间结构和局部文字线索不被过早压缩。

def neo_patch_embedding(pixel_values, grid_hw, vision_embed, llm_embed):
    # Based on VLMTrainKit/neo/model/modeling_neo_vit.py
    # pixel_values: concatenated native-resolution images after dynamic preprocessing
    patch = vision_embed.patch_embedding(pixel_values)       # Conv2d, kernel=stride=patch_size=16
    patch = patch.view(-1, vision_embed.embed_dim)           # flatten patch tokens
 
    padded = pad_by_image_grid(patch, grid_hw)               # keep each image/frame grid separate
    dense = vision_embed.dense_embedding(padded)             # Conv2d downsample to LLM hidden size
    visual_tokens = unpad_and_flatten(dense, grid_hw)        # one token per ~32x32 region
    return visual_tokens

3.3 Unified Visual Serialization:单图、多图、视频同一序列格式

单图时,NEO-ov 在 prompt 中相应 <img> 位置插入一个 visual segment。多图时,每个 <img> token 都被替换为一个独立 visual segment,并保持文本 prompt 中出现的顺序: 这里 表示第 张图像的 visual segment。每张图像可按原生分辨率独立编码,visual token 数随空间尺寸变化,而不是压成固定 token budget。代码中 VLMTrainKit/neo/data/data_processor.pyimage / images 字段进行 native-resolution dynamic preprocessing;多图时还会把每张图的 max_pixels 按数量分摊,避免总视觉 token 爆炸。

视频时,论文把 sampled frames 当作按时间排序的 visual units,而不是单个全局视频 embedding。给定 个采样帧及时间戳 编码 video duration、sampled frame count 与 sampling rate;显式 timestamp 加 frame order 让 temporal localization 作为序列信息进入同一建模框架。

def serialize_one_vision(prompt_tokens, image_or_frame_tokens, timestamps=None):
    # Paper-level serialization; released training code represents images/frames as image lists.
    seq = []
    if timestamps is not None:
        seq.append(global_video_prefix(timestamps))
    for k, visual in enumerate(image_or_frame_tokens):
        if timestamps is not None:
            seq.extend(tokenize(f"[{timestamps[k]}]:"))
        seq.append(IMG_START)
        seq.extend(visual)
        seq.append(IMG_END)
    seq.extend(prompt_tokens)
    return seq

论文公式与 released code 实现差异:论文显式描述 video serialization 的 、timestamps 与 up to 128 frames;当前 VLMTrainKit/neo/data/data_processor.py 主要处理 image / images 字段,并未在训练数据处理路径中显式看到 video 字段、timestamp prefix 或 frame-sampling 逻辑。评测端 VLMEvalKit_ov 通过 NEOChat / load_image_native 把 image paths 或视频抽帧结果送入模型,但训练端公开脚本更像通用模板而非论文完整数据管线。

3.4 Native RoPE 与 Unified Spatial-Temporal Attention

Figure 2 解读:上半部分展示 native rotary position embeddings:token 的位置不只是 1D 序列 index,而被拆成 相关的频率、通道和 index allocation;下半部分展示 attention 规则:同一图像或同一视频帧内部允许双向空间交互,不同 visual unit 之间仍保持 causal dependency。这个设计让单图内的空间结构不会被 causal mask 切断,同时又能保持多图/视频/文本整体的 autoregressive 顺序。

论文沿用 NEO 的 -decoupled head design:保留原 LLM head dimension 作为 temporal component ,再引入空间组件 。Native-RoPE 给每个 token 分配: 其中 表示 temporal 或 sequential position, 表示视觉 token 的二维空间位置。论文中的 RoPE base frequencies 固定为

Unified Spatial-Temporal Attention 的 mask 定义为:令 表示 token 的 visual unit index, 为文本 token, 为某张图或某个视频帧中的视觉 token: 这意味着:文本和跨 visual unit 的交互保持 causal;同一 visual unit 内的视觉 token 可以全连接双向 attention。代码中 VLMTrainKit/neo/model/modeling_neo_chat.pycreate_flex_mask_padding 明确写了“within each document, causal attention; within a same image, full attention”,并用 sameimg_masksamedoc_causal_mask 做 OR。NEOChatModel.forward 先用 img_start_token_id 构造 modality_indicators,再把 visual token 的 绝对位置写入 indexes,最后传给 language_model(..., indexes=indexes, attention_mask=attention_mask)

def create_native_attention_mask(document_ids, modality_ids):
    # Based on VLMTrainKit/neo/model/modeling_neo_chat.py:create_flex_mask_padding
    # modality_ids > 0 means visual tokens inside one image/frame unit; -1 means text/padding.
    def causal(q, k):
        return q >= k
 
    def same_document(q, k):
        return document_ids[q] == document_ids[k]
 
    def same_visual_unit(q, k):
        return (
            modality_ids[q] > 0
            and modality_ids[q] == modality_ids[k]
            and document_ids[q] == document_ids[k]
        )
 
    return lambda q, k: (causal(q, k) and same_document(q, k)) or same_visual_unit(q, k)

3.5 Three-stage training recipe

Figure 3 解读:训练分三阶段递进:Stage 1 用大规模 image-text 数据把 Pre-Buffer 对齐到 post-LLM,同时尽量保留 pretrained LLM 的语言能力;Stage 2 用更复杂的 image / video / spatial-temporal 数据打开全模型训练,提升高分辨率感知和跨帧推理;Stage 3 用高质量 instruction tuning 数据进一步强化通用多模态理解、细粒度感知和 temporal dynamics。

Stage 1 Pre-Training:约 20M image-text pairs,包含描述性 captions 与 OCR-intensive 内容。为了稳定适配 pretrained LLM,优化范围限制在 patch embedding、Pre-Buffer layers 与新引入的 QK-related parameters;objective 是 autoregressive next-token prediction。论文报告三阶段 peak learning rate 分别为

Stage 2 Mid-Training:约 60M multimodal samples,覆盖 分辨率以及 up to 128 frames 的视频。此阶段全模型联合优化,context length 从 16K 扩展到 36K,混合 text-only、image-text、multi-image 与 video-text 数据,目标是提升 pixel-word 与 pixel-pixel 关系的上下文一致性。

Stage 3 Supervised Fine-Tuning:约 4M single-image、1M multi-image、1M video instruction samples,覆盖 VQA、OCR、fine-grained perception、temporal reasoning、mathematical analysis 和 complex dialogue。此阶段仍用 next-token prediction 端到端优化全模型。

def train_step(batch, model, optimizer):
    # Based on VLMTrainKit/neo/model/modeling_neo_chat.py and neo/train/train.py
    input_ids = batch["input_ids"]
    labels = batch["labels"]
    pixel_values = batch.get("pixel_values")
    grid_hw = batch.get("image_grid_hw")
 
    visual_embeds = model.extract_feature(pixel_values[0], grid_hw=grid_hw[0])
    hidden = model.language_model.get_input_embeddings()(input_ids)
    image_slots = input_ids == model.img_context_token_id
    hidden[image_slots] = visual_embeds.reshape(-1, visual_embeds.shape[-1])
 
    indexes = build_thw_indexes(input_ids, image_slots, grid_hw, model.downsample_ratio)
    modality_ids = build_modality_indicators(input_ids, model.img_start_token_id, model.img_context_token_id)
    attention_mask, pad_len = create_flex_mask_padding(document_ids(batch), modality_ids, div_num=128)
 
    out = model.language_model(
        inputs_embeds=hidden,
        labels=labels,
        indexes=indexes,
        attention_mask=attention_mask,
        padding_length=pad_len,
    )
    out.loss.backward()
    optimizer.step()
    optimizer.zero_grad()
    return out.loss

论文公式与 released code 实现差异:公开训练脚本 VLMTrainKit/scripts/2B_1PT.sh8B_1PT.sh 设置 lr=8e-4max_steps=200000warmup_steps=1000max_seq_length=16384model_max_length=81922B_2MTsi.sh 设置 lr=5e-5max_steps=50000max_pixels=16777216max_seq_length=327682B_3SFTsi.sh 设置 lr=6e-5max_steps=4500。这与论文正文的 不完全一致,且公开脚本中的 datasets=""mllm=""llm="" 是占位符,因此笔记中的复现实验参数以论文正文为主、以 released code 脚本作为实现模板与差异提醒。

3.6 Released code mapping

Code reference: main @ 73257166 (2026-05-28) — pseudocode and mapping based on this commit

Paper ConceptSource FileKey Class/Function
NEO-ov paper / weights / evaluation releaseREADME.mdREADME news + citation for arXiv:2605.28820
Lightweight patch embeddingVLMTrainKit/neo/model/modeling_neo_vit.pyNEOVisionEmbeddings, NEOVisionModel.forward
Native visual-token insertion into LLM streamVLMTrainKit/neo/model/modeling_neo_chat.pyNEOChatModel.forward, extract_feature
Same-image full attention + document causal attentionVLMTrainKit/neo/model/modeling_neo_chat.pycreate_flex_mask_padding
Decoder-only Qwen3 backbone with RoPE / LM lossVLMTrainKit/neo/model/modeling_neo_qwen3.pyQwen3RotaryEmbedding, Qwen3ForCausalLM.forward
Native-resolution image preprocessingVLMTrainKit/neo/data/data_processor.pyLazySupervisedDataset._get_item, FlattenedDataCollatorForSupervisedDataset
Training entry and stage templatesVLMTrainKit/neo/train/train.py; VLMTrainKit/scripts/*.shtrain(), 2B_1PT.sh, 2B_2MTsi.sh, 2B_3SFTsi.sh, 8B_*
NEO-ov evaluation configsVLMEvalKit_ov/vlmeval/config.pyneo_series, NEOov-2B-image/video/si, NEOov-9B-image/video/si
Evaluation model wrapperVLMEvalKit_ov/vlmeval/vlm/neo/neo_chat.pyNEOChat, generate_inner, load_image_native

4. Experimental Setup (实验设置)

训练数据与规模:Stage 1 使用约 20M large-scale image-text pairs,包含 web captions 与 OCR-intensive content;Stage 2 使用近 60M multimodal samples,覆盖 分辨率与 up to 128 frames 的视频;Stage 3 使用约 4M single-image、1M multi-image、1M video instruction-tuning samples。论文未逐项列出每个数据源的具体名称与采样比例;released code 的 VLMTrainKit/neo/data/__init__.py 只提供示例/占位数据注册(如 SBU_CAPTIONSCAMBRIAN_737KVIDEOCHATGPT),不足以还原论文完整数据配方。

模型与硬件:语言 backbone 为 Qwen3-1.7B 与 Qwen3-8B,对应 NEO-ov 2B 与 9B 系列;Pre-Buffer 层数分别为 12(2B)与 6(9B)。训练使用 16 个 8-GPU nodes,每张 GPU 80GB,即总计 128 张 80GB GPU。优化器为 AdamW,cosine learning-rate decay,warm-up ratio 为 0.01;论文 peak LR 为

released code launch templatesVLMTrainKit/scripts/2B_1PT.sh / 8B_1PT.sh 使用 torchrun --nproc_per_node=8zero2.jsonbatch_size=64grad_accum_steps=5max_steps=200000max_pixels=4194304max_seq_length=163842B_2MTsi.sh 使用 zero3.jsongrad_accum_steps=2max_steps=50000max_pixels=16777216max_seq_length=327682B_3SFTsi.sh 使用 max_steps=4500grad_accum_steps=1。这些是公开模板,不包含论文真实 dataset path。

Baselines:单图/OCR 对比包括 Qwen2-VL、InternVL3、InternVL3.5、Qwen3-VL、Mono-VL、Mono-VL1.5、HoVLE、OneCAT、NEO、Fuyu、EVE、EVEv2、Emu3、SAIL 等;多图/视频包括 VideoLLaMA3、LLaVA-Video、InternVL3.5、Qwen3-VL、ELVA、Fuyu、EVE;空间智能包括 Cambrian-S、Sensenova-SI、GeoThinker、InternVL3.5、Qwen3-VL。

Evaluation metrics / benchmarks:通用图像理解与 OCR 使用 MMMU、MMB、RWQA、MMStar、SEED-I、HallB、AI2D、DocVQA、ChartQA、TextVQA、OCRBench;多图/视频使用 BLINK、MUIRBENCH、VideoMME、MVBench、LVBench、MLVU、LongVideoBench、VideoMMMU;空间智能使用 VSI-Bench、MMSI、Mindcube、ViewSpatial、SITE、3DSR、EmbSpatial、SPAR、Omni-Spatial。论文表格以各 benchmark 的官方 score / accuracy 为主,未在正文为每个指标单独重定义。

5. Experimental Results (实验结果)

5.1 General VQA 与 OCR

ScaleModelMMMUMMBRWQAMMStarSEED-IHallBAI2DDocVQAChartQATextVQAOCRBench
2B nativeNEO48.676.063.154.274.243.180.189.981.274.077.1
2B nativeNEO-ov54.780.064.458.676.254.581.491.283.177.381.2
8B modularInternVL3.568.182.767.569.377.154.584.092.386.778.284.0
8B modularQwen3-VL69.684.571.570.961.185.796.189.689.6
8B nativeNEO-ov68.185.167.867.376.659.885.491.986.278.581.6

NEO-ov 在 native VLM 内部提升明显:2B 版本相对 NEO 在 MMMU 从 48.6 到 54.7、HallB 从 43.1 到 54.5、OCRBench 从 77.1 到 81.2。8B 版本在 MMB 85.1、AI2D 85.4、HallB 59.8 上已经接近或超过部分 modular baseline;但 OCR-intensive benchmark 仍不是全面领先,尤其 DocVQA / OCRBench 与 Qwen3-VL 仍有差距。

5.2 Multi-image 与 Video Understanding

ScaleModelBLINKMUIRBENCHVideoMMEMVBenchLVBenchMLVULongVideoBenchVideoMMMU
2B modularInternVL3.551.344.058.465.937.664.457.442.7
2B modularQwen3-VL53.847.461.961.747.468.355.641.9
2B nativeNEO-ov53.956.860.465.743.364.856.842.3
8B modularInternVL3.559.555.866.072.145.970.262.154.9
8B modularQwen3-VL69.164.471.468.758.078.163.665.3
8B nativeNEO-ov62.858.267.470.746.469.363.551.6

多图/视频表明 native backbone 能自然支持跨图和跨帧推理:2B NEO-ov 在 BLINK 53.9、MUIRBENCH 56.8、VideoMME 60.4 上接近或超过 2B modular baselines;8B NEO-ov 在 VideoMME 67.4、MVBench 70.7、LongVideoBench 63.5 上接近 InternVL3.5,但与 Qwen3-VL 在 LVBench、MLVU、VideoMMMU 上仍有明显差距。这说明统一 native attention 有竞争力,但长视频复杂推理仍受训练数据和 scale 限制。

5.3 Spatial Intelligence

ScaleModelVSI-BenchMMSIMindcubeViewSpatialSITE3DSREmbSpatialSPAROmni-Spatial
2B generalInternVL3.553.825.642.137.934.831.461.532.444.4
2B generalQwen3-VL53.927.834.236.735.847.669.234.136.3
2B nativeNEO-ov58.433.677.252.838.452.963.841.243.1
8B specialistGeoThinker72.630.983.045.955.951.978.868.240.1
8B generalQwen3-VL59.431.229.641.945.452.977.840.347.0
8B nativeNEO-ov64.841.390.055.254.361.778.848.845.0

空间智能是 NEO-ov 最有说服力的部分:8B NEO-ov 在 Mindcube 达到 90.0,超过 GeoThinker 的 83.0;在 MMSI 41.3、ViewSpatial 55.2、3DSR 61.7 也高于 Qwen3-VL。论文把这一点归因于 native interaction:像素-像素与像素-文字关系从浅层就共同演化,适合保留几何和局部空间结构。

5.4 Ablation:Pre-Buffer、SI finetuning、stage progression

Figure 4–6 解读:左侧比较 Pre-Buffer 与 conventional visual encoders,在 VQA、OCR、Video、SI 多类任务上 Pre-Buffer 更稳定,尤其 OCR 与 SI 受益明显;中间展示 SI 数据 finetuning 后 native architecture 的空间智能提升幅度更大,说明早期 pixel-pixel / pixel-word interaction 对空间任务更有效;右侧展示 Stage 1 到 Stage 2 的性能演化,2B 与 9B 在 single-image、multi-image、video、spatial intelligence 上都持续上升,且小模型收益更明显。

Ablation 的结论是:NEO-ov 的性能不只是来自更多数据或 Qwen3 backbone,而是来自三项相互配合的设计。Pre-Buffer 比随机初始化视觉 encoder 更适合保留中间视觉上下文;same-visual-unit full attention 让图像内部空间关系不被 causal mask 割裂;progressive training 先稳定对齐,再扩展到高分辨率和长视频,最后用 instruction tuning 强化任务泛化。

5.5 Limitations 与结论

论文明确指出,尽管 NEO-ov 在 native VLM 中取得强结果,它仍在 OCR-intensive tasks、复杂文字识别、文档/图表细节理解上落后顶级 modular VLM,尤其当任务需要高精度文字读取和版面结构解析时,外部视觉 encoder 的先验仍然有优势。公开代码也没有完整释放论文训练数据配方,因此复现三阶段规模训练仍需要额外数据和工程细节。

总体上,结果证明 fully native one-vision architecture 是可行且有竞争力的:NEO-ov 在单图、多图、视频、空间智能上都显著超过旧 native VLM,并在多个 benchmark 上接近强 modular VLM。它的真正价值不在于某一张表上全面击败 Qwen3-VL,而在于展示了“无视觉塔、同一 backbone、同一 serialization / attention primitive”可以覆盖 one-vision 任务谱。