走进 VLM(二):Vision Encoder——VLM 到底是怎么看懂一张图片的?从 CNN 到 Vision Transformer
2026/8/15 8:31:04 网站建设 项目流程

专栏:走进 VLM——从视觉语言模型到多模态 Agent 的技术实战

本文是专栏第 2 篇,共 20 篇。

关键词:Vision Encoder、ViT、CNN、Patch Embedding、Attention、视觉 Token、CLIP


一、上一章回顾:VLM 为什么需要“眼睛”?

在上一篇文章中,我们介绍了 VLM 的整体结构:

Image ↓ Vision Encoder ↓ Visual Features ↓ Projector ↓ Visual Tokens ↓ LLM ↓ Answer

其中最前面的:

Image ↓ Vision Encoder

就是 VLM 的视觉感知模块。

简单来说:

Vision Encoder 的任务,就是把一张图片转换成语言模型能够理解的信息。

例如:

输入:

一张街道图片

计算机看到的不是:

“这是一条街,有汽车,有行人。”

而是一堆像素:

[ [255,120,80], [120,90,60], ... ]

对于计算机来说:

图片本质上只是:

一个二维数字矩阵。

那么问题来了:

模型如何从这些数字中提取出“语义”?

答案就是:

Vision Encoder。


二、从像素到语义:视觉模型的发展路线

Vision Encoder 并不是 VLM 出现后才诞生的。

它经历了几十年的发展:

传统图像算法 ↓ CNN ↓ ResNet ↓ Vision Transformer ↓ CLIP Vision Encoder ↓ VLM Vision Encoder

其中最重要的两个阶段:

  1. CNN
  2. Vision Transformer(ViT)

三、早期视觉理解:CNN 如何看图片?

CNN:

Convolutional Neural Network

中文:

卷积神经网络

曾经是计算机视觉领域的核心技术。

它最大的特点:

利用卷积操作提取局部空间特征。

例如一张猫的图片:

Image ↓ 卷积层1 检测边缘 ↓ 卷积层2 检测纹理 ↓ 卷积层3 检测眼睛、耳朵 ↓ 高层网络 识别猫

可以简单理解:

低层:

线条 颜色 边缘

中层:

眼睛 鼻子 耳朵

高层:

猫 狗 汽车

这就是 CNN 的核心思想:

从简单特征逐渐组合成复杂语义。


四、CNN 的核心:卷积到底做了什么?

假设有一张图片:

5×5 像素 [ 1 2 3 4 5 2 3 4 5 6 3 4 5 6 7 4 5 6 7 8 5 6 7 8 9 ]

CNN 会使用一个小窗口:

例如:

3×3 Kernel

不断滑动:

图片 ┌─────────┐ │ │ │ 3×3区域 │ │ │ └─────────┘

计算:

图片区域 × Kernel

得到新的特征。

这个过程:

Image ↓ Convolution ↓ Feature Map

就是卷积。


五、CNN 为什么适合视觉?

因为图片有一个特点:

空间关系非常重要。

比如:

猫的眼睛一定在:

鼻子上方

耳朵通常:

头部两侧

CNN 天然利用:

  • 局部连接
  • 权重共享
  • 平移不变性

因此非常适合图片。


六、但是 CNN 有一个限制

CNN 擅长:

看局部。

例如:

它可以发现:

这里有眼睛 这里有耳朵

但是:

理解:

“这个人在拿着雨伞,因为正在下雨。”

这种全局关系,需要更强的建模能力。

例如:

图片:

人 + 雨伞 + 天空 + 街道

模型需要理解:

雨伞 ↓ 挡雨 ↓ 说明可能下雨 ↓ 人物正在户外

这属于:

全局语义理解。

而 Transformer 在这方面表现非常优秀。


七、Vision Transformer(ViT)的出现

Transformer 最初用于 NLP。

例如:

我 喜欢 人工智能

转换成:

Token1 Token2 Token3

然后输入 Transformer。

研究人员发现:

图片也可以拆成 Token。

这就是 ViT:

Vision Transformer。


八、图片如何变成 Token?

这是理解 VLM 最重要的一步。

假设:

一张图片:

224 × 224

ViT 不会直接处理整个图片。

它会切成很多小块:

例如:

16 × 16 Patch

那么:

224 / 16 = 14

所以:

14 × 14 = 196 个 Patch

图片:

┌────┬────┬────┐ │ P1 │ P2 │ P3 │ ├────┼────┼────┤ │ P4 │ P5 │ P6 │ ├────┼────┼────┤ │ P7 │ P8 │ P9 │ └────┴────┴────┘

每个 Patch:

就是一个视觉 Token。


九、Patch Embedding:图片 Token 化

原始 Patch:

例如:

16×16×3

RGB 三通道:

16 × 16 × 3 =768 个数字

然后通过一个线性层:

Patch ↓ Linear Projection ↓ Embedding Vector

得到:

Visual Token

例如:

Patch1 ↓ [0.23,0.51,0.72,...]

于是:

图片:

Image

变成:

