基于CLIP_ViT模型搭建相似图像检索系统

CLIP论文解读

涉及到的知识:
余弦相似度、监督学习,无监督学习、线性、非线性、正负样本、对比学习
clip、多模态、VIT、transfomers、prompt、zero shot分类任务

论文解读一
论文解读二

image.png

训练的时候把图片和文本绑在了一起,学到的特征不再单是视觉特征了,而是多模态的特征,和语言连在一起以后,就很容易做zero-shot的迁移学习了。

CLIP是如何进行预训练的?

模型的输入是图片和文字的配对,图片输入到图片的encoder得到一些特征,文本输入到文本的encoder得到一些特征,每个traning batch里有n个图片-文本对,就能得到n个图片的特征和n个文本的特征,然后在这些特征上做对比学习,对比学习非常灵活,就需要正样本和负样本的定义,其它都是正常套路(不懂对比学习),配对的图片-文本对就是正样本,描述的是同一个东西,特征矩阵里对角线上的都是正样本,矩阵中非对角线上的元素都是负样本,n个正样本, n 2 − n n^2-n n2n个个负样本,有了正负样本,模型就可以通过对比学习的方式去训练了,不需要任何手工标注。这种无监督的训练方式,是需要大量的训练数据的。

CLIP是如何做zero-shot的推理的?

预训练之后只能得到文本和图片的特征,是没有分类头的,作者提出一种利用自然语言的方法,prompt template。比如对于ImageNet的类别,首先把它变成"A photo of a {object}" 这样一个句子,ImageNet有1000个类,就生成1000个句子,然后这1000个句子通过之前预训练好的文本的encoder能得到1000个文本特征(直接用类别单词去抽取文本特征也可以,但是模型预训练的时候和图片配对的都是句子,推理的时候用单词效果会下降)。把需要分类的图片送入图片的encoder得到特征,拿图片的特征和1000个文本特征算余弦相似性,选最相似的那个文本特征对应的句子,从而完成了分类任务。不局限于这1000个类别,任何类别都可以。彻底摆脱了categorical label的限制,训练和推理的时候都不需要提前定义好的标签列表了。经过第一步的预训练,我们拿到两个模型,一个提取文本特征,一个提取图片特征。第二步,我们做数据集分类,是在第一步训练好的模型上分类的,其实就是我们自己输入想要作为分类标签的句子,将它提取成文本特征。(也就是这一步,我们在项目的整个过程中,都可以加入新的句子,也就是加入新的分类标签,这就是clip模型和其他模型的主要区别摆脱了categorical label的限制)

CLIP核心实现的伪代码

image.png
有两个输入,一个是图片,一个是文本,图片的维度是[n,h,w,c],文本的维度是[n,l],l是指序列长度,然后送入到各自的encoder提取特征,image encoder可以是ResNet也可以是Vision Transformer,text encoder可以是CBOW,也可以是Text Transformer,得到对应的特征之后,再经过一个投射层(即W_i和W_t),投射层的意义是学习如何从单模态变成多模态,投射完之后再做l2 norm,就得到了最终的用来对比的特征I_e和T_e,现在有n个图像的特征,和n个文本的特征,接下来就是算consine similarity,算的相似度就是最后要分类的logits,最后logits和ground truth做交叉熵loss,正样本是对角线上的元素,logits的维度是[n,n],ground truth label是np.arange(n),(这里没有懂为什么np.arange(n)这样的ground truth),算两个loss,一个是image的,一个是text的,最后把两个loss加起来就平均。这个操作在对比学习中是很常见的,都是用的这种对称式的目标函数。

Prompt engineering and ensembling

prompt是在做微调或者直接做推理时的一种方法,起到的是一个提示的作用,也就是文本的引导作用。为什么要用Prompt engineering和Prompt ensembling呢?

  • 一个原因是polysemy,多义性,即一个单词可能同时有很多含义,如果在做文本和图片匹配的时候,每次只用一个单词,也就是标签对应的那个单词,去做文本的特征抽取,就有可能遇到问题,因为缺乏上下文信息,模型无法区分是哪个词义,比如在ImageNet里面同时包含两个类,construction cranes和cranes,在不同的语境下,这两个crane对应的意义是不一样的,在建筑工地环境下,construction cranes指的是起重机,作为动物,cranes指的是鹤,这就有歧义了。在Oxfort-IIIT Pet数据集中,有一类是boxer,根据上下文可知道它指的是一种狗,但对于缺乏上下文的文本编码器来说,极有可能把它当成拳击运动员。只用一个单词去做prompt,会经常出现歧义性的问题。
  • 另一个问题是,在预训练的时候,匹配的文本一般都是一个句子,很少出现一个单词的情况,如果推理的时候,每次进来的是一个单词,可能就存在distribution gap的问题,抽出来的特征可能就不好。

基于这两个问题,作者就提出了一种方式去做prompt template,利用这个模板“A photo of a {label}.” 把单词变成一个句子,把单词改成句子了,就不太会出现distribution gap的问题了,而且它的意思是“这是一张xxx的图片”,这个标签一般代表的都是名词,能一定程度上解决歧义性的问题。比如remote这个单词,就指的是遥控器,而不是遥远的。用上了提示模板之后,准确度提升了1.3%。

作者在 Prompt_Engineering_for_ImageNet.ipynb 列出了使用的这80个context prompts,比如有"a photo of many {}"适合包含多个物体的情况,"a photo of the hard to see {}"可能适合一些小目标或比较难辨认的目标。

图解CLIP计算过程

图解 CLIP 计算过程

图搜图、文搜图

基于编辑距离的 top-k 相似字符串查询处理方法,即对于给定的字符串集合 S 和查询串 σ, 返回 S 中前 k 个与 σ 编辑距离最小的字符串。

GitHub - srg000/image_search_engine: 基于CLIP/ViT模型搭建相似图像检索系统
Faiss入门及应用经验记录
03-《Faiss》-更快的索引_哔哩哔哩_bilibili
如何实现图像搜索,文搜图,图搜图,CLIP+faiss向量数据库实现图像高效搜索 - 高颜值的殺生丸 - 博客园

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值