CLIP简要介绍


感谢您的观看,希望能给您带来一点帮助。😊😆

介绍

CLIP的迁移学习能力很强, 他预训练好的模型能够在任意一个视觉分类的数据集上取得不错的效果,而且最重要的是CLIP是“Zero-Shot”的。意思就是他完全没有在这些数据集上进行训练,就能得到很好的结果,作者在超过30多个数据集上做了测试证明了CLIP的有效性。

CLIP在不使用ImageNet的训练集的情况下,也就是不使用任何一张那128万张图片训练的情况下,直接Zero-Shot做推理,就可以获得和之前有监督训练好的ResNet50取得同样的效果。

讲解

我们先看看图1,在这里插入图片描述

首先,CLIP是如何进行预训练的呢?

通过自然语言处理来的一些监督信号,我们可以去训练一个迁移效果很好的视觉模型,所以很自然可以想到这是一个牵扯文字、图片的一个多模态的工作。

那么CLIP是如何利用自然语言处理来的这个监督信号呢?

在训练的过程中,模型的输入是一个图片和文字的配对,比如上述图片画的是一只狗,文字描述的就是:澳洲小狗佩珀,图片通过一个图片的编码器,从而得到了一些特征,编码器既可以是个ResNet,也可以是Vision Transformer,对于句子来说,也会通过一个文本的编码器,从而得到一些文本的特征,假设每个Batch里面都有n个这样的图片文本对,也就是这里有n张图片,又有n个句子,那我们就会得到n个这种图片的特征,还有n个这样文本的特征,然后CLIP就是在这些特征上去做对比学习,配对的图片-文本对就是一个正样本,因为描述的是同一个东西,所以特征矩阵中沿着对角线方向的都是正样本,而特征矩阵中不是对角线上的元素就都是负样本了,也就是有n个正样本,有 n 2 − n n^{2} - n n2n个负样本,有了正负样本后,模型就可以通过对比学习的方式去进行训练,完全不需要任何手工的标注。而对于这种无监督的预训练方式,比如说对比学习,他是需要大量的数据的,所以OpenAI还专门去收集了这么一个数据集,他里面有4亿个图片和文本的这个配对,而且这个数据,应该是清理的非常好的,质量是非常高,这也是为什么CLIP这个预训练模型之所以能这么强大的主要原因之一。

CLIP如何去做Zero-Shot的推理?

这部分非常有意思,因为CLIP这个模型经过预训练之后呢,只能去得到这些视觉上和文本上的这些特征,他并没有在任何的分类任务上去做继续的这种微调或训练,所以说是没有这个分类头的,那没有这个分类头要怎么去做推理呢?作者就想到一种巧妙的,利用自然语言的一种方法,也就是叫prompt template,我们这里先拿ImageNet做个例子,CLIP就是先把ImageNet里这1000类变成一个句子,比如说把一个单词“飞机”变成这么一个句子:“这是一张飞机的图片”。像ImageNet这里有1000个类,那这里就生成了1000个句子。然后这1000个句子通过之前的预训练好的文本编码器,就会得到1000个这个文本的特征。

为什么要做prompt template呢?

其实直接用这里的单词去抽取文本的特征也是可以的,但是呢,因为你在模型预训练的时候,你的图片每次看到的基本都是一个句子,如果在推理的时候,突然把所有的文本都变成了一个单词,那么就跟你在训练的时候看到的这个文本就不太一样了,所以效果就会稍有下降。在推理的时候,无论来了任何一张图片,我只要把这个照片扔给图片的编码器,得到图片特征之后呢,我就拿这个图片的特征去跟所有的文本的特征去做余弦相似度比较。

CLIP最吸引人的地方?

