CLIP(Contrastive Language-Image Pre-Training):
利用文本的监督信号训练一个迁移能力强的视觉预训练模型
通过对比学习,训练得到图片和文本的相似度,传闻使用4亿个配对的数据和文本来进行训练,不标注直接爬取的
注意: 由于训练数据基本都是英文,对英文支持的比较好
用途:
CLIP主要是用来做图片分类(计算图片和文本的相似度(关联度)), 也可以辅助做GAN,检测,分割,检索等等
以往我们训练一个猫狗分类模型,换一个线条猫,点云猫,油画猫,穿着奇装异服的猫,分类网络很难还认识,但是现在只要加上一个 CLIP,模型马上就被扩展了.
CLIP是如何训练的:
CLIP是如何进行推理的:
可用模型介绍和说明:
`clip.available_models()`可列出CLIP可用模型列表:
'RN50',
'RN101',
'RN50x4',
'RN50x16',
'RN50x64',
'ViT-B/32',
'ViT-B/16',
'ViT-L/14',
'ViT-L/14@336px'
CLIP 是一组模型。有 9 个图像编码器: 5 个卷积编码器和 4 个 transformer 编码器。卷积编码器是 ResNet-50、ResNet-101 和类似 EfficientNet 的模型,称为 RN50x4、RN50x16、RN50x64(数字越大,模型越好)。transformer 编码器是视觉 Transformer(或称之为 ViT(Visual Transformer)):ViT-B/32、ViT-B/16、ViT-L/14 和 ViT-L/14@336。最后一个在分辨率为 336×336 像素的图像上进行微调,其他的则在 224×224 像素上进行训练。
ViT-B/16中:
+ ViT: Visual Transformer
+ B: Base(Base(基础)/ Large(大的)/ Huge(极大的))
+ 16: Patch Size(块大小), 16×16
三个模型(Base(基础)/ Large(大的)/ Huge(极大的))的参数,在源码中除了有Patch Size为16*16的外还有32*32的。
Model |
Patch Size |
Layers |
Hidden Size D |
MLP Size |
Heads |
Params |
ViT-Base |
16×16 |
12 |
768 |
3072 |
12 |
86M |
ViT-Large |
16×16 |
24 |
1024 |
4096 |
16 |
307M |
ViT-Huge |
14×14 |
32 |
1280 |
5120 |
16 |
632M |
Layers 就是Transformer Encoder中重复堆叠Encoder Block的次数L
Hidden Size 就是对应通过Embedding层(Patch Embedding + Class Embedding + Position Embedding)后每个token的dim(向量的长度)不用那么复杂,其实就是Patch Embedding后向量的长度
MLP Size 是Transformer Encoder中MLP Block第一个全连接的节点个数(是token长度的4倍) MLP中第一个全连接层升维数
Heads 代表Transformer中Multi-Head Attention的heads数。
Params 参数量
Patch Size 为32 x 32,即一张图片可以被划分为224/32 x 224/32 = 7x 7 个patch,每个patch的shape为: [32, 32,3] ,共7x7= 49个,我们可以对每个patch进行线性映射得到所需要的token [32 x 32 x 3] = [3072] ,即
即一张图片被切分为49个patch,对每个patch进行变换后得到shape为[3072]的token,即tokens的shape为 [49, 3072] 。
基准测试:
具体使用方法和代码:
github仓库: GitHub - openai/CLIP: Contrastive Language-Image Pretraining