一、CLIP模型
论文:Learning Transferable Visual Models From Natural Language Supervision
论文地址:https://arxiv.org/abs/2103.00020
论文代码:https://github.com/openai/CLIP
1、Motivation&Contribution
Motivation
(1)在现实世界里得到大量有标签的数据是困难的,受人力、金钱、现实等因素限制,“有严格限制”的标签是难以得到的,比如,一张狗的图片它对应的标签是dog,dog是给定的类别标签,这需要人去判断这张图片的标签,得到的数据符合<image,label>。
但是“非严格限制”的标签是容易得到的,比如,小A发布了一张狗的图片,并配文:My dog is so cute!这在网络上到处都有这样的信息,我们可以将这样的数据定义为<imge,text>,显然,text文本信息是更容易得到的,不需要专门的人员进行标注。
(2)随着对比学习Contrastive Learning、Transformer、多模态学习的发展,文本和图片任务之间互相促进,使用text中的丰富的语义信息帮助图片的识别,也成为一个重要的探索方向。
(3)NLP任务中出现了BERT这样的大型预训练模型,帮助下游任务训练,那么在CV领域中是否也能有这样的模型,大家以后只要使用这个预训练好的CLIP模型,就能低成本地得到一个精度不错的模型,实现zero-shot或few-shot。事实上,CLIP确实在很多数据集上的迁移效果非常好。
Contribution:
(1)不再受传统的标准标签限制,使用一段text作为标签。
(2)将Text引入CV,使用Text语义信息帮助图片识别并达到很好的效果。
(3)预训练的CLIP模型在zero-shot、few-shot表现出色,可以在众多下游任务中拿来应用。
2、Data
前人并非没有用text信息与image信息结合的想法,但效果都不够好,而CLIP指出它们之所以达不到更好的效果是因为它们使用的数据集还不够大,因此CLIP模型收集、使用了4亿的数据,数据的形式为<image,text>,可见CLIP模型能够有这么好的迁移效果,和大量的数据也有很大关系。
3、Model
在解释模型前,可以先简单了解对比学习Parametric Contrastive Learning:长尾问题中的对比学习,简而言之,对比学习不需要标签,它通过拉近与正样本特征的距离,拉远负样本特征的距离,实现模型优化。

接下来介绍模型的结构,事实上模型的结构非常简单。
第一部分:Contrastive pre-training,一组<image,text>对,将image经过Image Encoder,text经过Text Encoder,这里的Encoder可以是Transformer,可以是Resnet之类的网络模型,得到图片和文本特征后,将图片特征和文本特征相乘,对角线上都是正样本,其他部分都是负样本,例如I1、T1,是狗的图片和Pepper the aussie pup文本对应的特征,它们是一对正样本,而I1和T2、T3……TN不是一对,是负样本。
第二部分和第三部分:Create dataset classifier from label text,Use for zero-shot prediction可以认为是预测部分,或者是迁移部分,经过预训练好的模型,我们可以直接拿来进行zero-shot predict。一般的预测任务是有具体的标签的,而CLIP输入的是一段text,那么要把它和CLIP模型匹配,只要把标签转换为一段简单的text,最容易实现的就是A photo of a {object},除了这种模板,在特定数据集里,还可以添加句子来缩小范围,例如在食物数据集里可以变为,A photo of a {object}, a type of food.
列出数据集所有的标签,将它们转换成text,再经过Text Encoder,同样,把图片经过Image Encoder,将text特征和image特征相乘,最相似的text即为对应标签,也就是a photo of a dog,则dog为最终标签。

4、迁移效果
使用预训练的模型进行zero-shot学习,绿色表示CLIP比有监督学习的效果好,蓝色表示差。还有很多实验数据可以参考论文的实验部分。

使用ImageNet训练好的ResNet101模型,再ImageNet上它和Zero-Shot CLIP精度一样,然而当它迁移到其他版本的数据集上,效果出现大幅度下降,而CLIP不需要样本就远远超过了ResNet101。

5、CLIP模型的zero-shot应用
详细信息可以参照论文源码。
先安装好CLIP。
$ conda install --yes -c pytorch pytorch=1.7.1 torchvision cudatoolkit=11.0
$ pip install ftfy regex tqdm
$ pip install git+https://github.com/openai/CLIP.git
加载预训练好的CLIP模型,使用CLIP模型进行预测。
import torch
import clip
from PIL import Image
device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-B/32", device=device)
image = preprocess(Image.open("CLIP.png")).unsqueeze(0).to(device)
text = clip.tokenize(["a diagram", "a dog", "a cat"]).to(device)
with torch.no_grad():
image_features = model.encode_image(image)
text_features = model.encode_text(text)
logits_per_image, logits_per_text = model(image, text)
probs = logits_per_image.softmax(dim=-1).cpu().numpy()
print("Label probs:", probs) # prints: [[0.9927937 0.00421068 0.00299572]]
2475



被折叠的 条评论
为什么被折叠?



