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

参考

相关推荐
竹子_234 小时前
《零基础入门AI:YOLOv2算法解析》
人工智能·python·算法·yolo
陈西子在网上冲浪5 小时前
SEO关键词布局总踩坑?用腾讯云AI工具从核心词到长尾词一键生成(附青少年英语培训实操案例)
人工智能·云计算·腾讯云
卡尔曼的BD SLAMer6 小时前
计算机视觉与深度学习 | 基于深度学习的图像特征提取与匹配算法综述及MATLAB实现
人工智能·深度学习·算法·计算机视觉·matlab
嘀咕博客6 小时前
美图设计室-AI帮你做设计
人工智能·ai工具
桂花饼6 小时前
谷歌 “Nano Banana“ 深度解析:AI 图像的未来是精准编辑,而非从零生成
人工智能·aigc·gpt-4o·gpt-5·claude 4.1·nano banana
MisterZhang6666 小时前
Java使用apache.commons.math3的DBSCAN实现自动聚类
java·人工智能·机器学习·自然语言处理·nlp·聚类
艾醒7 小时前
大模型面试题剖析:PPO 与 GRPO 强化学习算法核心差异解析
人工智能·深度学习·机器学习
nil9 小时前
Dify实战--基于菜谱的RAG系统
llm·产品经理·工作流引擎
掘我的金9 小时前
POML 与 MLflow 集成
llm
麦麦麦造9 小时前
白嫖16G+2vCPU的服务器!超简单教程,有手就会
人工智能