<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>VLM on Ganko Space</title><link>https://ganko.asia/tags/vlm/</link><description>Recent content in VLM on Ganko Space</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sun, 31 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://ganko.asia/tags/vlm/index.xml" rel="self" type="application/rss+xml"/><item><title>NanoVLM-AnyRes</title><link>https://ganko.asia/posts/nanovlm-anyres/</link><pubDate>Sun, 31 May 2026 00:00:00 +0000</pubDate><guid>https://ganko.asia/posts/nanovlm-anyres/</guid><description>&lt;blockquote>
&lt;p>AnyRes（动态高分辨率）是 LLaVA-NeXT 1.6 的核心创新，解决了固定分辨率下细节丢失的问题：将图像按纵横比自适应切分为多个 tile，每个 tile 独立编码后和全局缩略图一起送入 LLM。NanoVLM 在保留原始单图模式的基础上新增了 AnyRes 能力，两个模式通过一个布尔值切换。&lt;/p>&lt;/blockquote>
&lt;h2 id="问题固定分辨率的瓶颈">问题：固定分辨率的瓶颈&lt;/h2>
&lt;p>NanoVLM 的基础版本将每张图 resize 到 384×384，经 SigLIP 编码为 729 个 visual token。这对大多数自然图像够用——但遇到高分辨率图像（文档、OCR、大场景）时，细节会被压缩到不可辨认。&lt;/p>
&lt;p>一个具体的例子：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>原始图像: 1920×1080 的截图（包含文字）
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ↓ resize 到 384×384
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>丢失了 (1920×1080) / (384×384) = 14× 的像素信息
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ↓
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>文字模糊到 LLM 无法识别
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>AnyRes 的思路很直接——&lt;strong>不要压缩整张图，而是把大图切成多个小图，每个小图保持清晰&lt;/strong>。&lt;/p>
&lt;h2 id="核心算法">核心算法&lt;/h2>
&lt;h3 id="处理流程">处理流程&lt;/h3>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-fallback" data-lang="fallback">&lt;span style="display:flex;">&lt;span>原图 (如 1200×800, AR=1.5)
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> │
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ├─ Step 1: 选 grid → 2×2（4 tiles）
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> │
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ├─ Step 2: 生成缩略图
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> │ resize → 384×384 → 729 tokens（全局上下文）
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> │
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> └─ Step 3: 切分 + 编码 tiles
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 原图 → resize_to_fit(768×768) → 切成 4 个 384×384 tile
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> tile[0,0] → SigLIP → 729 tokens
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> tile[0,1] → SigLIP → 729 tokens
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> tile[1,0] → SigLIP → 729 tokens
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> tile[1,1] → SigLIP → 729 tokens
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> ─────────
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> 总计: 5 × 729 = 3645 tokens
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>关键细节：&lt;strong>缩略图保留全局上下文，tiles 保留局部细节&lt;/strong>。两者互补——缩略图告诉 LLM&amp;quot;这是一张包含文字和图表的信息图&amp;quot;，tiles 告诉 LLM 文字具体写了什么。&lt;/p></description></item><item><title>NanoVLM-LLaVA</title><link>https://ganko.asia/posts/nanovlm-llava/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://ganko.asia/posts/nanovlm-llava/</guid><description>&lt;blockquote>
&lt;p>总结了NanoVLM（LLaVA格式）的背景、原理、核心代码、实现细节。最开始只是LLaVA思想的初步实现，即使用一个线性层（或MLP）将视觉特征转换为文本特征，或者说是将视觉特征和文本特征对齐，后边会慢慢加入LLaVA-1.5、LLaVA-NeXT、LLaVA-OneVision的思想。&lt;/p>&lt;/blockquote>
&lt;h2 id="llava">LLaVA&lt;/h2>
&lt;p>LLaVA 最初的结构如下:&lt;/p>
&lt;p>&lt;img src="https://ganko.asia/images/NanoVLM/image.png" alt="alt text">&lt;/p>
&lt;p>其中， Xv为输入图像，而Xq为输入文本指令。 Xv经过冻结的预训练视觉编码器（例如CLIP的视觉编码器）转换为视觉特征, 又进一步经过一个简单的线性层W转换为文本特征,便可和文本指令特征Hq一起送入LLM进行处理。&lt;/p>
&lt;p>LLaVA的训练目标为LM:&lt;/p>
$$
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}, &lt; i})
$$&lt;p>即基于当前图像、历史指令、历史答复预测新一轮的答复。整个训练过程包含两步：&lt;/p>
&lt;p>步骤1: 固定Vision Encoder和LLM，预训练Projection 以实现图像和文本模态对齐；&lt;/p>
&lt;p>步骤2: 放开LLM，进行端到端的训练。&lt;/p>
&lt;h4 id="原始-llava-10-的具体配置">原始 LLaVA 1.0 的具体配置&lt;/h4>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>组件&lt;/th>
&lt;th>配置&lt;/th>
&lt;th>参数量&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Vision Encoder&lt;/td>
&lt;td>CLIP ViT-L/14@224²&lt;/td>
&lt;td>~300M&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Projector&lt;/td>
&lt;td>单层 Linear (1024→4096)&lt;/td>
&lt;td>~4.2M&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>LLM&lt;/td>
&lt;td>Vicuna-7B/13B&lt;/td>
&lt;td>7B/13B&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;p>&lt;strong>Vision Encoder&lt;/strong>：使用 OpenAI 预训练的 CLIP ViT-L/14，输入分辨率为 224×224。patch_size=14，因此每张图产生 $(224/14)^2 = 256$ 个 patch token + 1 个 CLS token，每个 token 维度为 1024。视觉编码器在&lt;strong>整个训练过程中完全冻结&lt;/strong>。&lt;/p></description></item></channel></rss>