0%

CLIP reading notes

CLIP

input:文字和图片的成对输入(一个正样本)

image-20240415205959099

也就是说对角线上的都是正样本,其他都是负样本

没有分类头,如何分类

prompt template:

image-20240415210223937

  1. 文本描述的准备

    • 对于每一个分类任务,首先需要准备一组文本标签,这些标签通常是对应于各个类别的描述性文本。例如,如果任务是对动物图片进行分类,文本标签可能包括“狗”,“猫”,“马”等。
  2. 文本编码

    • 使用CLIP的文本编码器将上述文本标签转换为高维空间中的向量。这些向量捕捉了文本标签的语义信息。
  3. 图像编码

    • 同时,使用CLIP的图像编码器将输入图像转换为同样维度的向量。这个向量代表了图像的视觉内容。
  4. 相似性比较

    • 对于给定的图像,通过计算其图像向量与所有类别文本向量之间的相似性来进行分类。相似性通常通过点积或者cosine相似度来计算。
    • 图像被分类到相似度最高的类别。

pseudocode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# image_encoder - ResNet or Vision Transformer
# text_encoder - CBOW or Text Transformer
# I[n, h, w, c] - minibatch of aligned images
# T[n, l] - minibatch of aligned texts l是序列长度
# W_i[d_i, d_e] - learned proj of image to embed
# W_t[d_t, d_e] - learned proj of text to embed
# t - learned temperature parameter
# extract feature representations of each modality
I_f = image_encoder(I) #[n, d_i]
T_f = text_encoder(T) #[n, d_t]
# joint multimodal embedding [n, d_e]
I_e = l2_normalize(np.dot(I_f, W_i), axis=1)
T_e = l2_normalize(np.dot(T_f, W_t), axis=1)
# scaled pairwise cosine similarities [n, n]
logits = np.dot(I_e, T_e.T) * np.exp(t)

# symmetric loss function
labels = np.arange(n)
loss_i = cross_entropy_loss(logits, labels, axis=0)
loss_t = cross_entropy_loss(logits, labels, axis=1)
loss = (loss_i + loss_t)/2

编码器和输入数据

  1. image_encoder - 可以是ResNet或Vision Transformer(ViT)。这些都是流行的图像编码器,用于从输入图像 ( I[n, h, w, c] ) 中提取特征,其中 ( n ) 是批次大小,( h ), ( w ), ( c ) 分别代表图像的高度、宽度和通道数。
  2. text_encoder - 可以是CBOW(Continuous Bag of Words)或文本Transformer。这些编码器用于从对齐的文本数据 ( T[n, l] ) 中提取特征,其中 ( l ) 代表文本的长度。

    特征提取和投影

  • I_fT_f 分别是通过图像编码器和文本编码器得到的原始特征。
  • W_iW_t 是学习到的投影矩阵,用于将图像和文本的原始特征映射到共同的嵌入空间(维度为 ( d_e ))。
  • 通过点乘和 ( L2 ) 归一化,将特征 ( I_f ) 和 ( T_f ) 投影到嵌入空间,得到 ( I_e ) 和 ( T_e )。

相似性计算和损失函数

  • logits 通过计算 ( I_e ) 和 ( T_e ) 的点积并乘以温度参数 ( t ) 的指数,得到大小为 ( [n, n] ) 的相似性矩阵。这里的温度参数 ( t ) 调控相似性分数的尺度。
  • labels 是一个自然数序列,用于交叉熵损失计算,表示每个样本的正确类别标签。
  • loss_iloss_t 分别计算图像到文本和文本到图像的交叉熵损失。
  • 总损失 ( \text{loss} ) 是两个方向损失的平均。

模型训练和性能调整

  • 训练了不同配置的ResNet和Vision Transformer模型。
  • 对于文本编码器,主要调整模型的宽度,而不是深度,因为发现CLIP的性能对文本编码器的容量不太敏感。

zero-shot transfer

文本的多义性

比如crane=起重机||鹤

所以就用一个prompt engineering : 把单个的单词改为一个句子:”A photo of a {label}.”

可以很好解决这个问题

而且对于不同的任务可以换不同的模板,文中一共用了80个

对于难的数据集,few shot更合理

毕竟人也不一定能分出来

downstream用全部的数据不用few shot:

为什么用linear probe不用fine tune:

  1. 网络基本是冻住的,可学习空间小,这样本来预训练的模型效果不好的话,downstream的模型效果也不会好
  2. 不怎么需要调参,fine tune可调的参数太多了
  3. 本来就是要研究和数据集无关的预训练方式的

不足之处

通过加规模提点的代价很大

细分类的效果一般

不能处理特别抽象的概念(计数,区分监控视频是否异常等)

对数据的利用不高效

可以提供一些难以用语言描述的样本(有时候提供1,2shot还比zero shot差了,应该是说某些prompt提供的不太好?)

CLIP相关工作

LANGUAGE-DRIVEN SEMANTIC SEGMENTATION

image-20240416140021321

这里升维到N是为了进行后续语义分割的工作

Word-pixel correlation tensor(就是橙色的部分)

目标是最大化与地面真实标签k=y{ij}对应的条目 (f{ijk}) 的点积

公式2:

对于每一个像素位置(i,j)都能有一个N维向量,所以可以算一个softmax的输出,然后把这些输出加起来就可以得到每一维度的输出

GroupViT: Semantic Segmentation Emerges from Text Supervision

上一篇工作并没有把文本作为监督信号,如何做到,并做到无监督的训练?

这篇工作并不依赖于segmentation mask的手工标注,而是可以像CLIP那样利用img-text文本对,进行无监督训练

