前言
通过上一篇 大模型Embedding到底是什么 我们已经理解了嵌入(Embedding)这个功能的含义及其用处。上一篇主要是结合文本的嵌入进行学习,但是现实生活中除了文字,还有图片、视频、音频等这些非文本格式的信息,为了让计算机理解这些内容,也需要对这些内容进行嵌入,下面我们就来了解一下图片的嵌入。
多模态嵌入(Multimodal Embedding)是指将来自不同模态(如文本、图像、音频、视频等)的数据映射到一个统一的向量空间的技术。 其核心概念在于,通过这种映射,不同模态的数据可以在同一个语义空间中进行比较、关联和融合,从而实现对多模态信息的联合理解和处理。例如,可以将一张猫的图片和一段描述"一只可爱的小猫"的文本映射到向量空间中相近的位置,即使它们的数据类型完全不同。这种技术的目标是让机器能够像人类一样,综合运用多种感官信息来理解世界。
图片的嵌入
我们先来了解一下最常用的 Clip 模型。
Clip
openai/CLIP 是 OpenAI 开源的一个跨模态模型代码库,全名是 Contrastive Language--Image Pre-training。它的主要功能是将图像和文本映射到同一个特征空间,从而实现图文之间的相似度计算。
CLIP 通过大规模训练,让模型可以:
- 将一张图片和一段描述该图片的文字编码成向量表示。
- 在这个向量空间中,相似的图像和文本会靠得很近。
- 支持图文检索、零样本图像分类、文本引导的图像搜索与排序等任务。
模型名称
这里再说一下 Clip 模型名称的释义,OpenAI 在 GitHub 和 HuggingFace 都提供了使用模型的示例,但是两边提供的模型名称却又有差异,在 GitHub 上是 ViT-B/32
而在 HuggingFace 是 openai/clip-vit-base-patch16
之类的,其实二者是相似的。
名称 | 说明 |
---|---|
ViT |
Vision Transformer 模型架构 |
B |
Base 规模(通常表示 12 层 Transformer) |
/32 或 -32 |
图像 patch size = 32,即图像被切成 32×32 的小块处理 |
openai/clip-vit-base-patch16 是 HuggingFace 上的模型名称,对应的含义如下:
名称部分 | 含义 |
---|---|
openai/clip |
表示来源是 OpenAI 的 CLIP 模型 |
vit-base |
表示使用 Vision Transformer Base 架构 |
patch16 |
表示图像被切成 16×16 的小 patch(分辨率更高,模型也更大) |
总的来说如下
模型名称 | 来源 | patch size | 等价写法 | 是否等价模型 |
---|---|---|---|---|
ViT-B/32 |
OpenAI 官方论文 | 32×32 | ViT-B-32 |
✅ 同结构 |
ViT-B-32 |
open_clip / HuggingFace | 32×32 | ViT-B/32 |
✅ 同结构 |
clip-vit-base-patch16 |
HuggingFace | 16×16 | ViT-B/16 |
❌ 不同结构(更精细) |
因此,使用 clip 时,如果更在意速度和模型大小,那么可以使用 patch size= 32 的模型,如果更在意精度就需要选择 patch size = 16 的模型
在 HuggingFace 是 OpenAI 提供了以下四种 clip 模型,large 系列的模型参数更大,自然也是更加的精确。

