CLIP模型原理

CLIP是OpenAI的预训练模型,通过对比学习匹配图像和文本。它包括ImageEncoder和TextEncoder,用于训练和推理,支持零样本预测。文章详细解释了模型的工作原理,展示了如何进行训练和零样本图像分类的过程。
Seed-Coder-8B-Base

Seed-Coder-8B-Base

文本生成
Seed-Coder

Seed-Coder是一个功能强大、透明、参数高效的 8B 级开源代码模型系列,包括基础变体、指导变体和推理变体,由字节团队开源

CLIP模型

CLIP(Contrastive Language-Image Pre-Training) 模型是 OpenAI 在 2021 年初发布的用于匹配图像文本的预训练神经网络模型,是近年来在多模态研究领域的经典之作。OpenAI 收集了 4 亿对图像 - 文本对(一张图像和它对应的文本描述),分别将图像和文本进行编码,使用 metric learning进行训练。希望通过对比学习,模型能够学习到图像 - 文本对的匹配关系。

CLIP的论文地址

CLIP模型共有3个阶段:1阶段用作训练,2、3阶段用作推理。

  1. Contrastive pre-training:预训练阶段,使用图片 - 文本对进行对比学习训练;
  2. Create dataset classifier from label text:提取预测类别文本特征;
  3. Use for zero-shot predictiion:进行 zero-shot 推理预测;

在这里插入图片描述

1、训练阶段

通过计算目标图像和对应文本描述的余弦相似度从而获取预测值。CLIP第一阶段主要包含以下两个子模型;

  • Image Encoder:用来提取图像的特征,可以采用常用CNN模型或者vision transformer模型;(视觉模型)
  • Text Encoder:用来提取文本的特征,可以采用NLP中常用的text transformer模型;(文本模型)

在这里插入图片描述
这里举例一个包含N个文本-图像对的训练batch,对提取的文本特征和图像特征进行训练的过程:

  1. 输入图片 —> 图像编码器 —> 图片特征向量;输入文字 —> 文字编码器 —> 文字特征向量;并进行线性投射,得到相同维度;
  2. N个文本特征和N个图像特征两两组合,形成一个具有N2个元素的矩阵;
  3. CLIP模型会预测计算出这N2个文本-图像对的相似度(文本特征和图像特征的余弦相似性即为相似度);
  4. 对角线上的N个元素因为图像-标签对应正确被作为训练的正样本,剩下的N2-N个元素作为负样本;
  5. CLIP的训练目标就是最大化N个正样本的相似度,同时最小化N2-N个负样本的相似度;

2、推理过程

CLIP的预测推理过程主要有以下两步:

  1. 提取预测类别的文本特征:由于CLIP 预训练文本端的输出输入都是句子,因此需要将任务的分类标签按照提示模板 (prompt template)构造成描述文本(由单词构造成句子):A photo of {object}.,然后再送入Text Encoder得到对应的文本特征。如果预测类别的数目为N,那么将得到N个文本特征。
  2. 进行 zero-shot 推理预测:将要预测的图像送入Image Encoder得到图像特征,然后与上述的N个文本特征计算余弦相似度(和训练过程一致),然后选择相似度最大的文本对应的类别作为图像分类预测结果。进一步地,可以将这些相似度看成输入,送入softmax后可以得到每个类别的预测概率。

在这里插入图片描述

3、补充:zero-shot 零样本学习

zero-shot :零样本学习,域外泛化问题。利用训练集数据训练模型,使得模型能够对测试集的对象进行分类,但是训练集类别和测试集类别之间没有交集,期间需要借助类别的描述,来建立训练集和测试集之间的联系,从而使得模型有效。

在计算机视觉中,即便想迁移VGGMobileNet这种预训练模型,也需要新数据经过预训练、微调等手段,才能学习新数据集所持有的数据特征,CLIP可以直接实现zero-shot的图像分类,即:不需要训练任何新数据,就能在某个具体下游任务上实现分类,这也是CLIP亮点和强大之处。

我的猜测:CLIPzero-shot能力是依赖于它预训练的4亿对图像-文本对,样本空间非常大,下游任务的类别也不过是CLIP样本空间的子集,并不是真正的零样本学习,和解决域外泛化问题。和人脸比对的原理相似,依靠大量样本来学习分类对象的特征空间,区别在于人脸比对是image-to-imageCLIPimage-to-text

4、代码: CLIP实现zero-shot分类

OpenAI有关CLIP的代码链接地址

环境:

pip install ftfy regex tqdm
pip install git+https://github.com/openai/CLIP.git

Torch version: 1.9.0+cu102

4.1、模型加载

import clip

clip.available_models()

model, preprocess = clip.load("ViT-B/32")
model.cuda().eval()
input_resolution = model.visual.input_resolution
context_length = model.context_length
vocab_size = model.vocab_size

print("Model parameters:", f"{np.sum([int(np.prod(p.shape)) for p in model.parameters()]):,}")
print("Input resolution:", input_resolution)
print("Context length:", context_length)
print("Vocab size:", vocab_size)

4.2、图像、文本数据处理

向模型提供8个示例图像及其文本描述,并比较相应特征之间的相似性

# images in skimage to use and their textual descriptions
descriptions = {
    "page": "a page of text about segmentation",
    "chelsea": "a facial photo of a tabby cat",
    "astronaut": "a portrait of an astronaut with the American flag",
    "rocket": "a rocket standing on a launchpad",
    "motorcycle_right": "a red motorcycle standing in a garage",
    "camera": "a person looking at a camera on a tripod",
    "horse": "a black-and-white silhouette of a horse", 
    "coffee": "a cup of coffee on a saucer"
}

