背景
目前许多的视觉任务都是基于固定的类别类目进行训练的到的模型。当出现新的类别的时候,往往不能很好的适应。而在NLP领域中,自回归/masked的这种无监督的训练方式已经逐步成为主流,并且也取得了很不错的效果。
那么能否基于网络上大量存在的文本训练一个预训练网络在视觉的下游任务上大展拳脚呢?
本文的主要工作就是基于大量的图文对训练一个foundation model。这个model可以zero-shot的直接迁移到下游的各种分类任务中,并取得了匹配监督学习的方法。
由于这个foundation model是基于大量图文对通过对比学习来训练得到的。因此这个模型也称之为:Contrastive Language-Image Pretrained model,CLIP。
方法
整体的网络结构如下图所示。
在训练阶段,他是基于大规模图文对的无监督训练方式。他的优化目标可以理解为让属于同一个pair的图片embedding和文本embedding尽可能的相似,让不同pair的图片embedding和文本embedding尽可能不相似。通过这样的我们可以得到一个图片和文本的encoder。使得如果图片和文本是一个pair,那么他们的embedding相似度也会尽可能的高。
基于这样的条件,我们引出了如何进行zero-shot learning的方式,如下图所示。前提是我们有一组需要区分的类别,也知道当前的图片确实可以分到这些类别里面,那么我们可以通过给类别增加一些prompt,抽取这些prompt的文本embedding,再抽取图片的visual embedding,分别将visual embedding和不同的prompt的embedding计算相似度,哪个prompt的相似度最高,则属于那个类别。
-
QA1:有些类别标注的时候是具有奇异的,怎么解决?
- 一般会通过ensemble的方式来解决,对class_name进行多种方式的prompt,然后在embedding维度进行平均。
-
QA2:loss的详情展开介绍
- 文本给出了CLIP的简化版本代码,包括了loss的计算,如下图所示。简单来讲,首先根据Image和Text分别提取两者的embedding。然后将两者的embedding映射到相同的语义空间。然后计算两者的相似度,构成了B*B的矩阵,行是图像,列是文本,然后我们再分别根据行和列计算交叉熵,两者相加/2。
- 为什么要做L2-norm?将embedding放缩到相同的空间。
- image_encoder和text_encoder参与训练吗?应该是参与训练的
Segment Anything
上面CLIP的这项工作相当于是visual+language 融合结合prompt的开山之作?在2023年最新的基于这种思路的Segment Anything 在语义分割领域被提出来了。其网络结构如下图所示。
可以看到它整体分为三个部分。Image Encoder、Prompt Encoder和Mask Decoder。
- Image Encoder这里采用ResNet、ViT的方法都可以
- Prompt Encoder:由于这里支持多种样式的Prompt:bbox、point、text和mask,针对不同样式的prompt,分别采用不同的encoder。
- bbox和point样式的prompt采用position encoding的方式
- text样式采用预训练好的CLIP模型的text encoder作为encoder
- mask样式:采用卷积并且和原图的embedding想加的方式输入到decoder
- Mask Decoder:采用的是修改过后的基于transformer的decoder作为图像的解码器。
与普通的语义分割不同,SAM一般会输出三个分割的结果,因为输入的prompt是歧义的。
训练数据如何收集?
- 第一阶段是基于已有的标注数据训练Segmentation Model
- 半辅助标注
- 全自动标注