NanoVLM-AnyRes

AnyRes(动态高分辨率)是 LLaVA-NeXT 1.6 的核心创新,解决了固定分辨率下细节丢失的问题:将图像按纵横比自适应切分为多个 tile,每个 tile 独立编码后和全局缩略图一起送入 LLM。NanoVLM 在保留原始单图模式的基础上新增了 AnyRes 能力,两个模式通过一个布尔值切换。 问题:固定分辨率的瓶颈 NanoVLM 的基础版本将每张图 resize 到 384×384,经 SigLIP 编码为 729 个 visual token。这对大多数自然图像够用——但遇到高分辨率图像(文档、OCR、大场景)时,细节会被压缩到不可辨认。 一个具体的例子: 原始图像: 1920×1080 的截图(包含文字) ↓ resize 到 384×384 丢失了 (1920×1080) / (384×384) = 14× 的像素信息 ↓ 文字模糊到 LLM 无法识别 AnyRes 的思路很直接——不要压缩整张图,而是把大图切成多个小图,每个小图保持清晰。 核心算法 处理流程 原图 (如 1200×800, AR=1.5) │ ├─ Step 1: 选 grid → 2×2(4 tiles) │ ├─ Step 2: 生成缩略图 │ resize → 384×384 → 729 tokens(全局上下文) │ └─ Step 3: 切分 + 编码 tiles 原图 → resize_to_fit(768×768) → 切成 4 个 384×384 tile tile[0,0] → SigLIP → 729 tokens tile[0,1] → SigLIP → 729 tokens tile[1,0] → SigLIP → 729 tokens tile[1,1] → SigLIP → 729 tokens ───────── 总计: 5 × 729 = 3645 tokens 关键细节:缩略图保留全局上下文,tiles 保留局部细节。两者互补——缩略图告诉 LLM"这是一张包含文字和图表的信息图",tiles 告诉 LLM 文字具体写了什么。 ...

May 31, 2026 · 7 min

NanoVLM-LLaVA

总结了NanoVLM(LLaVA格式)的背景、原理、核心代码、实现细节。最开始只是LLaVA思想的初步实现,即使用一个线性层(或MLP)将视觉特征转换为文本特征,或者说是将视觉特征和文本特征对齐,后边会慢慢加入LLaVA-1.5、LLaVA-NeXT、LLaVA-OneVision的思想。 LLaVA LLaVA 最初的结构如下: 其中, Xv为输入图像,而Xq为输入文本指令。 Xv经过冻结的预训练视觉编码器(例如CLIP的视觉编码器)转换为视觉特征, 又进一步经过一个简单的线性层W转换为文本特征,便可和文本指令特征Hq一起送入LLM进行处理。 LLaVA的训练目标为LM: $$ p(\mathbf{X}_{\mathrm{a}} \mid \mathbf{X}_{\mathrm{v}}, \mathbf{X}_{\mathrm{instruct}}) = \prod_{i=1}^{L} p_{\boldsymbol{\theta}}(x_i \mid \mathbf{X}_{\mathrm{v}}, \mathbf{X}_{\mathrm{instruct}}, \mathbf{X}_{\mathrm{a}, < i}) $$即基于当前图像、历史指令、历史答复预测新一轮的答复。整个训练过程包含两步: 步骤1: 固定Vision Encoder和LLM,预训练Projection 以实现图像和文本模态对齐; 步骤2: 放开LLM,进行端到端的训练。 原始 LLaVA 1.0 的具体配置 组件 配置 参数量 Vision Encoder CLIP ViT-L/14@224² ~300M Projector 单层 Linear (1024→4096) ~4.2M LLM Vicuna-7B/13B 7B/13B Vision Encoder:使用 OpenAI 预训练的 CLIP ViT-L/14,输入分辨率为 224×224。patch_size=14,因此每张图产生 $(224/14)^2 = 256$ 个 patch token + 1 个 CLS token,每个 token 维度为 1024。视觉编码器在整个训练过程中完全冻结。 ...

May 6, 2026 · 14 min