Group:总之是某种聚类?

能在学习的时候就能把相邻相似的像素点group起来,变成一个个的segmentation mask

image-20240416181057812

Grouping Block:这个块的主要功能是计算学习到的组标记(group tokens)与图像片段标记(segment tokens)之间的相似性。这一计算过程主要通过使用gumbel softmax来完成。

关于loss:text的loss和之前是一样的,但在avg pooling前面那一步,还是一个8*384的特征序列,所以要把8块特征融合到一块,pooling之后再经过MLP就得到了一个一维的特征向量

问题:

  1. 依然是CLIP的问题:只能学到语义明确的东西(比如背景就是一个不明确的东西)

OPEN-VOCABULARY OBJECT DETECTION VIA VISION AND LANGUAGE KNOWLEDGE DISTILLATION

clip作为教师,知识蒸馏自己的模型?

还不懂知识蒸馏是什么。。。

考虑图1,我们能否设计出超越仅识别训练标签中存在的基本类别(例如,玩具)的对象检测器,并扩展词汇表以检测新的类别(例如,玩具大象)?在本文中,我们的目标是训练一个开放词汇的对象检测器,该检测器能够检测任何由文本输入描述的新类别的对象,仅使用基本类别中的检测注释。

怎么定位,怎么分类?这两个文中是分开来做的

image-20240417013350611

image-20240417013009969

N个proposals通过RPN得到(也就是物体可能存在的位置)

$e_r$是reign embedding

z(r)是一个类似logits的东西

然后就能和ground truth算一个交叉熵了

在文中提到的“M pre-computed proposals”指的是预先计算好的候选区域(proposals),这些候选区域是在训练过程中或训练之前由区域提议网络(Region Proposal Network, RPN)生成的。这些proposals被用于后续的处理步骤,包括裁剪、调整大小,并通过预训练的图像编码器来生成图像嵌入。

在ViLD方法中,这些预先计算的proposals用于两个主要目的:

  1. ViLD-image:在这个组件中,使用预先计算的proposals来生成图像嵌入,这些嵌入随后与区域嵌入进行对齐,以最小化它们之间的距离(例如,使用L1损失)。这有助于确保检测到的区域在视觉上与分类模型中的相应类别相匹配。
  2. ViLD-text:在这个组件中,使用预先计算的proposals的图像嵌入与文本嵌入进行比较和分类。文本嵌入是通过将类别名称输入到预训练的文本编码器中生成的。

这些预先计算的proposals是在模型训练阶段之前生成的,通常是通过在训练集上运行RPN来实现的。这样做的目的是为了加速训练过程,因为这避免了在每个训练迭代中重复生成proposals的需要。这些proposals被视为固定输入,用于训练过程中的知识蒸馏和特征学习。

ViLD-text做的是img-text的关联,然后就可以做zero-shot了(目前是在basic class上训练的,还没有novel class)

右边是teacher,左边是student

没看懂,为什么不直接用clip的encoder做region embedding呢(胡言乱语)

image-20240417015012734

使用ViLD进行开放词汇对象检测的概述。ViLD从预训练的开放词汇图像分类模型中提取知识。首先,使用预训练分类模型中的文本和图像编码器计算类别文本嵌入和裁剪对象提议的图像嵌入。然后,ViLD使用文本嵌入作为区域分类器(ViLD-text)并最小化每个提议的区域嵌入和图像嵌入之间的距离(ViLD-image)。在推理过程中,使用新类别的文本嵌入来实现开放词汇检测。

GLIP

CLIP适用于分类任务,而GLIP尝试将这一技术应用于目标检测等更加复杂的任务中。

作者提出了phrase grounding的概念,意思是让模型去学习图片和句子短语之间更加精细的联系

image-20240421210827727

loss=L分类+L定位

先看detection

image-20240421213653722

O就是N*d的region embedding,就是说有N个bounding box,每个的维度是d,然后后面接一个分类头,看每个bounding box里的物体是哪个类, c 是多少个类别,乘一下就能得到分类的logits $S_{cls}$,然后和ground truth算一个loss就能算最终的分类结果了

再看vision grounding

image-20240421213639703

是通过算了一个$S_{ground}$ ,将目标检测重新定义为短语匹配(grounding)任务时使用的对齐分数

P是输入text的embedding,然后和img的embedding算一个相似度

也就是说,$S_{ground}$表示每个区域/框与每个短语之间的匹配程度,是我们重新定义的目标检测任务的核心输出,通过优化这个对齐分数,模型可以学习将图像区域与文本短语进行精准匹配。

这种统一的损失函数有两个好处:

  1. 可以同时优化目标检测和短语匹配两个任务,发挥两者之间的协同效应。
  2. 可以直接将训练好的短语匹配模型应用到任意目标检测任务上,实现零样本迁移。

总体框架

image-20240421215009930

这里的deep fusion可以实现特征间的融合:

  1. 使用DyHead作为图像编码器,BERT作为文本编码器。
  2. 在DyHead的最后几个模块和BERT的顶层之间,添加了跨模态多头注意力模块(X-MHA)。
  3. 这个X-MHA模块实现了图像特征和文本特征之间的交互和融合。
  4. 融合后的特征会再经过单模态的融合和更新,得到最终的语言感知视觉表示。

具体公式:

image-20240421220233790

其中O和P分别表示视觉和语言特征,i表示DyHead和BERT的层数。通过这种跨模态的深度融合,GLIP可以学习到语言感知的视觉表示,从而提高在各种目标检测任务上的泛化性能