前言
本文专门开一节写SD原理相关的内容,在看之前,可以同步关注:
stable diffusion实践操作
CLIP,OPENAI 的产品,它解决文字和图片之间对应的问题。
我们常规训练模型后,万一要新增一个分类,这个时候只能重新训练,然后重复之前的工作。
那么有没有一个办法,让我们不用重复之前的工作呢?
GPT中有一个zero-shot,我们只要训练好一个大模型,然后通过一些提示,就能让它自动分类识别。
足够大的模型,足够大的语料就能完成这个任务
我们想要一个足够大的图片模型,然后能做成zeroshot,比如原来只有1k个类别,突然来了一个新的类别,它也能认识,不需要再训练了。
把GPT中文本的方法也用到视觉中来,一个迁移能力非常强的能力(自动认识新类别)。
1 如何实现?
transform 模型
文本的encoder就是transtorm,就是一个GPT,把一个词语提取特征转成向量
图像转特征
1.概论
clip需要大数据量,clip提供了模型,没有提供代码
预训练模型,没有针对任何分类类别做的,而是通过对比学习的思想来通过文本指引帮我们生成任务
2 训练
对角线是正样本,对比学习。
比如,文本描述:狗,图片:狗,这个就是正样本
什么是对比学习?
一批batch,让对角线自己和自己的描述一致,这就是正样本。
让模型学习这幅图片大致描述的是什么。
现在关注的不是类别,而是本质。
3.有什么用?
1.如何进行推理
一个图片,想要分类,你就给它类别,对比相似度。
提示词的好坏,决定了结果。
2.训练
3.提示词
如何提示词,比如一头猪,基于对比学习,不基于某个token
4 transform
5 通过代码来玩clip模型
首先要安装:
第一个是长路径支持,适合window
pip install ddddocr
然后安装
pip install transformers[torch]
安装过程如果出现长路径不支持,可以管理员执行:
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" `
-Name "LongPathsEnabled" -Value 1 -PropertyType DWORD -Force
具体参考:
Maximum Path Length Limitation
代码如下,这段代码输入几个词组和一张图片,大家可以看看生成什么样的结果。
第一次执行的时候会非常慢,因为会下载模型。
第二次就会很快了。
from PIL import Image
from transformers import CLIPProcessor,CLIPModel
model= CLIPModel.from_pretrained("openai/clip-vit-base-patch32")
processor=CLIPProcessor.from_pretrained("openai/clip-vit-base-patch32")
image=Image.open("dog.png")
test=['dog', 'cat', 'teddy']
inputs=processor(text=test,images=image,return_tensors='pt',padding=True)
outputs=model(**inputs)
logite_per_image=outputs.logits_per_image # this is the image-text similarity score
probs=logite_per_image.softmax(dim=1)
for i in range(len(test)):
print(test[i],',',probs[0][i])
6 VIT模型
VIT比Resnet强10个点。