LLM多模态嵌入 - 图片嵌入

前言

通过上一篇 大模型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 系列的模型)

运用场景

可以看到,支持文本和图像的多模态嵌入非常有用,基于此我们可以做很多事情。

  1. 图文检索 给定一张图片,找到描述这张图片的文字(或反过来)。 用于搜索引擎、相册搜索等。

  2. 零样本分类 不需要重新训练,只需给出类别的自然语言描述,就可以对图片进行分类。

  3. 文本引导的图像生成(配合 DALL·E、Stable Diffusion) CLIP 可以用于打分:文本和图像是否匹配。例如在 Stable Diffusion 里常用作CLIP guidance。

  4. 图像聚类与搜索 用 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 的简单应用,可以看到嵌入技术的运用,使得计算机可以更好的理解人类眼中的世界,建立起图片和文本之间的桥梁,使得我们可以借助这项技术完成很多之前觉得不可思议的事情。

参考

相关推荐
新知图书2 小时前
7.1 User特质的周期提取与自进化(智能体工程)
人工智能·agent·ai agent·智能体
阿里云大数据AI技术2 小时前
免费领票!9月22日-24日,2026云栖大会杭州见
大数据·人工智能·agent
circuitsosk2 小时前
AI输出的“质检员”:构建智能体质量评估、异常检测与人工兜底的三层防线
人工智能·python·microsoft·正则表达式·langchain
IvanCodes2 小时前
我做了一个软著 Skill,可以一键生成申请材料
人工智能·agent
狂奔蜗牛(bradley)2 小时前
RKNN‑Toolkit2 模型转换全流程
人工智能
双星系统2 小时前
双臂机器人迎来广阔应用风口!既是工业柔性主力,也是人形机器人优质上肢配件
人工智能·机器人
羚羊角uou2 小时前
【AI agent】RAG 全链路深度详解及RAG调优策略
人工智能
甲维斯2 小时前
国内外模型3D台球大赛,DS垫底,Claude最强!
人工智能·游戏开发
CTA终结者3 小时前
先用小策略练清条件和动作
人工智能·python
hhzz3 小时前
《深度学习框架PyTorch入门与实践》系列:11-实战猫狗大战之可复用的PyTorch项目架构
人工智能·pytorch·深度学习