在这里插入图片描述

4.3、建立图片特征

对图像进行归一化,对每个文本输入进行标记,并运行模型的前向传递以获得图像和文本特征

image_input = torch.tensor(np.stack(images)).cuda()
text_tokens = clip.tokenize(["This is " + desc for desc in texts]).cuda()

with torch.no_grad():
    image_features = model.encode_image(image_input).float()
    text_features = model.encode_text(text_tokens).float()

4.4、计算余弦相似度

image_features /= image_features.norm(dim=-1, keepdim=True)
text_features /= text_features.norm(dim=-1, keepdim=True)
similarity = text_features.cpu().numpy() @ image_features.cpu().numpy().T

count = len(descriptions)

plt.figure(figsize=(20, 14))
plt.imshow(similarity, vmin=0.1, vmax=0.3)
# plt.colorbar()
plt.yticks(range(count), texts, fontsize=18)
plt.xticks([])
for i, image in enumerate(original_images):
    plt.imshow(image, extent=(i - 0.5, i + 0.5, -1.6, -0.6), origin="lower")
for x in range(similarity.shape[1]):
    for y in range(similarity.shape[0]):
        plt.text(x, y, f"{similarity[y, x]:.2f}", ha="center", va="center", size=12)

for side in ["left", "top", "right", "bottom"]:
  plt.gca().spines[side].set_visible(False)

plt.xlim([-0.5, count - 0.5])
plt.ylim([count + 0.5, -2])

plt.title("Cosine similarity between text and image features", size=20)

在这里插入图片描述

4.5、Zero-Shot图像分类

from torchvision.datasets import CIFAR100

cifar100 = CIFAR100(os.path.expanduser("~/.cache"), transform=preprocess, download=True)

text_descriptions = [f"This is a photo of a {label}" for label in cifar100.classes]
text_tokens = clip.tokenize(text_descriptions).cuda()

with torch.no_grad():
    text_features = model.encode_text(text_tokens).float()
    text_features /= text_features.norm(dim=-1, keepdim=True)

text_probs = (100.0 * image_features @ text_features.T).softmax(dim=-1)
top_probs, top_labels = text_probs.cpu().topk(5, dim=-1)

plt.figure(figsize=(16, 16))

for i, image in enumerate(original_images):
    plt.subplot(4, 4, 2 * i + 1)
    plt.imshow(image)
    plt.axis("off")

    plt.subplot(4, 4, 2 * i + 2)
    y = np.arange(top_probs.shape[-1])
    plt.grid()
    plt.barh(y, top_probs[i])
    plt.gca().invert_yaxis()
    plt.gca().set_axisbelow(True)
    plt.yticks(y, [cifar100.classes[index] for index in top_labels[i].numpy()])
    plt.xlabel("probability")

plt.subplots_adjust(wspace=0.5)
plt.show()

在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Seed-Coder-8B-Base

Seed-Coder-8B-Base

文本生成
Seed-Coder

Seed-Coder是一个功能强大、透明、参数高效的 8B 级开源代码模型系列,包括基础变体、指导变体和推理变体,由字节团队开源

### CLIP模型的工作原理及工作机制 #### 一、CLIP模型的基本概念 CLIP(Contrastive Language–Image Pre-training)是一种多模态预训练模型,旨在通过联合学习图像和文本之间的关系来完成多种下游任务。其核心思想是利用大量的互联网数据,从中提取图像与描述它们的文本对作为训练信号[^1]。 #### 二、CLIP模型的整体架构 CLIP模型由两个主要部分组成:视觉编码器和文本编码器。这两个编码器分别负责处理输入的图像和文本,并将其映射到共享的嵌入空间中,在此空间中计算相似度得分[^2]。 - **视觉编码器模块** 视觉编码器通常采用卷积神经网络(CNN)或Transformer架构,用于将图像转换为固定维度的向量表示。这种表示能够捕捉图像的关键特征并与其他模态的数据进行比较。 - **文本编码器模块** 文本编码器一般基于Transformer架构,接收一系列标记化的单词序列作为输入,并输出对应的语义向量表示。这些向量经过规范化后被用来衡量与图像嵌入的匹配程度。 #### 三、对比学习机制 为了使视觉编码器和文本编码器能够在同一嵌入空间中共存,CLIP采用了对比学习的方法。具体来说,给定一批成对的图像和文本样本,目标是最小化正样本对之间距离的同时最大化负样本对的距离。这可以通过优化如下损失函数实现: \[ L = - \sum_{i=1}^{N} \log{\frac{e^{s(i, i)}}{\sum_{j=1}^{N} e^{s(i,j)}}} \] 其中 \( s(i, j) \) 表示第 \( i \) 个图像与其对应文本间的相似度分数,\( N \) 是批次大小。 #### 四、零样本迁移能力 由于CLIP是在大量未标注的真实世界数据上训练出来的,因此它具备强大的泛化能力和跨领域适应性。当面对未曾见过的新类别时,只需提供相应的文字说明即可让模型理解意图并作出预测[^3]。 ```python import torch from clip import load device = "cuda" if torch.cuda.is_available() else "cpu" model, preprocess = load("ViT-B/32", device=device) image_input = preprocess(image).unsqueeze(0).to(device) text_inputs = torch.cat([clip.tokenize(f"a photo of a {c}") for c in classes]).to(device) with torch.no_grad(): image_features = model.encode_image(image_input) text_features = model.encode_text(text_inputs) similarity_scores = (100.0 * image_features @ text_features.T).softmax(dim=-1) ``` 上述代码展示了如何加载预训练好的CLIP模型并对一张图片执行分类操作。 --- ####
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月涌大江流丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值