下面我们选择 HuggingFace 上 clip-vit-base-patch16
进行后续示例的学习,实际生产环境可以选择更大更强或者其他的模型。
image-text 相似度
python
import time
import numpy as np
import torch
from PIL import Image
from transformers import CLIPProcessor, CLIPModel
model_name = "openai/clip-vit-base-patch16"
model = CLIPModel.from_pretrained(model_name)
processor = CLIPProcessor.from_pretrained(model_name)
image = Image.open("cat.jpg")
start = time.time()
def get_image_features():
with torch.no_grad():
# 你也可以在这里对图片进行一些特殊处理,裁切、缩放、超分、重新取样等等
inputs = processor(images=image, return_tensors="pt", padding=True, use_fast=True)
# 使用模型处理图片的 Tensor 数据,获取图片特征向量
image_features = model.get_image_features(inputs.pixel_values)[0]
print(image_features.shape)
# 计算整个处理过程的时间
end = time.time()
print('%s Seconds' % (end - start))
shell
torch.Size([512])
0.21516799926757812 Seconds
可以看到通过 clip 进行嵌入处理后,返回结果是一个 512 大小的向量。
clip 同时支持文本和图片的嵌入,因此我们可以将二者同时嵌入之后,看看物理世界中相似的文本和图片是否有着相似的嵌入。
data1 | data2 | data3 |
---|---|---|
![]() |
![]() |
![]() |
a photo of a cat | a photo of a dog | a photo of a child |
我们使用以上三张小猫、小狗和小孩的图片,同时定义他们的文字描述,然后对图片和文本同时进行嵌入操作,之后进行相似度的计算。
python
images = [Image.open("cat.jpg"), Image.open("dog.jpeg"), Image.open("child.jpeg")]
labels = ["a photo of a cat", "a photo of a dog", "a photo of a child"]
def image_text_similarity():
with torch.no_grad():
inputs = processor(text=labels, images=images, return_tensors="pt",
padding=True)
outputs = model(**inputs)
logits_per_image = outputs.logits_per_image # this is the image-text similarity score
probs = logits_per_image.softmax(dim=1) # we can take the softmax to get the label probabilities
result = np.around(probs.cpu().detach().numpy(), 2)
print('logits_per_image:', result)
相似度结果矩阵
shell
[[0.97 0. 0.03]
[0. 0.99 0.01]
[0. 0. 1. ]]
相似度矩阵的解读方法
- 每行对应一个图像
- 每列对应一个文本标签
- 数值表示图像与文本匹配的概率
从结果来看,可以说 clip 的表现非常出色,对于猫、狗、小孩的嵌入结果和文字描述的嵌入结果几乎完全一致。
下面我们增加一些难度,用一些有些歧义的图片,尝试让 clip 去解读
a photo of a rabbit | a photo of a horse | a photo of a centaur_warrior | a photo of a woman_with_horse |
---|---|---|---|
![]() |
![]() |
![]() |
![]() |
这张图片既像鸭子又像兔子 | 马的图片 | 半人马战士 | 同时有女人和马 |
相似度矩阵如下
shell
[[1. 0. 0. 0. ]
[0. 0.97 0.02 0.01]
[0. 0. 1. 0. ]
[0. 0.02 0.01 0.97]]
从结果来看 clip 认为第一张长着鸭子嘴巴的兔子 100% 就是兔子,第二张图片有 97% 的概率是一匹马,第三张半人马战士的图片效果为 100% (可能训练用的数据集中包含这张著名的图片了),最后一张有女人和马的概率有 97%,其余数值基本也符合预期。
下面我们故意修改图片的描述,使其和图片内容有差异。
python
labels2 = ["a photo of a duck", "a photo of a cat", "a photo of a woman", "a photo of a horse"]
在这个描述里,我们认为第一张图片是鸭子,第二张图片是猫,第三张图片是一个女人,第四张图片中只有马,再次看看嵌入后返回的相似度矩阵。
shell
[[0.93 0.05 0.02 0.01]
[0. 0. 0. 1. ]
[0. 0. 0.71 0.28]
[0. 0. 0.38 0.62]]
- clip 分析对于第一张图片为鸭子的概率虽然有 93%,但其实低于之前兔子 100% 的概率
- 第二行只有第四列是 100%,其余为 0 ,这张只有马的图片,精确的符合第四列的文本描述
- 第三行,半人马战士的图片没有被识别为鸭子或者猫,被识别为 woman 的概率是 71%,马的概率是 28%
- 第四行,女人和马同时存在的照片同样没有被识别为鸭子或者是猫,被识别为 woman 和 horse 的概率似乎也和整张图片中 woman 和 horse 的占比相当。
再次证明,clip 很强(要知道这里使用的还不是 large 系列的模型)
运用场景
可以看到,支持文本和图像的多模态嵌入非常有用,基于此我们可以做很多事情。
-
图文检索 给定一张图片,找到描述这张图片的文字(或反过来)。 用于搜索引擎、相册搜索等。
-
零样本分类 不需要重新训练,只需给出类别的自然语言描述,就可以对图片进行分类。
-
文本引导的图像生成(配合 DALL·E、Stable Diffusion) CLIP 可以用于打分:文本和图像是否匹配。例如在 Stable Diffusion 里常用作CLIP guidance。
-
图像聚类与搜索 用 CLIP 向量对图像进行聚类或最近邻检索,适用于图像推荐、视觉搜索系统等。
图片文本嵌入的模型
当然除了 openai/clip ,还有其他支持文本、图片嵌入的模型。
模型名称 | 机构/团队 | 主要特点 | 支持模态 | 开源链接/平台 |
---|---|---|---|---|
CLIP | OpenAI | 对比学习,图文共享嵌入空间,强大的零样本能力,ViT/ResNet 图像编码器,Transformer 文本编码器 | 图像、文本 | GitHub: openai/CLIP |
OpenCLIP | LAION / mlfoundations | CLIP 的开源实现,更大模型(如 ViT-G/14),更广泛数据集训练 | 图像、文本 | GitHub: mlfoundations/open_clip |
Chinese-CLIP | 阿里达摩院 / OFA-Sys | 针对中文优化,约2亿中文图文对训练,两阶段预训练策略,RoBERTa 文本编码器 | 图像、文本 | GitHub: OFA-Sys/Chinese-CLIP ; ModelScope |
GME (General MultiModal Embedding) | 通义实验室 (阿里) | 基于 Qwen2-VL MLLM,统一多模态表征,对比学习,指令调优,支持文本、图像、图文组合等,在 UMRB 基准表现优异,富文本图片检索能力强 | 文本、图像、图文组合 | ModelScope ; Hugging Face: Alibaba-NLP/gme-Qwen2-VL-2B-Instruct , Alibaba-NLP/gme-Qwen2-VL-7B-Instruct |
ImageBind | Meta AI | 将图像与文本、音频、深度、热成像、IMU 数据等多种模态对齐到统一嵌入空间,利用图像作为"枢纽"模态实现跨模态"涌现对齐" | 图像、文本、音频等六种 | GitHub: facebookresearch/ImageBind |
Nomic Embed Multimodal | Nomic AI | 处理 PDF、图像、论文、图表等复杂文档,支持交错文本和图像输入,无需 OCR,ColNomic Embed Multimodal 7B 在 Vidore-v2 基准 SOTA | 文本、图像、PDF 等 | Hugging Face 等平台 |
Jina-CLIP (jina-clip-v1/v2) | Jina AI | 针对原始 CLIP 优化,v1 提升纯文本检索和图像检索性能,v2 支持 89 种语言图像检索,更高分辨率,Matryoshka 表征 | 图像、文本 | Hugging Face: jinaai/jina-clip-v1 |
BGE-VL | 北京智源人工智能研究院 (BAAI) | 基于 MegaPairs 合成数据集训练,提升多模态检索(组合图像检索、多模态文档检索)多任务能力 | 图像、文本 | Hugging Face: BAAI/BGE-VL-MLLM-S1 等 |
PreFLMR | 剑桥大学 | 预训练细粒度后期交互多模态检索器,用于构建多模态 RAG,在 M2KR 数据集预训练 | 图像、文本 | Hugging Face: cambridgeltl/PreFLMR_ViT-B/L/G |
Leopard | 圣母大学、腾讯 AI Lab、UIUC | 处理文本丰富图像,自适应高分辨率编码,像素洗牌技术压缩视觉序列,适用于多页文档理解、数据可视化、网页理解 | 图像、文本 | GitHub 等平台 |
OFA (One-For-All) | 阿里巴巴达摩院 | 统一序列到序列框架处理多种模态和任务(图像描述、视觉定位、文本生成等),支持中文多模态任务 | 图像、文本 | GitHub: OFA-Sys/OFA |
这些模型有不同的侧重点,有不同的架构,但是他们都非常强大,实际中我们需要结合自身数据的特点,选择合适的模型进行对数据的嵌入处理。
小结
通过 clip 的简单应用,可以看到嵌入技术的运用,使得计算机可以更好的理解人类眼中的世界,建立起图片和文本之间的桥梁,使得我们可以借助这项技术完成很多之前觉得不可思议的事情。