CLIP

Paper: 《Learning Transferable Visual Models From Natural Language Supervision》
Code: https://github.com/openai/CLIP

一、大体内容

CLIP(Contrastive Language–Image Pre-training)是一个文本和图像结合的多模态模型,其将自然语言用于引导视觉进行学习,Zero shot 在超过30个数据集上就能达到比较好的效果,并且在ImageNet上可以达到和预训练的ResNet50一样的效果。可以做到学习一个预训练模型,就能快速迁移到其他任务,且模型训练和下游任务无关。模型总览图如下(相关文献:VirTex(自回归预测方式预训练)、ICMLM(完型填空进行预训练)、ConVIRT(CLIP可以看作其简化版本,但只在医疗图像上测试))

二、贡献点

  • 采用对比学习,不需要额外再进行标注,而是转换为下载配对图片和文本,(标签变成文本,这个自由度要大很多)
  • 文本和视觉组合的多模态模型,做到学习一个预训练模型,就能快速迁移到其他任务
  • Zero-shot在超过30个数据集上验证都取得了比较好的效果

三、细节

3.1 训练和推理流程

  • 训练
    文本输入一个文本编码器,图片输入到一个图片编码器,然后配对的作为正样本,其他就作为负样本(也就是图中对角线上的才作为正样本)。

数据集WebImageText有4亿对配对好的文本和图像对。

  • 推理:
    把类别变成一个句子(这里为什么要变成一个句子,且如何变?后面会提),然后经过训练好的文本编码器,输出N个类别对应的文本特征,再和图像特征进行配对,选择相似性最高的作为其类别。

3.2 训练的时候为何要变为一个句子?如何变?

  • 原因
    单个词可能存在多义性(如remote: 遥控器、遥远,boxer: 一种宠物、拳击手)。而且预训练的时候采用的也是句子。

  • 变换模版
    参考模版

    采用简单的模版,把类别变成 "A photo of a {label}",通常label都是名词,这样标签的灵活度也变高了,还可以加入一些已知的信息。如"A photo of a {label}, a type of pet."。 (如boxer: 一种宠物、拳击手)

3.3 为何采用对比学习

  • 原因
    预测型任务(图片预测出对应文本)由于文本标签自由度太高,很难训练,转变为对比学习,则是比较文本和图像的相似度即可,训练难度降低,相应的训练速度也提高。

3.4 伪代码

伪代码很精简,和推理流程说的一致,文本和图像分别输入到对应的编码器,然后对比,找出相似度最高的文本作为标签。

四、效果

论文3.1.5节秀了20多个数据集上的效果

4.1 zeroshot效果

以ResNet50作为基线,绿色表示相比于ResNet效果更好的数据集,可以看出表现好的数据集大都是自然图像,如车辆、食物等,但对于有些细分领域和带抽象概念(如计数)的数据集效果不是很好

4.2 fewshot效果

对于一些需要特定领域知识的任务,如肿瘤分类等 few-shot效果会更好,采用linear probe而不是fine-tuning,也就是固定住预训练模型,只训练后续的分类层。
在多个数据集上few-shot的平均准确率,注意紫色和蓝色两条线,紫色说明few-shot时数据少于4时其效果还不如zero-shot,蓝色表面zero-shot已经和Bit模型达到相同效果(这也表明了其强大的语义能力)

4.3 CLIP在逻辑回归任务上和EfficientNet

在27个数据集上的效果对比

4.4 泛化性

CLIP学习到的语义特征非常强,且迁移能力也非常不错,如下图,都采用zero-shot的情况下,ResNet101对于一些简笔画或者动画形式的图片推理效果不好,而CLIP泛化性就比较强

4.5 和人类对比

在宠物数据集上和人类对比,可以看到人类对于没有见过的宠物也很难分辨,但给一个样本后准确率大大提高,而CLIP就比较稳定,感觉这里也有些不太公平,一个是人类选取的数量比较少还有一个是CLIP中训练数据可能都包含了这些数据。

4.6 不足之处

文中也提出了几点CLIP不足的地方

  • 对于有些细分领域的数据集效果也不是很理想,无法处理那种带抽象概念的任务,比如说一个图片中有多少物体等,这种任务本身就比较抽象,
  • 如果数据集和训练数据相差太远,那么效果也不是很理想,举的例子是MNIST。
  • zero-shot时还依赖于给出类别,不能一步到位直接预测图片的标签。

4.7 推理实现

参考:github
colab

## 安装
# ! pip install ftfy regex tqdm
# ! pip install git+https://github.com/openai/CLIP.git

import numpy as np
import torch
from pkg_resources import packaging

print("Torch version:", torch.__version__)

import clip

clip.available_models()

device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-B/32", device=device)
model.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)

image = preprocess(Image.open("./red_envelope.png").convert("RGB")).unsqueeze(0).to(device)
text = clip.tokenize(["money", "new year", "red", "envelope", "china"]).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)

自己参考视频用colab测试了红包图片

五、基于CLIP模型的演化

CLIP出来之后,后续很多工作对其进行了扩展和演化,我搜集了一些有意思的工作如下,其他应该还有很多。

groupVit

CLIPDraw

CLIPasso

GLIP

参考链接

Blog: https://openai.com/index/clip/
视频讲解:https://www.youtube.com/watch?v=OZF1t_Hieq8
如何在多GPU上训练大模型:How to Train Really Large Models on Many GPUs?

posted @   半夜打老虎  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
历史上的今天:
2023-02-28 判断射线和AABB(Axis-Aligned Bounding Box)是否相交
点击右上角即可分享
微信分享提示