网络资料整理个人学习,感谢各位大神!(若侵则删)
问题20:图像无监督+文本检索目标
参考:【大模型系列】根据文本检索目标(DINO/DINOv2/GroundingDINO)_dino目标检测-CSDN博客
https://zhuanlan.zhihu.com/p/676914980
自监督学习之对比学习:MoCo模型超级详解解读+总结-CSDN博客
linear probe(线性探针)是测试预训练模型性能的一种方法,又称为linear probing evaluation。训练后,要评价模型的好坏,通过将最后的一层替换成线性层,然后只训练这个线性层就是linear probe。linear probes相当于通过在保持固定的预训练特征表示之上,训练线性分类器来解决诸如 ImageNet 分类之类的困难任务。
MoCo系列和SimCLR系列算法再次打开了视觉自监督的大门,二者都基于对比学习来构建学习任务,通过正负样本对训练模型,且针对如何获取足够多的负样本对的问题,也都各自给出了解决方案。足够多的负样本是保证效果的前提,但是像SimCLR采用大batch的方式对机器资源要求极高,像MoCo采用队列(queue)的方式也稍显复杂。在此之后,针对正负样本对的进一步思考催生了一些不再需要负样本对的算法,其中以BYOL和SimSiam最具代表性,二者在不使用负样本对的情况下,借助其他trick成功预训练模型,避免了模型训练崩塌。由此,视觉自监督经历了从基于对比学习的需要正负样本对训练到只需要正样本对进行训练的过程。
到SimSiam为止,视觉自监督的架构已经极为简洁且有效,这个阶段主要关注的是训练方法的研究,但关于网络结构方面的探索,除了SimCLR v2以外,其他都较少涉猎。此时,2020年10月Google推出的ViT推动了Transformer结构在视觉自监督预训练中的应用,代表性工作就是2021年4月推出的MoCo v3和DINO,由此,视觉自监督开始经历从CNN架构到ViT架构的过渡。
在MoCo v3和DINO之前的视觉自监督其实和文本自监督不大一样,差异主要在2点:1、网络结构。文本自监督基本上用的都是transformer,而视觉自监督用的主要是CNN系列,例如ResNet。2、训练方式。文本自监督主要采用基于掩码重建的编解码器结构,而视觉自监督主要基于对比学习的双塔结构。这2点差异在ViT这个工作出来后开始逐渐被消除,transformer架构开始广泛应用在视觉的各个领域,也为后续基于掩码重建的视觉自监督发展埋下伏笔。
从2019年11月的MoCo到2021年4月的MoCo v3,视觉自监督主要围绕以对比学习为主的架构发展。在这1年半的时间内涌现出各类算法推动着该领域的发展,经历了从基于正负样本对的对比学习,到仅需要正样本对的简洁架构,再到以ViT为主的架构发展,效果指标上不断逼近甚至超越过去的有监督预训练。一直以来,视觉自监督期望可以像以BERT为代表的文本自监督一样蓬勃发展,在ViT提出后,视觉与文本领域的差异被再次缩小,视觉自监督也开始迎来以掩码重建(Masked modeling)为主的生成式自监督时期。
DINO
DINO:可以理解为由DIstillation和NO labels的缩写,表示为一种没有标签的自蒸馏方法,重塑自监督学习。是2021年Facebook AI发表在CVPR上的方法(Emerging Properties in Self-Supervised Vision Transformer) 。DINO是最早探讨基于Transformer架构的自监督学习代表作之一,其通过在无标签的图像上进行子监督训练来学习视觉特征表示。在这个方法中,模型使用自身的输出来生成“伪标签”,然后使用这些伪标签来重新训练模型,从而进一步提高模型的性能和泛化能力。
其他自监督算法:BYOL,MoCov2 and SwAV
DINO 的核心思想便是通过在大规模的无标签数据集上进行对比学习,学习出一组具有可传递性的视觉特征表示。在 DINO 中,作者通过引入一个新的对比学习方法,将原始图像的特征与随机裁剪的图像的特征进行对比,从而学习到更好的视觉通用表征,最终也获得了非常出色的效果。
该方法的核心思想是使用一种叫做自蒸馏的方法,即将一个学生模型的表示与一个动量化的教师模型的表示进行比较,以学习出更好的特征表示。
这种学生和教师网络均输出相同 embeddings
的情况容易出现模式崩塌(mode collapse
)的现象。在《Momentum Contrast for Unsupervised Visual Representation Learning
》一文中提出了一种解决方案,即应用“动量教师”(momentum tearcher
)模型,可以简单地理解为就是教师的模型不是基于反向传播更新的,而是再对学生模型进行梯度回传后,在通过指数移动平均(Exponentially Weighted Average, EWA
),直接将学生网络学习到的模型参数更新给教师网络,换句话就是教师网络的权重更新自学生网络。
DINO 中便是沿用这种方式。具体地,我们可以简单看下教师权重的更新公式:
这里下标 t 和 s 分别指代教师和学生网络对应的模型参数;而 λ 则跟随余弦学习率衰减策略在训练过程中从 0.996 到 1 之间进行变化。
数据增强
一句话总结:teacher用大图,student用小图+大图
DINO 中最核心的数据采样策略便是图像裁剪,这也是自监督学习领域应用非常广泛的主策略之一。一般来说,我们可以将裁剪后的图像分为两种:
Local views: 即局部视角,也称为 small crops,指的是抠图面积小于原始图像的 50%;
Global views: 即全局视角,也称为 large crops,指的是抠图面积大于原始图像的 50%;
在 DINO 中,学生模型接收所有预处理过的 crops 图,而教师模型仅接收来自 global views 的裁剪图。据作者称,这是为了鼓励从局部到全局的响应,从而训练学生模型从一个小的裁剪画面中推断出更广泛的上下文信息。**简单来说,就是把局部特征和全局特征分别交给不同的模型来学习,以便在处理整个图像时,能够更好地对局部细节和上下文进行综合判断。**此外,为了使网络更加鲁棒,DINO 中也采用一些其它的随机增强,包括:
颜色扰动(color jittering)
高斯模糊(Gaussian blur)
曝光增强(solarization)
损失函数
在 DINO 中,教师和学生网络分别预测一个一维的嵌入。为了训练学生模型,我们需要选取一个损失函数,不断地让学生的输出向教师的输出靠近。softmax 结合交叉熵损失函数是一种常用的做法,来让学生模型的输出与教师模型的输出匹配。具体地,通过 softmax 函数把教师和学生的嵌入向量尺度压缩到 0 到 1 之间,并计算两个向量的交叉熵损失。这样,在训练过程中,学生模型可以通过模仿教师模型的输出来学习更好的特征表示,从而提高模型的性能和泛化能力。
Centering and Sharpening
在 DINO 论文中,还有两个不得不提的点便是 Centering
和 Sharpening
,这是用于防止模式崩塌的两种有效方式。
在自监督学习中,mode collapse 是指网络的学习过程中出现了多样性减少的现象。具体来说,当网络学习到一组特征表示时,往往会出现多个输入数据映射到相同的特征表示的情况,这就是所谓的模式崩塌。这种现象通常是由于网络在优化过程中陷入了局部最优解,只能考虑到一部分数据的特征表示,而忽略了其它数据样本的模式和特征,从而导致了多样性缺失的现象,因此会对模型的鲁棒性产生很大的负面影响。
先来看下 Centering
。首先,教师模型的输出经过一个 EMA 的操作,从原始激活值中减去得到一个新的结果。简单来说,可以表述为下列公式:
Logits=Logits−LogitsmeanLogits=Logits−Logitsmean
这个操作的目的是使得激活值有时候是正的(当它们高于平均值时),有时候是负的(当它们低于平均值时)。由于 softmax 函数在处理负数时会给出较小的概率值,而在处理正数时会给出较大的概率值,因此这种操作能够防止任何一个特征占据统治地位,因为平均值会在值的范围中间。
最后,再看看 Sharpening
。这种技巧通过在 softmax 函数中加入一个 temperature 参数,来强制让模型将概率分布更加尖锐化。由于小差异会被夸大,这会防止所有激活值都是相同的,因为小的差异也会被放大。这个技巧和中心化操作搭配使用,可以使得激活值不断变化,从而引导学生模型更好地了解哪些特征应该变得更加强大。
DINOv2
DINOv2:是Meta在2023年CVPR上公开的一种在大型图像数据集上训练图像编码器,以获得具有通用语义的视觉特征(DINOv2: Learning Robust Visual Features without Supervision)。可以看作是DINO的增强版,其核心特点:
通过无监督的学习方法,构建了一个自动化数据管道,创建了一个包含公开/网络数据的大规模数据集(LVD-142M高质量数据集);
训练一个10亿参数的ViT模型,通过无监督蒸馏方法,可以将其压缩成一系列能够用于不同任务的小模型;
‘’‘
学习任务无关的预训练表示已经成为自然语言处理(NLP)的标准(Radford等人;Raffel等人,2020;Chowdhery等人,2022;Hoffmann等人,2022;Touvron等人,2023)。人们可以 "按原样 "使用这些特征,即不进行微调,并在下游任务上取得明显优于特定任务模型的表现(Brown等人,2020)。这种成功已经被使用前置目标的大量原始文本的预训练所推动,例如语言模型(Radford等人,2017)或单词向量(Devlin等人,2018),这些目标不需要监督。
在NLP的这一范式转变之后,我们预计计算机视觉中会出现类似的 "基础 "模型(Bommasani等人,2021)。这些模型应该产生在任何任务中都能发挥作用的视觉特征,包括在图像层面,如图像分类,以及像素层面,如分割。对这些基础模型的大多数有希望的努力集中在文本指导的预训练上,即使用一种文本监督的形式来指导特征的训练(Joulin等人,2016;Mahajan等人,2018;Radford等人,2021)。这种形式的文本指导的预训练限制了可以保留的图像信息,因为字幕只是近似于图像中的丰富信息,而复杂的像素级信息可能是并没有浮出水面。此外,这些图像编码器需要对齐的文本-图像语料库,因此,不能提供其文本对应物的灵活性,即仅从原始数据中学习。
文本指导预训练的一个替代方法是自监督学习(Caron等人,2018;Chen等人,2020;He等人,2021),其中特征仅从图像中学习。这些方法在概念上更接近于语言模型等前置任务,并且可以在图像和像素层面上捕捉信息(Caron等人,2021)。然而,尽管它们有可能学习所有目的的特征,自监督学习的大部分进展都是在小型策划数据集ImageNet1k(Russakovsky等人,2015)上进行预训练的。一些关于将这些方法扩展到ImageNet-1k之外的努力已经被尝试过了(Caron等人,2019;Goyal等人,2021;2022a),但他们专注于未经整理的数据集,这通常会导致特征的质量大幅下降。这是因为缺乏对数据质量和多样性的控制,而这是产生良好特征的关键。
在这项工作中,我们探讨了如果在大量的策划数据上进行预训练,自监督学习是否有可能学习所有的视觉特征。我们重新审视了现有的在图像和碎片层面学习特征的判别性自监督方法,如iBOT(Zhou等人,2021),并在更大的数据集的镜头下重新考虑了他们的一些设计选择。我们的大部分技术贡献都是针对在模型和数据规模扩大时稳定和加速判别性自监督学习的。这些改进使我们的方法比类似的判别性自监督方法快2倍左右,所需内存少3倍,使我们能够利用更大的批次规模进行更长时间的训练。
关于预训练数据,我们已经建立了一个自动pipeline,从大量的未经整理的图像中过滤和重新平衡数据集。这个pipeline的灵感来自于NLP中使用的pipeline(Wenzek等人,2019年),其中使用了数据相似性而不是外部元数据,并且不需要手动标注。在处理野外的图像时,一个主要的困难是重新平衡概念,避免对少数主导领域的过拟合。在这项工作中,一个朴素的聚类方法能合理地解决这个问题。我们收集了一个由1.42亿张图片组成的小型但多样化的语料库来验证我们的方法。
最后,我们提供了各种预训练的视觉模型,称为DINOv2,在我们的数据上用不同的Vision Transformers(ViT)(Dosovitskiy等人,2016)架构训练。我们发布了所有的模型和代码,以便在任何数据上重新训练DINOv2。我们在各种计算机视觉基准上验证了DINOv2在图像和像素层面上的质量,因为我们对其进行了扩展,如图2所总结的。我们的结论是,仅靠自监督的预训练是学习可迁移的冻结特征的一个很好的候选者,这些特征与最好的公开可用的弱监督模型有竞争力。
‘’‘
数据集LVD-142M构造流程:
数据采集:包含公开数据集(ImageNet-22k、ImageNet-1K、Google Landmarks等)和网络爬取的数据;
数据去重:利用(A self-supervised descriptor for image copy detection , cvpr2022, meta)中提到的方法进行数据去重;
自监督图像检索::使用一个在ImageNet-22k上预训练的ViT-H/16用于计算每个图像的image embedding,再使用kmeans聚类,从未标注数据中检索出与精心整理过的数据集中存在相似度很高的那部分样本。最后,给定一个查询图像,DINOv2从查询图像所在的聚类中检索出N个最相似的图像用于网络训练。
DINOv2 采用了一种判别式自监督方法(Discriminative Self-supervised Pre-training)来学习特征,这种方法可以看作是以SwAV为中心的DINO和iBOT 损失的组合。具体而言,作者们实现了以下几种方法:
**图像级损失(Image-level objective):**利用一种交叉熵损失函数来比较从学生和教师网络中提取出的特征。这些特征都来自于ViT的cls token,通过对同一图像的不同裁剪图像进行提取得到。作者们使用指数移动平均法(EMA)来构建教师模型,学生模型的参数则通过训练得到(DINO的方法)。
**Patch级损失(Patch-level objective):**随机遮盖一些patch输入给student,teacher不遮盖,计算在遮盖的 patch上特征的交叉熵损失函数。
参考iBOT:
**解耦上述的两个优化目标(Untying head weights between both objectives):**作者们发现,将两种目标的权重绑定在一起会导致模型在 Patch-level 欠拟合,在 Image-level 过拟合。于是不复用权重,使用不同的head就可以避免这个问题。
Sinkhorn-Knopp centering: 使用SwAV中提到的Sinkhorn-Knopp(SK) Batch Normalization来代替DINO和IBot中的teacher网络中的softmax-centering步骤;对student进行3次Sinkhorn-Knopp算法迭代,再使用softmax进行normalization。(Sinkhorn-Knopp聚类算法,也称为Sinkhorn-Knopp迭代算法或正则化平衡聚类算法,是一种基于流形正则化(下面有介绍流形正则化)的聚类方法。)
KoLeo regularizer: KoLeo regularizer 是一种正则化方法,它通过计算特征向量之间的差异来确保它们在批次内均匀分布,其源自于 Kozachenko-Leonenko 微分熵估计器,可以使得一个batch内的特征具有统一跨度。
调整分辨率(Adapting the resolution): 这一步主要是涉及在预训练的最后一段时间内,将图像的分辨率提高到(224x224->416x416->) 518×518 ,便在下游任务中更好地处理像素级别的信息,例如分割或检测任务。高分辨率的图像通常需要更多的计算资源和存储空间,因此只在预训练的最后阶段使用这种方法,以减少时间和资源成本。
Grounding DINO
这里的DINO跟上面的DINOv1和v2不是一个东西,DINOv1和v2是DIstillation NO label。Grounding DINO的工作承接于DINO: DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detection这篇文章,该文章也将自己的方法命名为DINO((DETR with Improved deNoising anchOr boxes)。这里为了归类方便,所以写在了一起。
根据输入文字描述检测图像中的指定目标
传统目标检测:将范围限定在特定的类别集合之中;
开放集目标检测:指根据文本检测任意目标,即为开集目标检测;
关于开集目标的检测的两种思路:
- Referring:表示学习的思路,对region特征进行分类。即为先提取目标region再,再判断类别;
- Grounding:将Detection文件转化为Grounding问题,如将图像类别名称(描述)作为prompt,然后将图像与prompt一同输入模型,从而获得对应的类别和bbox;
Grounding DINO设计思路
- 特征提取主干Backbone;
- 特性增强模块Neck;
- 区域细化(或边界框预测)Head;
让一个close-set detector在文字引导下识别新类别的关键是利用contrastive loss建立图像特征和文字特征的关联。为了帮助模型获得跨模态的能力,特征融合可能发生在以下三个阶段中:neck (phase A), query initialization (phase B), 和 head (phase C)。举例来说,GLIP选择了phase A,而OV-SETR选择在phase B进行模型融合。Grounding DINO认为融合的越多越好,所在在A、B、C三个阶段都有文本与图像特征的交互。
Grounding DINO的整体结构如上图所示。Grounding DINO是一个双encoder单decoder结构,它包含了:
- image backbone用于提取image feature(Swin transformer)
- text backbone用于提取text feature(BERT)
- feature enhancer用于融合image和text feature
- language-guide query selection模块用于query初始化
- cross-modality decoder用于bbox预测。
Sub-Sentence Level Text Feature
以往的工作中主要采用两种text prompt,分别为sentence level和word level的表达,如下图所示。
sentence level的方式将整句话编码为一个特征,但是它只保留与GT相关的短语。例如上图(a)所示,“A cat is sleeping on a table"只保留"A cat"和"a table”,这种方式忽视了句子中某些更细粒度的信息。
word level的方式能够同时编码多个类别的名字,但是却引入了类别之间很多不必要的依赖。如图(b)所示,很多没有关系的类别也产生了交互。
字句级:为了避免上述问题,作者引入了attention mask来屏蔽不相关类别名之间的联系,称作sub-sentence level的方式,如上图©所示。
说人话就是:作者引入了一个新的分割符号.用于区分文本中的不同类别,因此建议在实际使用时,使用符号.来分割句子。
问题21: SAM
参考:图像分割的大变革:从SAM(分割一切)、FastSAM、MobileSAM到SAM2_sam分割-CSDN博客
SAM模型整体上包含三个大模块,image encoder,prompt encoder和mask decoder。
image encoder用于对输入图像进行特征提取,并获取编码;prompt encoder则是对输入的prompt进行编码;mask decoder最终根据输入的图像和prompt编码进行解码得到最终的分割mask。
1. image encoder
图像的编码器其实很简单,就是一个简单的ViT结构,它的目的就是用于图像的特征提取,作者也说,对于image encoder来说可以是任何网络结构,其实可以选择多种backbone,ViT只是其中一种。
其基本流程和ViT一样,patch embeding(取patch)—> add position embeding —> transormer block —> conv(降低通道数)。 整个SAM模型在该部分耗费了较大的计算量。
2. prompt encoder
提示词编码器用于完成prompt的特征编码。针对prompt,作者定义了sparse和dense两种属性。
sparse:点、边框、文本
dense:掩码mask
点:如果prompt是点,其映射由两个部分相加组成,一个是位置编码(用空间坐标乘以高斯分布的向量来描述位置)。另一部分是一个描述当前点是前景还是背景特征的可学习的一维向量。
边框:如果prompt是边框,那边框的映射也是由两个部分相加组成,第一部分是左上和右下两个点的位置编码,第二部分是一组一维向量用来描述这个点是“左上”还是“右下”。
掩码mask:点和边框属于sparse prompt,对于mask来说,**在输入prompt encoder之前,先把mask下采样4倍,通过卷积再下采样4倍(尺寸缩小16倍)。最后通过1x1卷积提升通道数量。**如果没有提供mask,也就是我们实际inference时候的场景,这个结构会直接返回一个描述“没有mask”特征的特征图。
1)prompt embedding
在prompt embedding进入decoder之前,首先concat了一组可学习的output tokens,output tokens由两个部分构成 iou token 和 mask token:
iou token:iou token会在后面用于预测iou scores,它受到模型计算出的iou与模型计算出的mask与GT实际的iou之间的MSE loss监督;
mask token:参与预测最终的mask。mask受到focal loss和dice loss 20:1的加权组合监督。
个人感觉output tokens可以理解成对模型的额外约束,output tokens参与构成模型的最终输出且有loss对其进行监督。
2)image embedding
image embedding在进入decoder之前也要进行一步操作:dense prompt由于包含密集的空间信息,与image embedding所在的特征空间一致性更高,所以直接与image embedding相加融合。因为后面要与prompt做cross attention融合,这里还要先算一下image embedding的位置编码。
3)decode
接下来{image embedding,image embedding的位置编码,tokens}进入一个两层transformer结构的decoder做融合。其中image embedding主要用做cross-attention中的k v—对应图中绿线, tokens作为q—对应图中紫线(cross-attention存在于图中的 token to image attn 和 image to token attn)。
末尾的2x conv trans为两层kernel_size=2, stride=2的转置卷积,会进行上采样到4x大小(由于是4x降采样原图的大小),产生最终的image embedding,并与mask token做矩阵乘法。最后,别对mask的预测和iou预测进行监督,反向传播,更新参数。
需要一个大量且多样化的mask数据。自然语言数据是通过在线获取,但是mask数据是不足的,需要一个替代策略,最终方案就是建立一个“数据引擎”,分成3步:
人工辅助(帮助标注,类似交互式分割)
半自动(通过提供提示,自动生成对象mask)
全自动(通过规则格网作为提示,进行自动生成)
原文链接:https://blog.csdn.net/v_JULY_v/article/details/131503971