因为他彻底摆脱了categorical label这个限制,也就是说无论是在训练的时候,还是在推理的时候,我都不需要提前订好这个标签的列表,任意给我一张照片,我都可以给模型去喂这种文本-句子,从而知道这张图片里到底有没有我感兴趣的物体。
而且CLIP不仅能识别物体,由于他真的把视觉这个语义和文字的语义联系到了一起,所以他学到的这个特征,语义性非常强,迁移的效果也非常好,在OpenAI的这个官网上,也就是CLIP这个官方博客上,作者还举例:
在这里插入图片描述
从侧面说明了,因为和自然语言处理的结合,所以导致CLIP学出来的这个视觉特征和我们用语言所描述的某个物体已经产生了强烈的联系,在domain变化的这么剧烈的情况下,依旧能够识别出这张图片画的是什么,准确的完成分类任务。

参考资料

### 使用CLIP模型实现图片到文本的转换 CLIP(Contrastive Language–Image Pre-training)是一种由OpenAI开发的多模态预训练模型,它可以通过联合嵌入空间将图像和文本映射到相同的向量表示中。虽然CLIP的主要功能是从文本生成图像或从图像匹配最相关的文本,但它也可以被用来反向推导出给定图像可能对应的文本描述[^2]。 以下是基于Python的一个简单示例,展示如何利用CLIP模型来完成从图片到文本的转换: #### 安装依赖库 首先需要安装必要的依赖项,包括`torch`和`transformers`等工具包。 ```bash pip install torch transformers git+https://github.com/openai/CLIP.git ``` #### 加载CLIP模型并处理图像 下面是一个简单的代码片段,演示加载CLIP模型并对一张图片进行编码的过程: ```python import torch from PIL import Image import requests from torchvision.transforms import Compose, Resize, CenterCrop, ToTensor, Normalize from clip.model import build_model from clip.tokenizer import SimpleTokenizer # 下载预训练权重文件 state_dict = torch.load("path_to_clip_weights.pt") # 构建模型结构 model = build_model(state_dict).eval() # 图像预处理函数 preprocess = Compose([ Resize(224, interpolation=Image.BICUBIC), CenterCrop(224), ToTensor(), Normalize((0.48145466, 0.4578275, 0.40821073), (0.26862954, 0.26130258, 0.27577711)), ]) # 加载并预处理图像 image_url = "http://example.com/sample_image.jpg" image = preprocess(Image.open(requests.get(image_url, stream=True).raw)).unsqueeze(0) with torch.no_grad(): image_features = model.encode_image(image) ``` 上述代码实现了以下几个步骤: - **下载预训练权重**:通过指定路径加载已有的CLIP模型参数。 - **定义模型架构**:调用`build_model()`方法创建模型实例。 - **设置图像变换流程**:标准化尺寸调整、裁剪以及颜色通道归一化操作。 - **获取图像特征向量**:最终得到的是经过编码后的高维特征表示 `image_features`。 #### 文本解码部分 为了获得更直观的结果形式——即自然语言表述的内容摘要而非抽象数值数组,则需引入额外机制辅助解释这些视觉信息含义。一种常见做法就是借助Transformer类别的语言生成框架如GPT系列或者BERT变体来进行后续预测工作;另一种方式则是预先准备一组候选标签列表作为参照物,在此基础上计算相似度得分最高的若干选项返回给用户端显示出来。 这里给出第二种方案的具体实施办法之一: ```python candidate_captions = ["a photo of a cat", "an image with dogs playing together", ... ] # 自定义一系列潜在说明语句集合 tokenizer = SimpleTokenizer() texts = tokenizer(candidate_captions).cuda() with torch.no_grad(): text_features = model.encode_text(texts) similarity_scores = (100.0 * image_features @ text_features.T).softmax(dim=-1)[0].cpu().numpy() top_indices = similarity_scores.argsort()[::-1][:5] for idx in top_indices: prob = round(similarity_scores[idx]*100, 2) caption = candidate_captions[idx] print(f"{prob}% match: {caption}") ``` 此段脚本完成了以下几件事情: - 创建了一个字符串类型的候选项池子供对比分析; - 对每一个备选答案执行同样的tokenization过程以便统一格式规格; - 计算目标照片同各条目之间的余弦距离关系,并选取前几名最佳配对结果予以呈现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值