[ Token1, Token2, Token3, ... Token196 ]

十、ViT 的完整流程

整体结构:

Image ↓ Split Patch ↓ Patch Embedding ↓ Position Embedding ↓ Transformer Encoder ↓ Visual Representation

展开:

Image ↓ ┌──────────────┐ │ Patch Split │ └──────────────┘ ↓ Patch1 Patch2 ... ↓ Embedding ↓ Transformer ↓ Feature Vector

十一、为什么需要 Position Embedding?

Transformer 本身不知道顺序。

例如:

文本:

我 爱 AI

如果打乱:

AI 爱 我

意思完全不同。

图片同样如此。

如果:

猫的位置

被打乱:

模型无法知道:

耳朵在哪里 身体在哪里

所以 ViT 加入:

Position Embedding

告诉模型:

这个 Patch 在图片哪个位置。


十二、Attention 如何帮助模型理解图片?

Transformer 最大特点:

Self-Attention。

简单理解:

每个 Patch 会观察其他 Patch。

例如:

猫图片:

Patch A: 眼睛 会关注: Patch B: 耳朵 Patch C: 身体

于是模型建立:

眼睛 ↓ 猫 ↓ 整体语义

关系。

公式:

经典 Attention:

$$
Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt d})V
$$

不用深入数学,可以理解:

Attention 让模型决定哪些区域更加重要。


十三、Vision Encoder 在 VLM 中的位置

回到 VLM:

Image ↓ Vision Encoder ↓ Visual Feature ↓ Projector ↓ LLM

Vision Encoder 输出:

例如:

[196,1024]

表示:

196 个视觉 Token。

每个 Token:

1024 维。

这些信息之后会进入语言模型。


十四、CLIP Vision Encoder

现代 VLM 中非常常见的一类视觉编码器:

CLIP Vision Encoder

CLIP 的结构:

Image ↓ Vision Encoder ↓ Image Embedding Text ↓ Text Encoder ↓ Text Embedding ↓ Similarity

它训练的目标:

让:

图片 和 对应文字 距离更近。

例如:

图片:

文本:

一只狗

二者向量:

更加接近。

这让视觉世界第一次和语言世界连接起来。


十五、代码实践:使用 CLIP 提取图片特征

下面使用 Hugging Face 调用 CLIP Vision Encoder。

安装:

pip install transformers torch pillow

代码:

import torch from PIL import Image from transformers import CLIPProcessor, CLIPModel model_name = "openai/clip-vit-base-patch32" # 加载模型 model = CLIPModel.from_pretrained( model_name ) processor = CLIPProcessor.from_pretrained( model_name ) # 图片 image = Image.open( "test.jpg" ) # 处理图片 inputs = processor( images=image, return_tensors="pt" ) # 提取视觉特征 with torch.no_grad(): image_features = model.get_image_features( **inputs ) print( image_features.shape )

输出类似:

torch.Size([1,512])

说明:

图片:

Image

已经变成:

512维向量

这就是:

Image Embedding。


十六、查看图片和文本的相似度

CLIP 最经典的应用:

图片匹配文字。

代码:

import torch from PIL import Image from transformers import CLIPProcessor, CLIPModel model = CLIPModel.from_pretrained( "openai/clip-vit-base-patch32" ) processor = CLIPProcessor.from_pretrained( "openai/clip-vit-base-patch32" ) image = Image.open( "test.jpg" ) texts = [ "a dog", "a car", "a person" ] inputs = processor( text=texts, images=image, return_tensors="pt", padding=True ) with torch.no_grad(): outputs = model(**inputs) similarity = outputs.logits_per_image print(similarity)

输出类似:

dog 8.5 car 1.2 person 2.3

模型认为:

图片 ≈ dog

十七、Vision Encoder 的未来发展

现在主流 VLM 使用的视觉编码器越来越强:

例如:

  • CLIP ViT
  • SigLIP
  • EVA-CLIP
  • InternViT
  • Qwen-VL Vision Encoder

未来趋势:

更高分辨率 ↓ 更多视觉 Token ↓ 更强视觉理解 ↓ 视频理解 ↓ 世界模型

十八、总结

这一篇我们理解了:

1. Vision Encoder 是什么?

它负责:

图片 ↓ 视觉特征

2. CNN 做了什么?

核心:

局部特征提取

3. ViT 做了什么?

核心:

图片 Patch ↓ Visual Token ↓ Transformer

4. VLM 为什么需要 Vision Encoder?

因为:

LLM 不认识图片。

必须:

Image ↓ Vision Encoder ↓ Visual Token ↓ LLM

5. 最重要的一句话:

Vision Encoder 就是 VLM 的眼睛,它负责把现实世界中的图像转换成语言模型能够理解的视觉表示。

下一篇我们继续深入:

《走进 VLM(三):CLIP 如何连接视觉与语言?从图文对齐到多模态理解》

我们将详细拆解:

  • CLIP 双塔结构
  • Contrastive Learning
  • Image Encoder
  • Text Encoder
  • 为什么 CLIP 成为了 VLM 的基础设施

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询