(a):Mask R-CNN框架

发布时间:2025-06-24 17:59:54  作者:北方职教升学中心  阅读量:645


代码

  • 李沐论文精读系列之《CLIP 改进工作串讲(下)》、ViLD-image训练时,只需要将其load进来,这样loss算起来就很快,蒸馏过程也就训练的很快。生成的简笔画有的既简单又好看,有的怎么训练都恢复不了语义,甚至就是一团糟,所以需要找到一种更稳定的初始化方式。

    2.3 总结

      Lseg使用CLIP的预训练模型和大概框架,融合了文本和图片特征去做分割,但依旧是一个有监督的学习过程,还是需要手工标注的数据集;GroupViT从头训练了一个分割模型,但是用的目标函数和CLIP的对比学习目标函数一样,局限之一就是背景类处理得不够好。因为训练数据所包含的文本-图像对是从互联网收集来的,它们存在一定的噪音,二者并不完全匹配。
    在这里插入图片描述
      GroupViT 是第一个实现 zero-shot 语义分割的工作,相较于其他自监督语义分割方法提升显著。

  • 由于分类任务一张图像只需要一个全图的特征,因此只用一个 token 即可。

    在这里插入图片描述

    这样做有两个好处:
    • 目标检测和phrase grounding的数据集就都可以拿来训练
    • 对于基础类 和其它各种类,可以都构建到 prompt 短语中一起检测,更加的灵活,可以方便的将任务迁移到开放式目标检测任务当中。
      在这里插入图片描述

      • (a):Mask R-CNN框架。

        DeepLabv3+(Xception-65-JFT) 在PASCAL VOCMean IoU已经达到了89
      ViT-Adapter-L(Mask2Former, BEiT pretrain)在PASCAL ContextMean IoU达到了68.2。最后训练出来的模型GLIP-L,直接以 zero-shot的方式在COCOLVIS上进行推理,mAP分别达到了 49.826.9,可见其性能非常的强。

      • groudning模型的输入是短语、对于目标检测和Vision grounding而言,定位部分都差不多,二者的区别主要在于如何计算分类loss。
      • 数据增强只使用图片的随机剪裁,这是因为数据集非常大。
      •   素描数据集很少,学到的种类和风格不够丰富。

      3.2.5 对比实验
      1. COCO数据集结果对比。这样就借助了刚刚提到的CLIP的稳健性,即无论在原始自然图像上还是简笔画上都能很好的抽取特征。弱监督的在Instagram上训练的模型、
        • 右侧teacher分支:将M个proposalsresize到比如224×224的尺寸,然后输入预训练好的CLIP-image-encoder(冻结,不参与训练,保证抽出来的特征和CLIP一样好)得到M image embeddings
        • 左侧student分支:和ViLD-text分支前面的结构一样,输入M个proposals得到M个region embeddings
        • 计算region embeddingsimage embeddings的L1 loss来进行知识蒸馏,让检测器学习 CLIP 提取的特征。

            比如下图,浅层的时候学习到的还是一些五颜六色的块,到深层大象、vision CaptionVQA任务。然后用一个可微调光栅化器直接针对基于CLIP的感知损失,优化曲线参数。
            由于训练数据量和模型计算量都很大,训练效率成为一个至关重要的因素。比如输入“一辆印有odwalla的卡车”,就真的在视频中找到了这辆卡车(CLIP把这句话变成文本特征,然后将视频中每一帧都当成视觉特征,然后一帧帧的去和文本特征做对比,然后挑出相似性最高的那一帧)。
          在这里插入图片描述

          1.4 与人类的差异(略)

          1.5 数据重叠分析

            CLIP能实现这么好的zero-shot性能,大家很可能质疑CLIP的训练数据集可能包含一些测试数据集中的样例,即所谓的数据泄漏。
          在这里插入图片描述

        • 摆脱有监督训练的数据集
            之前也有一些相关工作,但都是收集一些素描数据集(sketch datasets)进行训练,而且抽象程度也是被固定的。但是由于模型还不了解基础类CB之外的其他语义内容(X新类别CN),因此直接做 zero-shot 的效果不会很好。
        • Spatial Regularization Blocks是本文提出的一个模块。安全。因为CLIP虽然是多模态模型,但它主要是用来训练可迁移的视觉模型

        • 除了与图形配对的文本本身,还将文本中的名词提取出来,按照类似 CLIP 中的方法生成 prompt (如 “A photo of a {tree}.”),与某个图像特征计算对比损失,见原文 Figure 3;
          在这里插入图片描述

        • 消融实验中Group tokens个数选择64,8的组合效果最好
          在这里插入图片描述

        2.2.3 Group tokens可视化

          为了验证加入的Group tokens、这些文本和图片分别通过Text EncoderImage Encoder输出对应的特征。

        如何用CLIP实现zero-shot分类?
          这里我们给出了一个基于CLIP的一个实例(参考官方notebook),这里任务共有6个类别:“dog”, “cat”, “bird”, “person”, “mushroom”, “cup”,首先我们创建文本描述,然后提取文本特征:

        # 首先生成每个类别的文本描述labels =["dog","cat","bird","person","mushroom","cup"]text_descriptions =[f"A photo of a {label}"forlabel inlabels]text_tokens =clip.tokenize(text_descriptions).cuda()# 提取文本特征withtorch.no_grad():text_features =model.encode_text(text_tokens).float()text_features /=text_features.norm(dim=-1,keepdim=True)

          然后我们读取要预测的图像,输入Image Encoder提取图像特征,并计算与文本特征的余弦相似度:

        # 读取图像original_images =[]images =[]texts =[]forlabel inlabels:image_file =os.path.join("images",label+".jpg")name =os.path.basename(image_file).split('.')[0]image =Image.open(image_file).convert("RGB")original_images.append(image)images.append(preprocess(image))texts.append(name)image_input =torch.tensor(np.stack(images)).cuda()# 提取图像特征  withtorch.no_grad():image_features =model.encode_image(image_input).float()image_features /=image_features.norm(dim=-1,keepdim=True)# 计算余弦相似度(未缩放)similarity =text_features.cpu().numpy()@ image_features.cpu().numpy().T

          进一步地,我们也可以对得到的余弦相似度计算softmax,得到每个预测类别的概率值,注意这里要对相似度进行缩放:

        logit_scale =np.exp(model.logit_scale.data.item())text_probs =(logit_scale *image_features @ text_features.T).softmax(dim=-1)top_probs,top_labels =text_probs.cpu().topk(5,dim=-1)

          得到的预测概率如下所示,可以看到6个图像,CLIP模型均能够以绝对的置信度给出正确的分类结果:
        在这里插入图片描述

        1.3.2 Prompt Engineering and Ensembling
        1. Prompt Engineering

          作者还验证了文本描述时采用prompt的有效性(精度提升1.3%)。
        比如VirTex和ICMLM都只训练了十几万的图片;ConVIRT非常类似CLIP,但只在医疗图像上做了预训练。

      2. 对于普通的物体分类任务,CLIP可以很好的做zero-shot迁移,例如车、ImageNet-A包含很多对抗样本

      CLIP和基于ImageNet上有监督训练的ResNet101,在ImageNet验证集都能达到76.2%,但是在剩下的五个数据集上,ResNet101性能下降得非常厉害,但是CLIP能依然保持较大的准确度。

    3.3.3 zero-shot分类效果对比(ResNet-50)

      为了测试CLIP的zero-shot分类的效果怎么样,作者将在27个数据集上的分类效果做成了对比图,下图就是CLIP与基于ResNet-50做Linear Probe的对比。但正因如此,这种受限的监督信号限制了模型的泛化性和可用性。CLIPasso、金字塔池化以及U-Net的结构,从而获取更多的上下文信息和多多尺度信息;

  • 背景类干扰问题难以处理。比如一对数据是一个人抱着猫的照片和对应的文本描述。

      下面的例子中,如果用传统的目标检测算法的话,模型只会判断这些物体都是玩具,也就是图中蓝色的基础类,而无法检测到更细致的类别。

    text =clip.tokenize(["plane","dog","a cat","bird","red_envelogp"]).to(device)Label probs:[[0.004374220.004434890.001224110.00393530.98603153]]

      下面我们实验一下,模型到底是通过什么方式知道这张图片是红包呢?是颜色还是信封(envelogp)?下面添加这两个类:(不知道为啥,和老师演示的不一样)

    text =clip.tokenize(["plane","red","envelogp","bird","red_envelogp"]).to(device)Label probs:[[0.002599080.394363760.014817570.002338280.5858813]]

      最后看看CLIP能不能学到相关的语义。但这里可以看出zero-shot CLIP的鲁棒性比标准的ImageNet训练的模型更好。
      然后就是图片特征和文本特征做Deep Fusion,后面就是一样的处理了。从论文题目 Unifying Localization and Vision-Language Understanding可以看出,其统一了所有的定位任务(比如分割和检测)和Vision-Language任务。这里为了克服 argmax 的不可导性,使用了 可导的gumbel softmax。
    在这里插入图片描述

    • 横坐标表示对于一张图像来说,做一遍前向过程用多少的计算量
    • 纵坐标表示在多个数据集上的平均准确率。
        另外除了上方的文本编码器提取的文本特征,要与密集图像特征相乘来计算像素级的图文相似度之外,整个网络与传统的有监督网络完全一致。
    3.1.5 结论

      ViLD是第一个在LVis这么难的数据集上做Open-vocabulary目标检测的模型,是一个里程碑式的工作。
      所以作者是先将图片输入U2Net,从背景中抠出物体,然后再做生成。比如noise student之前在ImageNet一直霸榜,但是这个模型需要在一个 TPUv3上训练33年,这还只是在包含1000类的ImageNet上预训练的,而且只训练视觉特征。这样模型在初期学习的时候就能慢慢一点点的将相邻的元素group起来,最后变成一个个segmentation mask

  • 3. 推理展示
    上图右侧作者展示了两个非常难的任务:

    • 检测两个针管和一瓶疫苗。我们只能依赖于Open-vocabulary的目标检测模型,来把这些corner case都处理的很好。
        类别单词变成句子,有prompt engineeringprompt ensemble两种方法,进一步提高模型准确率,在论文后面会讲到

      1.1.3 模型效果
      1.1.3.1 对自然分布偏移的鲁棒性

        如下图所示,作者还比较了zero-shot CLIP与现有ImageNet模型在自然分布偏移上的性能来验证它的鲁棒性。肤色。
        这里作者还把自注意力的图和最后的采点分布图可视化了出来。

      通过下图可以看到,比起GLIPv1,GLIPv2加了一些text encoder的训练任务,使其表征更加丰富。然后在这些输出的文字特征和图片特征上进行对比学习。

    1.2 方法

    1.2.1 自然语言监督的优势

    使用自然语言监督信号来训练视觉模型,有两个最重要的优势:

    • 不需要采用特别的标注数据,扩展性更强。
      可以看到GLIP模型直接做 zero-shot 检测的mAP已经达到了 49.8 ,如果再在 COCO 上进行微调,GLIP的 结果能够超过当前最好的一些有监督方法。
        在文章中,作者观察到不管图片风格如何,CLIP都能把物体的视觉特征抽取的很好 ,也就是非常的稳健,由此才奠定了CLIPasso的工作基础。代码

    • 作者通过现将 3D 点云投射为多张 2D 的深度图,实现了在3D图上利用 2D 图像数据训练 的CLIP 模型。

      推理时,只使用类别标签作为文本描述效果并不够好,原因有二:

      1. 词语存在歧义性
        如果我们直接采用类别标签作为文本描述,那么很多文本就是一个单词,缺少具体的上下文,并不能很好的描述图片内容。比如在CLIP出现的一个半月之后,谷歌提出的ViLD(见本文3.1章节)基于CLIP实现了Open-vocabulary的物体检测,其主体架构如下所示,其基本思路和zero-shot分类相似,只不过这里是用文本特征和ROI特征来计算相似度。

      2. 第二行:ViLD同时检测基础类和新类,并不会降低基本类别的检测性能。
          相似度是计算文本特征和图像特征的余弦相似性cosine similarity
          为了训练CLIPOpenAI从互联网收集了共4个亿的文本-图像对,论文称之为WIT(Web Image Text。使用CLIP之后,在现有检测框上,不需要额外标注,就可以检测出新的类(图中红色标识类)。
  • 所有的模型都训练32个epochs,采用AdamW优化器,batch size=32768。(相当于把模型用作特征提取,但是没有分类头)
      作者在30多个不同的计算机视觉数据集上进行基准测试,(这些数据集涵盖了OCR、Code
  • 作者将 CLIP 的预训练参数用来初始化 ViL 模型,然后再各种视觉-文本多模态任务上进行微调,测试结果。推理时,可以指定任意个数、该方法可推广到各种类别,并应对具有挑战性的抽象水平,同时保持语义上的视觉线索,以实现实例级和类别级的识别。但是GLIP自己做出来对文本的理解,给出了疫苗和针管的检测结果。

      GroupViT是2022年2月22发表在CVPR的文章。CLIP视频理解(略)

  • 六、这样模型的训练过程就是最大化n个正样本的相似度,同时最小化n 2 − n n^2-n n2n个负样本的相似度。audioCLIP(语音)、这个结果就证明了CLIP模型的强大。
      对比zero-shot推理的话,LSeg的效果确实好很多;但是与 few-shot 哪怕是 one-shot 相比,还是有很大的距离。OCR攻击、当然GLIP和其它模型的预训练数据集规模和一些trick是不一样的,但也足以看出GLIP的强大之处。给定一张图片,然后通过文本提示,给出需要检测的类别,就可以实现对应的语义分割。
  • 目标检测转为phrase grounding:通过prompt的方式将标签名转化为短语。

      因为背景类干扰问题,作者发现Group tokens其实已经学的很好了,但是最后分割时容易分类错了。其使用的 7 个数据集加起来可能也就一二十万个样本,跟别的有监督无监督训练是远远不能比的。对比学习综述(MoCov1/v2/v3、测试时多个token的平均pro作为短语的probability。可以考虑使用数据增强、

    2.2.2 模型结构

      GroupViT的核心思想,是利用了之前无监督分割工作中的的 grouping

      LSeg的意义在于将文本的分支加入到传统的有监督分割的pipeline模型中,通过矩阵相乘将文本和图像结合起来了。

      作者认为,直接从自然语言中得到监督信息是一个很有前途的选择,因为其涵盖的范围更广(只要是语言描述过的物体,都有可能让视觉模型去识别)。

  • 最在这24M的有监督数据上继续训练,得到最终模型GLIP-L
  • 纵坐标表示在20个数据集上的平均分类准确度(有7个数据集每个类别不够16个)
  • 当每类有16个训练样本时,BiT-M模型的性能才和zero-shot CLIP打成平手。贝塞尔曲线就是通过在平面上定义的几个点来确定一条曲线。
    比如ImageNet需要先定义好1000个类,然后根据这些类去下载图片,清理数据集,再去标注所有图片,过程很复杂。官网代码
  • GLIP光听名字和CLIP很像,只是把Contrastive Language-Image Pre-training(基于对比文本-图像对的预训练方法)中的Contrastive换成了Grounded

  • 需要提高few-shot的性能
    很多复杂的任务或概念无法用文本准确描述,这时就需要提供给模型一些训练样本。

    • ViLD-text点积计算公式:
      在这里插入图片描述
    • I表示图片,φ(I)表示抽取图片特征,rproposals

      4.1.3 模型结构

        作者对训练方式、黑色虚线是理想的鲁棒模型,是线性的、
        在本文的实验中,将 A P f , A P c AP_f,AP_c APf,APc作为模型见过的基础类(共 886 类),A P r AP_r APr作为新类(共 337 类,模型没有见过,所以可以做zero-shot检测)
      在这里插入图片描述

        可以看到 ViLD模型在新类上的 AP 大幅领先基线模型Supervised-RFS(RFS是尽量采样尾部的类,用于解决长尾问题,所以这是一个很强的极限模型),并且是做的zero-shot检测。CLIP Draw

    • 多模态:VL Downstream
    • 其他:depthCLIP、加入一个Grouping Block来完成 grouping ,将图像块 token 分配到各个 group token 上,合并成为更大的、
    • 紫色曲线说明:每类的训练样本只有1个或2个的时候,效果还不如zero-shot CLIP;但当每类的训练样本增加到8个或16个的时候,效果则超越了zero-shot CLIP。CLIP视频理解(略)

        这部分包括CLIP4clip和ActionCLIP,在《CLIP 改进工作串讲(下)》中有讲解,我对这一块暂时不感兴趣,就不写了。

    在这里插入图片描述

    • 横坐标:每个数据集每个类别里,用了多少个标注样本进行Linear Probe的分类器训练。
        这也说明CLIP学习到的视觉特征,已经和语言产生了很强的联系。

        简笔画的抽象程度可以通过改变笔画数量来控制,其生成的草图展示了多层的次抽象性,同时保持了可识别性、

    • ImageNetV2是从ImageNet数据集中筛选出新的数据集,其更接近原来的测试集。这也不论是自然的香蕉还是动漫里的香蕉、
    • 为了加速模型训练,在训练 ViLD-image 时先用 CLIP 模型提取好图像区域特征,保存在硬盘中,在训练时直接从硬盘读取即可。像这样在统一框架下囊括更多任务更多数据集更多模态也是当前的一种趋势,比如去年的OFA、LSeg是2022年1月10号发表在ICLR的文章。loss选择和简笔画初始设置都有所改进,才达到最终非常好的效果。例如coco有80个类别标签,将80个标签用逗号连接,并在短语前加“Detect:”来组成短句。因此LSeg还是需要手工标注的分割掩模(segmentation mask)进行训练。所以有监督的在ImageNet上预训练的模型,效果比CLIP好是可以预见的
    • 右图是在27个数据集上的平均结果。

        结论GroupViT图片分割做得好(segmentation mask生成的好),但是语义分割做的不够好,这是由于CLIP这种对比学习的训练方式,对于明确语义物体信息能学的很好;但是对于背景这种语义比较模糊类别很难识别,因为背景可以代表很多类。从标题可以看出,其监督信号来自文本而非segmentation mask。

    • 跨样本匹配的时候,图片A 当中的‘人’这个物体,和图片B 对应的prompt 当中的 ‘person’类别,也应该是匹配的
      在这里插入图片描述
    3.3.3 模型结构

    模型总览图如下:
    在这里插入图片描述

    3.3.4 模型效果
    1. 我们将GLIPv2和下表中当前的目标检测和vision-language预训练模型,在8个下游任务上进行对比。
        例如在ImageNet数据集上,CLIP模型在不使用ImageNet数据集的任何一张图片进行训练的的情况下,最终模型精度能跟一个有监督的训练好的ResNet-50打成平手(在ImageNet上zero-shot精度为76.2%,这在之前一度被认为是不可能的)。所以扩大数据规模是不行了,需要在数据计算和高效性上需要进一步提高。
        因为作者想做的就是用最简单的素描,几笔就把物体描述出来,同时大家又能认出来,这样就必须保证语义上和结构上都能被识别才行。
    2. 语音 AudioCLIP:暂不感兴趣
    3. 3D PointCLIP:
      • 论文: PointCLIP: Point Cloud Understanding by CLIP、ActionCLIP
      • 图像生成:VQGAN-CLIP、
      3.1.3 模型总览

      下面快速过一下模型总览图:
      在这里插入图片描述

      • 训练:

        • 图片通过RPN网络得到proposals
          • 只需要判断图文是否配对,进一步简化了训练任务,训练效率一下子提升4倍(绿色线)
          • 训练任务更加合理。

            • 比如在做物体检测时,有一个类别是remote(遥控器)。而之前的模型,是永远不会预测出ImageNet1000个类之外的类的,这也是CLIP最吸引人的地方。

    对比损失的计算方法:

    • 对一个batch 当中所有的pair ,抽取其未交互的图片特征和文本特征O ∘ = E n c V ( I m g ) , P ∘ = E n c L ( T e x t ) \overset{{circ}}{O}=Enc_{V}(Img),\overset{{circ}}{P}=Enc_{L}(Text) O=EncV(Img),P=EncL(Text)
    • 计算一个batch内,所有图片特征和文本特征的相似度S g r o u n d b a t c h [ i , j ] = O ∘ i ( P ∘ j ) T S_{ground}^{batch}[i,j]=\overset{{circ}}{O}{_{}}^{i}(\overset{{circ}}{P}{_{}}^{j})^{T} Sgroundbatch[i,j]=Oi(Pj)T,这样就可以通过跨图像匹配的方式,使得每一个object/token 都能够看到更多的负样本。

    2. 目标函数
      生成的简笔画有两个要求,即在语义和结构上和原图保持一致。与 CLIP实现 zero-shot 的方式类似,LSeg通过类别 prompt 作为文本输入,然后计算相似度,也实现了zero-shot 语义分割。

      在可视化期刊distill上发表的博客《Multimodal Neurons in Artificial Neural Networks》中,作者对CLIP模型的对抗性攻击、由此可见整个GLIP都是用有监督的方法进行训练的。这说明对于一些难的数据集来说,有一些训练样本还是非常有必要的。

  • Vision grounding分类损失计算:(其实和ViLD text分支一模一样)
    O = E n c I ( I m g ) , P = E n c L ( P r o m p t ) , S g r o u n d = O P T O=Enc_{I}(Img),P=Enc_{L}(Prompt),S_{ground}=OP^{T} O=EncI(Img),P=EncL(Prompt),Sground=OPT

    1. 表示图片编码器E n c I Enc_{I} EncI处理img之后得到N region embeddings,即O ∈ R N × d O\in \mathbb{R}^{Ntimes d} ORN×d
    2. 文本编码器E n c L Enc_{L} EncL(比如BERT)处理Prompt得到text embedding,即P ∈ R M × d P\in \mathbb{R}^{Mtimes d} PRM×d
    3. 图像特征O和文本特征P相乘得到相似度结果S g r o u n d ∈ R N × M S_{ground}\in \mathbb{R}^{Ntimes M} SgroundRN×M,即论文中说的region-word aligment scores。

      下图a展示了显著性初始化生成结果(Proposed )和随机初始化的生成结果(Random)的效果对比,可以看到Proposed的脸部特征更接近原图,而且头发更加简约。GoldG和图片文本对Cap24M数据集一起训练,此时数据集已经非常大了,足以训练出一个很强的模型。

  • 重复上述过程:添加新的 Group tokens g i 2 \mathbf{g}_i^2 gi2(8×384),经过 3 层 Transformer Layers 的学习之后,再次经过grouping block 分配,得到 s i 3 \mathbf{s}_i^3 si3(8×384) 。在大多数数据集上,prompt ensembling都能够提升模型性能。可以看到采点分布图已经和最终的简笔画图像非常接近了。再配合伪标签的技术来扩增数据,使得训练的数据量达到了前所未有的规模(3M人工标注数据和24M图文对数据)。基本结构和所画对象的基本视觉成分。

      使用自然语言监督进行图像表示学习的工作很少,并且效果往往不如有监督模型,主要有两个原因:

    1. 早期nlp模型不太好学。然而在ImageNet上预训练的模型,在ImageNetV2上的测试性能下降了不少(76.2→64.3)
    2. 右图中 ImageNet Sketch都是素描的图片、
  • 3.2.1 前言

    1. 研究动机:Open-vocabulary Object Detection是必要的

      目标检测和分割一样,标注数据集都很贵,对于边边角角的类和层出不穷的新类,我们没有办法训练一个模型把这些都检测的很好。
    在这里插入图片描述

    2.2 GroupViT

    • 论文《GroupViT: Semantic Segmentation Emerges from Text Supervision》、
        从图中可以看到,CLIP在21个数据集上的性能都超过了EfficientNet,并且很多数据集都是大比分超过。Transformer、淋巴结肿瘤检测等需要特定领域知识的分类任务,CLIP并没有预训练到这些标签信息。比如下面例子中,输入“Mohawk hairstyle”,就能改变奥巴马的发型;输入“Without makeup”,就可以一键卸装了;输入“Cute cat”(可爱的猫),猫的眼睛就睁大了。

      1.3 实验

      1.3.1 zero-shot 迁移

        研究zero-shot的动机:之前的自监督或有监督训练的模型(MOCO、通道数和特征图的高宽,C一般取512或者768。
      在这里插入图片描述

      2. Deep Fusion

      • 图片编码器是DyHead(L层),第一层输出图片特征表示为O 0 O^0 O0
      • 文本编码器是预训练好的BERT(L层),第一层输出文本特征表示为P 0 P^0 P0
      • X-MHA表示跨模态多头注意力模块。如果只是单模态的特征,无论是类似MOCO还是MAE,都很难做到这一点(zero-shot必须要加入文字特征才能做到)。

    1.3.5 Linear probe CLIP对比

      对比完了zero–shot和few-shot,下面自然就是拿下游任务的所有训练集来训练,进行效果对比了。CLIP

    • 1.1 简介
      • 1.1.1 前言
      • 1.1.2 模型结构
      • 1.1.3 模型效果
        • 1.1.3.1 对自然分布偏移的鲁棒性
        • 1.1.3.2 StyleCLIP
        • 1.1.3.3 CLIPDraw
        • 1.1.3.4 zero-shot检测
        • 1.1.3.5 CLIP视频检索
      • 1.1.4 导言
    • 1.2 方法
      • 1.2.1 自然语言监督的优势
      • 1.2.2 预训练方法(训练效率至关重要)
      • 1.2.3 伪代码
    • 1.3 实验
      • 1.3.1 zero-shot 迁移
      • 1.3.2 Prompt Engineering and Ensembling
      • 3.3.3 zero-shot分类效果对比(ResNet-50)
      • 1.3.4 few-shot分类效果对比
      • 1.3.5 `Linear probe CLIP`对比
      • 1.3.6 与Noisy Student EfficientNet-L2 对比
    • 1.4 与人类的差异(略)
    • 1.5 数据重叠分析
    • 1.6 局限性
    • 1.7 demo
  • 二、
    如果模型能做到像人类作画一样,一笔一画,每次根据前一笔确定下一笔的作画位置,不断优化,生成效果可能更好
  • 复杂程度不同物体,需要抽象你的程度不同。比如COCO有80个类,前20类作为当前已知类,后60类为未知类,然后就可以做zero-shot 和few-shot 了。
      借鉴了一些LowerLevel的视觉任务。

    3.2.3 训练数据集
    • 上面三行A,B,C展示的是GLIP模型可以同时使用目标检测的数据集,例如Objects365Grounding的数据集GoldG(几个数据集的合并,还是很大的)。
    • Text Encoder: 直接用的是CLIP 文本编码器的模型和权重,并且训练、

      1.6 局限性

      1. 性能有待提高
        CLIP在很多数据集上,平均下来看可以和ResNet-50打成平手(ImageNet精度为76.2),但与现在最好的模型(VIT-H/14,MAE等精度可以上90)还存在十几个点的差距。模块由一些卷积和DW卷积组成(当加了两个模块时效果提升,加了四个模块后效果崩溃,作者未解释):
        在这里插入图片描述

      模型在 7 个分割数据集上进行训练,这些数据集都是由有标注的分割图组成,所以模型是以有监督的方式进行训练的(损失函数是交叉熵损失而非无监督的对比学习目标函数)。但是光从分类角度,是否应该分类为信封呢?

    二、
    在这里插入图片描述

  • 任意控制抽象程度
    在这里插入图片描述

  • 对比其它方法
    在这里插入图片描述

  • 4.1.5 局限性
    1. 输入图片有背景时,生成的效果大打折扣。
      实验结果表明,单个 GLIPv2 模型(所有模型权重共享)在各种定位和理解任务上实现了接近 SoTA 的性能。

    2. 作者在这里的做法就是在ViLD-image开始训练之前,利用RPN网络预先抽取M pre-complete proposals,然后按照图中顺序算好 M image embeddings

    3. out-of-distribution泛化差
      对于自然图像的分布偏移,CLIP还是相对稳健的。SimCLR v1/v2、huggingface/transformers

    4. 博文《Group ViT》、
    5. 在这里插入图片描述

      • 初始定义一些贝塞尔曲线s 1 s_1 s1s n s_n sn,然后扔给光栅化器Rasterizer,就可以在二维画布上绘制出我们看得到的图像。
      • 对比模型有有监督的EfficientNet、
        在这里插入图片描述

          下面的例子中,如果用传统的目标检测算法的话,模型只会判断这些物体都是玩具,也就是图中蓝色的基础类。

      • GLIP-L:backbone为Swin-L模型,然后同时使用FourODs(目标检测有监督训练中能用的所有的数据集)、这样对不同的图片上不同复杂程度的物体,都能很好的自动抽象。更具有高层语义信息的 group,即Segment Token(维度64×384,相当于一次聚类的分配)。作者在这里选择Linear probe CLIP的方式。rare,标注数依次递减,也就是下图中的A P f , A P c , A P r AP_f,AP_c,AP_r APf,APc,APr
      • 对比学习目标函数中的超参数τ,设置成可学习的标量,在训练中自动优化,而不用慢慢调参(还是因为数据集太大,训练很贵)。用了伪标签的EfficientNet、

        2.1.2 模型框架

        在这里插入图片描述
          如上图 4 所示,模型整体看来与 CLIP模型非常相似,只是将单个的图像文本特征换成语义分割中逐像素的密集特征。新思路,一般可以直接用过来。CLIP利用多模态的对比学习,使得自然语言可以引导模型学习到视觉概念,从而实现非常灵活的zero-shot迁移(把分类问题转化为了跨模态检索问题)。0就相当于zero-shot了。计算 grouping token (64×384)与图像块 token (196×384)的相似度矩阵(64×196),将token分配到相似度最大的grouping token上面(聚类中心的分配)。

        • L s L_s Ls:semantics loss,计算原图特征和简笔画特征,使二者尽可能相似。短语中名词对应的框和图片。如果标签是face,grass,狗会被检测为face。
        • 此分支监督信号不再是人工标注的数据,而是CLIP的图像编码,所以就不再受基础类CB的限制了,对于任何的语义区域都可以由 CLIP 抽取图像特征。比如大多数模型都只能预测已知的图像类别。(目标是最小化生成图像的CLIP encodings与文本提示之间的余弦距离)。所以在计算资源不足的时候可以试试这种跨界研究。所以我们不仅仅对图片和文字交互后的特征建模,也要对于图片和文本交互前的特征建模,类似loopiter。训练时可以学到language aware(语言文本意识)的视觉特征,从而在最后推理的时候能使用文本prompt得到任意你想要的分割结果。
          在这里插入图片描述

          Cap24M就是24M伪标签数据。使用CLIP之后,就可以摆脱基础类的限制(Open-vocabulary Object),可以检测出新的类(图中红色标识),比如颜色和动物类别。可以通过输入文本直接找到视频中出现的对应物体。代码

        3.3.1简介

        在这里插入图片描述
          GLIPv2和GLIPv1架构基本一样,只是融合了更多的任务和数据集。
        在这里插入图片描述
          图b是本文的一种后处理操作。

        3.2.4 模型框架

        1. 总体框架

          如下图所示,由于所有数据集都是有标注的,所以模型是以有监督的方式进行训练。

      在这里插入图片描述

        OpenAI是一家GPT化的公司,从GPT系列、这相当于,模型只要分割的准就行了,语义类别的预测是肯定准的。绿色曲线表示本文中使用Prompt engineering and ensembling的结果,蓝色曲线表示直接使用无提示上下文的类名的结果。CLIP 也能理解各种抽象妆容,比如烟熏妆,吸血鬼妆。这种提前定义好的标签集合,会大大简化问题本身(比如ImageNet固定的1000个类,COCO数据集固定80个类等等)。CLIP图文配对学习的方式,使其对物体特别敏感,对物体的语义信息抓取的非常好;而且还有出色的zero-shot能力,完全不用在下游任务上进行任何的微调,拿过来就可以直接用,所以就有了CLIPasso。今年的Unified-IO等等。比如定位任务不光有目标检测还有实例分割,Understanding任务包含了Vision grounding

      2.1.1 模型效果

        下图展示了LSeg的检测效果。任意内容的类别 prompt 来进行 zero-shot 的语义分割。后面论文中没有特别说明的情况下,进行对比实验的CLIP模型都是指这个。
        而如果想训练一个很强的Open-vocabulary的目标检测模型,就只能像CLIP一样,可以利用上亿规模的的数据集,而且还要把图片-文本对应关系和定位都学的很好。

      • 训练:

        • 经过六层 Transformer Layers 的之后,学的差不多了。这种data-driven(数据驱动)的方式,有什么数据集就学出什么模型,所以最后生成的素描的形式和风格非常受限,违背了图像生成的初衷了。比如下图,通过设置不同的笔画数,可以对图像进行不同层次的抽象:
          在这里插入图片描述
          1. 训练过程

            生成简笔画的方法不是直接做图到图的生成,而是使用图形学中的贝塞尔(贝兹)曲线来完成简笔绘画。GroupViT

        • 目标检测:ViLD、例如CLIP在MNIST数据集上精度只有88%,随便一个分类器都都能做到99%,可见CLIP还是很脆弱的。
        • 图像特征e r e_r er分别和背景特征e b g e_{bg} ebg和文本特征做点积计算相似度,最后得到 ViLD-text模型输出z(r)(logics)。

          六、其模型结构如下图所示。

    4.1.6 结论

      CLIPasso可以适应任意语义类别的输入图像,而不再局限于数据集中固有的几个类别;并且可以做到对物体不同程度的抽象,同时保持和原图的语义和结构的一致性。进一步地,可以将这些相似度看成logits,送入softmax后可以到每个类别的预测概率。
    推理过程中,最大相似度也可能很低,比如0.2;为了提高前景类的分割性能,作者设定了相似度阈值,但是因为背景类干扰问题,这个阈值很难设定好。墙壁甚至地板和天花板这种极为相似的目标也被完美的分割开来

      值得一提的是,由于 CLIP 类的模型实质上都是通过计算图文相似度来实现分类或分割的,因此 ‘other’ 类的类别 prompt 文本实际可以是任何无意义的文本,如 ‘me’,‘a’,‘an’ 等,只要与目标类别不要太接近即可。
    在这里插入图片描述

    3.1.2 模型结构

      ViLD 方法的研究重点在两阶段目标检测方法的第二阶段,即得到提议框(proposal)之后。WIT质量很高,而且清理的非常好,其规模相当于JFT-300M,这也是CLIP如此强大的原因之一(后续在WIT上还孕育出了DALL-E模型)。比如在ImageNet-A数据集上,ResNet101精度只有2.7%,而CLIP能达到77.1%

  • CLIP学习到的是图像结合文字的多模态特征,从而实现灵活的zero-shot迁移。然后和R 1 R_1 R1、损失分为定位损失(回归损失)和分类损失。
    在这里插入图片描述

  • 总结:GroupViT 没有在ViT基础上加很复杂的模块,目标函数也和CLIP保护一致,所以其scale性能很好。
    在这里插入图片描述

    本文为什么又选择了CLIP

    1. 保持Semantically-Aware(语义感知)。但是简笔画和自然图像分布完全不同,无法判断CLIP是否能很好的工作。即更大模型更多数据,其性能会更好。

    1.2.3 伪代码
    # image_encoder - ResNet or Vision Transformer# text_encoder - CBOW or Text Transformer# I[n, h, w, c] - 输入图片维度# T[n, l] - 输入文本维度,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#  分别提取图像特征和文本特征I_f =image_encoder(I)#[n, d_i]T_f =text_encoder(T)#[n, d_t]# 对两个特征进行线性投射,得到相同维度的特征d_e,并进行l2归一化,保持数据尺度的一致性# 多模态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)# 计算缩放的余弦相似度:[n, n]logits =np.dot(I_e,T_e.T)*np.exp(t)# symmetric loss functionlabels =np.arange(n)#  对角线元素的labelsloss_i =cross_entropy_loss(logits,labels,axis=0)# image lossloss_t =cross_entropy_loss(logits,labels,axis=1)# text lossloss =(loss_i +loss_t)/2# 对称式的目标函数

      在MOCO中,真实标签都是0,因为其正样本都是放在第一位,所以正样本对应的索引永远是0;但是在CLIP中,正样本都是在对角线上,即(I 1 , T 1 I_1,T_1 I1,T1I 2 , T 2 I_2,T_2 I2,T2,…),所以真实标签为np.arange(n)。该模型还展示了在开放词汇目标检测任务上的强大的zero-shot和few-shot性能以及在 VL 理解任务上的出色的grounding能力。对于没有见过的图像类别,需要额外的信息才能识别。

  • 数据的利用不够高效
    在本文的训练过程中,4亿个样本跑了32个epoch,这相当于过了128亿张图片。由于是在嵌入空间(embedding space)而不是概率空间(probability space)上集成的,因此节约了计算成本。
      例如当数据集是Oxford-IIIT Pets数据集时(类别都是动物),就可以将模板写成: A photo of a {label}, a type of pet.;或者在做OCR任务时,在想找的那个文本或者数字上打上双引号,模型就可能知道你是想找双引号里面的内容。ViLD借鉴了CLIP的思想,也借鉴了CLIP的预训练参数,最后的结果也不错。其中分类头cls-Head由矩阵W ∈ c N × d W\in \mathbb{c}^{Ntimes d} WcN×d表示,和N region embeddings相乘后得到S c l s ∈ R N × c S_{cls}\in \mathbb{R}^{Ntimes c} SclsRN×c

  • L c l s = l o s s ( S c l s ; T ) . L_{cls}=loss(S_{cls};T). Lcls=loss(Scls;T).:使用nms筛选这些bounding box,然后和GroundTruth计算交叉熵,得到分类损失。本文中,每条曲线是通过四个点来确定,每个点都有其x,y坐标,即s i = { p i j } j = 1 4 = { ( x i , y i ) j } j = 1 4 s_{i}=\left \{ p_{i}^{j} \right \}_{j=1}^{4}=\left \{(x_{i},y_{i})^{j}\right \}_{j=1}^{4} si={pij}j=14={(xi,yi)j}j=14。因为在模型的前几层,学习到的还是相对低级的几何纹理信息,而非高层语义信息,所以其包含了一些长宽啊这些信息,对几何位置比较敏感。
  •   比如PASCAL VOC中相似度阈值是0.90.95,图片和文本的相似度取最大值且最大值大于0.9时,才会认为物体是这个类;否则认为是背景类。

    2.1.3 实验结果

      作者将PascalVOC数据集和COCO数据集,都按照类别分成四份。

  • 根据loss训练笔画参数,得到最终的模型输出。作者做了很多尝试,最终选择了对比学习:

    • VirTex模型:预测文本,对应下图蓝色线Transformer Language Model
      • Image Encoder使用CNN模型,Text Encoder使用transformer模型,两个模型一起从头训练,任务是预测图片对应的文本(image caption)。在这里插入图片描述
        在这里插入图片描述

        1.1.4 导言

          现有的CV模型基本都是基于人工标注的数据集进行训练的,然后用来预测一组提前定义好的物体类别。局限性在于最后的聚类中心(Group Tokens)只有8类,所以一张图像中最多分割出八个目标。目前用户每次输入图片,还得考虑用几笔去抽象。
        在这里插入图片描述

  •   所以做到这两点最直接的答案就是CLIP。

  • z(r)做softmax后和groud truth计算交叉熵得到这部分的损失。
      PASCAL VOC中类别少,且物体都有明确的语义,所以背景类干扰少;但是PASCAL Context或者COCO数据集,类别很多,前景的相似度一般都很低,和背景类差别不大。CLIP语义分割

    参考:

    • 李沐论文精度系列之《CLIP 改进工作串讲》
    • 博文《CLIP改进工作串讲(上)》

      CLIP是OpenAI于2021年2月发表的,在过去的一年多时间里,已经被用到各个方面:

    • 语义分割:Lseg、自监督、

        模型中间的融合层(Deep Fusion)和LSeg的做法一样,都是为了使图像特征和文本特征进一步交互,使最终的图像-文本联合特征空间(joined embedding space)训练得更好(相似的embedding拉近,不相似的拉远),图像特征和文本特征被训练的更强更有关联性,这样后面计算相似度矩阵的效果肯定就更好。

    • 数据集或模型的规模不够。比如下图几个素描数据集,SketchyCOCO只有9类物体,都是常见的动物。

      3.2 GLIP v1

      • 论文《Grounded Language-Image Pre-training》、
      • 这种方法的训练效率太慢,因为根据图片进行文本描述,可能性太多了,你可以从各个角度去描述一张图片。
        在这里插入图片描述
        X-MHA模块中,图像特征和文本特征交互使用的是Cross Attention
        在这里插入图片描述
      • 分割和检测都属于稠密性任务(dence prediction)的一种,都需要同时分类和定位,所以很多方法是可以互相借鉴的,所以Deep Fusion也可以用到分割领域,比如GroupViT
          上图 可以看到,oracle结果相比于原结果有多达二三十个点的巨大提升;这说明,语义类别预测错误是 GroupViT模型的一大瓶颈。简单来说,ViLD 想要做到的事情是:在训练时只需要训练基础类,然后通过知识蒸馏从 CLIP 模型中学习,从而在推理时能够检测到任意的新的物体类别(Open-vocabulary Object

          而且无论是有监督还是自监督方法(基于对比学习的方法如MoCo和SimCLR,和基于图像掩码的方法如MAE和BeiT),在模型迁移时都需要需要进行有监督微调,比如微调固定类别的softmax分类器,而无法实现zero-shot。(其实本文也借鉴了CLIPDraw

      4.1.2 摘要

        由于线描具有简单和最小化的特性,因此抽象是速写图的核心。

    • 给出了一张图片的描述:“在古巴的playa esmeralda,从上往下俯瞰海滩,看到了漂亮的海绿色加勒比海”。
    • 为了和文本特征进行对比学习,将最后一层Transformer Layers输出的序列特征(8×384)进行全局平均池化Avg Pooling,得到1×384的图片特征。因为之前CLIP都是处理的自然图像,所以迁移到检测分割效果都很好。
    • 因为是有监督训练,所以需要额外添加一个背景类进行训练,即可学习的Background embedding(基础类之外的类别全部归为背景类)。所以这部分是是以前就有的方法,不做任何改动。而使用文本引导视觉模型训练,就可以很好的进行zero-shot迁移;模型就可以不再训练,不再微调。加了对抗样本的香蕉,CLIP都知道图片是对应香蕉这个单词。文本QA即纯文本的回答,与之相比,VQA把材料换成了图片形式,所以这是一个典型的多模态问题;
    • Vision grounding:根据短语定位图片中对应的物体。现有的数据集中似乎没有针管和疫苗这种类别。这也是为什么一开始性能会比较差,但随着训练样本的增多,模型的分类性能会逐渐提升。
    • L g L_g Lg:geometric distance loss,计算原图和简笔画的浅层编码特征的loss。DINO等)

    一、φ(I)r一起进行R计算得到 e r e_r erregion embeddings,图片特征)

  • e b g e_{bg} ebg表示背景embedding,t_1到t ∣ C B ∣ t_{left | CB right |} tCB表示基础类CB的文本特征Text Embeddings。官网代码

      语义分割可以看做是像素级的分类,因此分类的新技术、
    在这里插入图片描述

    3.3.2损失函数

    在GLIPv2 当中对损失函数做了改进,在原有ground损失的基础上加入两种损失:
    L G L I P v 2 = L l o c + L i n t r a ⏟ L g r o u n d + L i n t e r + L m l m {L_{GLIPv2}=\underset{L_{ground}}{\underbrace {L_{loc}+L_{intra}}}+L_{inter}+L_{mlm}} LGLIPv2=LgroundLloc+Lintra+Linter+Lmlm

    1. 添加MLM损失:添加这一损失可以强化模型的语言特性。GroupViT通过文本自监督的方式进行训练,从而实现简单的分割任务(不再依赖segmentation mask)。

        Text Encoder可以采用NLP中常用的text transformer模型;而Image Encoder可以采用常用CNN模型或者vision transformer等模型。所以需要把二者的分类loss统一到一个框架下面,也就是:
      L = L c l s + L l o c . L = L _{cls}+ L_{loc} . L=Lcls+Lloc.

      • detection分类损失计算:
        O = E n c I ( I m g ) , S c l s = O W T , L c l s = l o s s ( S c l s ; T ) . O=Enc_{I}(Img),S_{cls}=OW^{T},L_{cls}=loss(S_{cls};T). O=EncI(Img),Scls=OWT,Lcls=loss(Scls;T).

        1. E n c I Enc_{I} EncI表示图片编码器(例如swin transformer),处理img之后得到N region embeddings,即O ∈ R N × d O\in \mathbb{R}^{Ntimes d} ORN×d(n个bounding box,每一个的维度是d);
        2. N region embeddings→ c l s − H e a d S c l s \overset{cls-Head}{rightarrow}S_{cls} clsHeadScls
          LSeg的zero-shot分割结果

          • 第一张图中,给出dog,tree,others,就可以把狗和树检测出来,其它为背景色
          • 为了验证模型的容错能力,加一个汽车vehicle的标签,模型中也并没有出现汽车的轮廓
          • 模型也能区分子类父类,标签中不再给出dog而是给出petdog的轮廓同样可以被分割开来
          • 第三张图中,椅子、官网代码、作者展示的就是想输入一张图,输出最后的简笔画,可见这其中抽象是很重要的,也是很难的。推理全程中都是冻结的。
          • 结果越靠近左上角,模型的性能越好。CLIPasso对每张图生成三张简笔画,最后计算每张简笔画和原图的loss(L s + L g L_s+L_g Ls+Lg),调出loss最低的一张作为最终结果(蓝色框)。因此约束浅层特征可以保证原图和简笔画的几何轮廓更接近。

          • 所以 CLIP预训练时,用来描述图片内容的文本是一个句子,比如A photo of {label}

      3. zero-shot推理效果展示
        直接像ViLD一样给出物体类别生成一句话(Prompt : person. bicycle.car. motorcycle…)或者是像phrase grounding任务一样生成短语“马路上有很多坑”(Prompt : there are some holes on the road),都可以将物体检测出来。最后一张图的self表示自拍照

      1.1.3.4 zero-shot检测

      论文《Open-vocabulary Object Detection via Vision and Language Knowledge Distillation》(ICLR 2022)

        CLIP可以应用在目标检测任务上,实现zero-shot检测,即检测训练数据集没有包含的类别。训练过程如下图所示:

      • Rasterizer:光栅化器,图形学方向根据参数绘制贝塞尔曲线的一种方法,可导。但这是可以预见的,因为对于有监督训练,只有一两个样本可能越训练越差,还不如直接zero-shot。如果阈值设的高,很多物体都会被检测为背景类;如果设的低,容易误分类,即相似度最高的那一类,并不是真实类别。
          Group ViT的贡献就是在现有的ViT模型中加入计算单元Grouping Block,同时加入了可学习的Group Tokens
        在这里插入图片描述

        3.2.2 损失计算

          目标检测的损失函数由分类损失和定位损失组成。在其余6个表现不如EfficientNet的数据集上,CLIP也只比EfficientNet稍微低一点,差距并不大。身体。然后经过RoIAlign和一些卷积层得到N region embeddings,也就是图中R 1 R_1 R1R 2 R_2 R2。在一张V100的卡上,用6min就可以完成这2000次迭代。 CLIPDraw不需要进行训练,通过在一组RGBA Béezier曲线上执行梯度下降,就可以从文本合成一些简笔画图像。例如数一数图片中有多少个物体,或者在监控视频里区分当前这一帧是异常还是非异常,因为CLIP无法理解什么是异常、CLIPasso

      2.1 LSeg

      论文:《Language-driven Semantic Segmentation》、如何能融合两个阶段到一个框架,甚至是在设计loss中去除背景的影响,模型适用就更广了。

    2. ViLD-text模型中,只是将文本特征和图像特征做了关联(感觉到这里只是类似Lseg),模型可以做文本查询的 zero-shot 检测。比如M=1000时等于每一次迭代都需要前向1000次才能得到所有图像特征,这样训练时间会拉到无限长。
      • (/c) :ViLD-image分支:引入CLIP特性,这部分只在训练时进行蒸馏,推理时不蒸馏。
        原先的image-text pair,只能看到pair内部的信息。

      • 引入偏见
        本文在研发CLIP时一直用ImageNet测试集做指导,还多次使用那27个数据集进行测试,所以是调了很多参数才定下来网络结构和超参数。
        在这里插入图片描述
        Failure cases
          比如下图左侧,标签给定是toy, grass,在嵌入空间中(embedding space),狗的视觉特征明显更接近“玩具”而不是“草”,并且没有其他标签可以解释视觉特征,所以狗被检测为toy。普通的模型无法达到这样的理想效果,画出来的曲线只会在黑色虚线的下面。

      • 这里的 group tokens 就相当于分类任务中的 cls token。食物、I 2 I_2 I2,用它们对R 1 R_1 R1

      由此可以得出结论,这样的数据重叠不会带来明显的准确率提升。

        这种后处理在文生图中很常见,比如DALL-E。如果类别数目为n,那么将得到n个文本特征;

    3. 将要预测的图像送入Image Encoder得到图像特征,然后与n个文本特征计算缩放的余弦相似度(和训练过程保持一致),然后选择相似度最大的文本对应的类别作为图像分类预测结果。(比如CLIP预训练模型backbone是ResNet50,就将ResNet50的stage2,3,4层的输出特征抽出来计算loss,而非池化后的2048维特征去计算)
    4. 3. 初始化
        作者发现,如果完全随机初始化贝塞尔曲线的参数,会使得模型训练很不稳定。计算得到文本特征与图像特征的相似度之后,直接与 GT box计算对齐损失alignment loss即可(和ViLD-text分支一样)。在 CLIPasso 中,这两个要求分别由两个损失函数——语义损失L s L_s Ls和几何距离损失L g L_g Lg来保证。简单说如果有一些聚类的中心点,从这些中心点开始发散,把周围相似的点逐渐扩散成一个group,最后这个group即相当于一个Segmentation mask(感觉类似DBSCAN)。

      文章目录

        • 一、

        • 社会偏见
          OpenAI自建的数据集没有清洗,因为是从网上爬取的,没有经过过滤和审查,训练的CLIP模型很有可能带有一些社会偏见,例如性别、自监督的对比学习模型、其中s是笔画Stroke的缩写,j从1到4表示其由4个点控制。但是跟有监督训练的模型上限比起来,还是差了非常多。

        • 假设输入图像尺寸是224,×224,选择的Image Encoder是ViT-Small/16,则输出Pacth embeddings尺寸是196×384,也就是图中的token s i 1 \mathbf{s}_i^1 si1
          考虑到 CLIP的图片编码器训练的很好,而且和文本紧密关联,所以希望ViLD-image-encoder输出的region embeddings和CLIP输出的image embedding尽可能的接近,这样就可以学习到CLIP图像编码器中开放世界的图像特征提取能力。
        • 后两行:ViLD可以直接迁移COCO和Objects365,无需进一步微调。这些描述都是一些比较抽象的概念,已经不太像是物体了,但是GLIP依旧做得很好。
          在这里插入图片描述

          4.1.4 实验结果
          1. 借助CLIP的zero-shot能力,CLIPasso对不常见物体也能生成简笔画
            之前的方法只能对数据集中有的物体生成简笔画,而很难做到对罕见物体的生成。

          2. 理论上第一阶段输出的N proposals应该输入text和image两个分支进行训练,但如果每次训练时再去抽取CLIP特征就太慢了。

        1.2.2 预训练方法(训练效率至关重要)

          CV领域的模型都很大,训练起来也很贵。

          zero-shot就是直接推理,用见过的图片特征去判断没见过的图片的类别,而完全不用下游任务训练集进行微调。

      • 简笔画是同时生成而非序列生成。

        在这里插入图片描述
          oracle mask mIoU:模型在完成分割之后,不用模型预测的类别结果,而是将每个 mask 与 GT mask 计算 IoU,直接取最大的类别标签作为类别结果。CLIP目标检测

        • 3.1 ViLD
          • 3.1.1 简介
          • 3.1.2 模型结构
          • 3.1.3 模型总览
          • 3.1.4 实验
          • 3.1.5 结论
        • 3.2 GLIP v1
          • 3.2.1 前言
          • 3.2.2 损失计算
          • 3.2.3 训练数据集
          • 3.2.4 模型框架
          • 3.2.5 对比实验
        • 3.3 GLIPv2
          • 3.3.1简介
          • 3.3.2损失函数
          • 3.3.3 模型结构
          • 3.3.4 模型效果
      • 四、

        CLIP在做Linear Probe的时候,需要扔掉文本编码器部分,接着在图像编码器之后加一层线性分类器,所以分类方式不再是看图像特征与文本特征最相近,而是重新训练一个线性分类器.
        新加的一层线性分类器是随机初始化的,所以每类有1个标注样本是不够的。

    5. 右:由于检测到的重叠示例的百分比几乎总是个位数,因此由于重叠导致的整体测试准确度增益要小得多,Birdsnap的最大增幅仅为0.6%。
    6. Bag of Words Prediction(橘色线):不要求每个词都是按顺序的进行预测,所有词都预测出来就行。
    7.   我们不再需要预先定义好的标签(类别)列表,直接将图片喂给不同的文本句子,就可以知道图片中是否有我们感兴趣的物体。R 2 R_2 R2一起计算交叉熵。

    8. 只在ResNet50上训练一个epoch进行超参搜索,没有进行进一步的调参
    9. 两个最大的模型RN50x64需要在592个V100卡上训练18天,ViT-L/14需要在256张V100卡上训练12天
    10. ViT-L/14效果最好,所以作者还将其在336的分辨率下额外finetune了一个epoch来增强性能,记为 ViT-L/14@336px。而且作者在附录里说,CLIPasso的训练很快。再考虑到LSeg用的是ViT结构,可见LSeg需要提升的空间还是非常大的。CLIP

      参考:

      • 论文Learning Transferable Visual Models From Natural Language Supervision、地理定位和许多类型的细粒度对象分类等任务)CLIP通常都能够与监督模型的baseline效果相媲美。

        1.1.3.5 CLIP视频检索

          github上johanmodin/clifs仓库,展示了使用CLIP视频检索的工作。
          也就是所有使用CLIP模型的工作,都是在计算图像和文本之间的特征相似度,谁相似就选谁,而不是真的在做分类。适当的降低训练目标,反而能取得更好的收敛。这样放宽了约束,训练速度提高了三倍。最后计算模型的输出与ground truth监督信号的交叉熵损失进行训练。而CLIP不要求这种经典的“”机器学习兼容“”的标注格式,只需要下载文字-图片对;且没有n选1的标签之后,模型的输入输出自由度大了很多。为了清楚起见,我们只显示检测到的新类。

      • 左图是在12个数据集上的平均结果,这12个数据集和ImageNet是类似的。其思想还是最简单的分别抽取文本和图片特征,然后通过点积计算相似度。最后与文本特征z T \mathbf{z}^T zT计算对比损失。训练完的模型碰到这些类别之外的物体可能是无法生成准确的素描的,还需要收集相应的数据进行微调。但是随着transformer的兴起,像BERT和GPT这种具有上下文表示的自监督训练模型做的越来越好,nlp模型也终于有了取之不尽的文本监督信号,而且使用简单,泛化性好,为多模态训练铺平了道路。CLIP4clip、
      • Grouping Block结构如上图右侧所示,其grouping做法与自注意力机制类似。
        比如早期的n-gram模型非常复杂,不好跨模态训练。
      • 将物体类别(基础类)处理为prompt 句子就得到了文本,然后将这些文本扔给文本编码器得到Text Embeddings(文本特征)。
      • 将这个模型对网上爬取到的24M图像-文本对数据进行推理,得到bounding boxGrouping Block到底有没有工作,Group tokens有没有成为聚类中心,又是否对应了某一个类别;作者将不同阶段不同 group token对应的注意力区域进行可视化,结果如下所示:
        在这里插入图片描述

        • 在第一阶段,每个 token 都注意到一些语义明确的区域,如group5表示的是眼睛,group36表示的是四肢,并且都是些相对较小的区域;
        • 在第二阶段,每个 token 注意到的语义区域则相对较大,如脸、生成的伪标签肯定有错误,但是实验表明,经过扩充大量伪标签数据训练得到的 GLIP-L 模型仍然会有性能提高。简单来说,prompt learning的核心是通过构建合适prompt(提示)来使预训练模型能够直接应用到下游任务中。虽然速写生成方法往往依赖明确的素描数据集进行训练,但是本文利用CLIP的强大能力,从速写和图像中提炼语义概念 ,将速写定义为一组贝塞尔曲线。
            下面添加红包这个类别,模型做出正确的检测。官方代码
        • 李沐论文精度系列之《CLIP 论文逐段精读》、
          CLIPasso控制抽象程度的笔画数必须提前指定,所以最好是将笔画数也设计成可学习的参数。

    上式中,M((sub-word tokens数量)总是大于短语数c,原因有四:

    • 一个短语总是包含很多单词
    • 一个单词可以分成几个子词,比如toothbrush分成了 tooth#, #brush
    • 还有一些添加词added tokens,像是“Detect:”,逗号等,或者是语言模型中的特殊token
    • tokenized序列末尾会加入token [NoObj]

      在训练的时候,如果短语phrase都是正例( positive match)并且added tokens都是负例negative match(added tokens和任何图片的物体都无法匹配),那就使用subwords(subwords也都是正例,此时标签矩阵由T ∈ [ 0 , 1 ] N × c T\in [0,1]^{Ntimes c} T[0,1]N×c扩展为T ∈ [ 0 , 1 ] N × M T\in [0,1]^{Ntimes M} T[0,1]N×M)。
    在这里插入图片描述

  • 训练细节
    • 数据集非常大,几乎不会出现过拟合,所以Image EncoderText Encoder不需要提前进行预训练。

      从图中可以看到,在12个数据集上,用ViT结构的CLIP效果最好,用ResNet的效果也比大多数模型要好;在27个数据集上,CLIP的效果就吊打其他所有模型了。牛还是牛;而且不能生成了马,但是马头的朝向反了,或者马从站着变成趴着。比如下游任务的数据集不好收集,存在分布飘偏移(distribution shift)等等。

      GLIP的文章的出发点,就是将检测问题转换为短语定位(phrase grounding)问题,这样GLIP 模型就统一了目标检测和定位两个任务,可以使用更多的数据集。

    三、根据文本生成很多图像,然后将这些生成的图片在CLIP中又去计算了一下和原文本的相似性,挑出相似性最高的展现出来,往往可以达到最好的效果。因为ViLD选用的CLIP-L模型非常大,做一次前向过程非常贵。比如马还是马、那么重点就是使用图片-文本对数据集的高效使用 ,因为很好收集CLIP用文本作为监督信号来训练可迁移的视觉模型,使得最终模型的zero-shot效果堪比ResNet50,泛化性非常好,而且CLIP还有很多好玩的应用。
    在这里插入图片描述

  • SOTA:state-of-the-art ,当前最好/最先进的模型

    1. 下面是不同规格的GLIPv1/GLIPv2模型,在直接推理和 prompt tuning时的对比结果:(灰色表示训练时用了这个数据集,所以无法进行zero-shot推理)
      在这里插入图片描述
    2. 消融试验
    • 左侧x轴表示使用不同数量的下游任务样本,y轴是13个数据集上的平均AP;
    • 右侧是使用不同结构的loss时在 ODinW数据集上的的消融试验结果;
    • zero-shot GLIPv2-T(48.5) 超过了5-shot DyHead-T (46.4)
    • one-shot GLIPv2-H(61.3) 超过了用所有数据(ALL)进行有监督微调的DyHead-T (60.8).
      在这里插入图片描述

    四、

  • 最终在27个数据集中,CLIP在16个数据集上都超越了有监督训练好的ResNet-50。这并非真正的zero-shot,而且无形中引入了偏见。前者算ViLD-text分支的交叉熵损失,后者算ViLD-image的蒸馏L1损失。这样每次新增一些类别,都需要重新收集数据,训练一个新的模型。在计算完像素级图文相似度后继续学习一些参数,可以进一步学习文本图像融合后的特征。然后通过Transformer Layer的自注意力来学习到底哪些patch属于哪些group token。
    在这里插入图片描述

  • 在这里插入图片描述

    • 第一行:ViLD能够正确定位,并识别新的类别。但当给CLIP提供少量训练样本时,结果反而不如直接用zero-shot。如果预训练模型没有训练好的话,在下游任务上训练再久也很难优化到一个特别好的结果,所以用Linear probe能更准确的反映预训练模型的好坏。然后将这些bounding box全部作为GroundTruth(伪标签),这样就得到了24M的有监督数据。以及一些经典的有监督的baseline模型。
      在这里插入图片描述
        上图横坐标表示模型算力,纵坐标表示在多个数据集上的平均分数。
    • 基础类通过prompt得到文本,经过文本编码器得到文本编码B 1 B_1 B1B n B_n Bn

        在显著性区域采点,相当于你已经知道这里有个物体(语义更明确),或者已经相当于沿着物体的边界去绘制贝塞尔曲线了。
        假如模型输入的是n对图片-文本对,那么这n对互相配对的图像–文本对是正样本(下图输出特征矩阵对角线上标识蓝色的部位),其它n 2 − n n^2-n n2n对样本都是负样本。而语义分割中一张图有多个目标,所以需要多个特征,也就是多个 group tokens。

        本文提出的CLIPasso,是一种可以在几何简化和语义简化的指导下实现不同程度抽象的物体速写方法。做到这一点的最简单方式就是知识蒸馏(Knowledge Distillation)。
        下图是毕加索的名画一头公牛,这个系列从第一张图画到最后,花了大概一年。为了验证这一点,作者做了 oracle 对比的实验。

        比如新增三轮车的图片时,只需要在文本部分也加上三轮车这个类别,模型很有可能直接zero-shot推理出图片属于三轮车这个类。如果二者描述的是同一物体,那么编码后的特征都是同一语义,其特征必然相近。伪标签等方式减少数据用量。

        所以本文的方法就是随机初始化一些贝塞尔曲线,然后经过不停的训练,更改这些点的位置,从而更改贝塞尔曲线,得到最终的简笔画。

        最终作者使用了80种模板来进行集成,每种模板使用了不同的形容词,来,描述不同的情境。

    • 从结构图和公式可以看出,每一层输出的图文特征O i , P i O^i,P^i Oi,Pi都会在X-MHA中进行交互,交互后的特征和原特征相加之后一起输入到下一层进行编码,得到下一层的特征O i + 1 , P i + 1 O^{i+1},P^{i+1} Oi+1,Pi+1

    1.3.4 few-shot分类效果对比

      作者认为,这种特别难的任务,完全不给任何标签信息,有点强人所难了,不是很合理。即,CLIP的多模态特性(利用文本监督信号)为具体的任务构建了动态的分类器,使得模型不再受限于预先定义好的类别,更加具有通用性和可用性。训练时加入约束,融入背景类概念等等。
      输入图片必须是一个物体,且在纯白色的背景上,生成的效果才最好。后续改进可以是每个类设置不同阈值,或者使用可学习的阈值,或者是更改 Zero-Shot 推理过程、

      基于saliency(显著性)的初始化:将图像输入ViT模型,对最后的多头自注意力取加权平均,得到saliency map。素描的香蕉、CLIP图像生成

    • 4.1 CLIPasso生成极简画
      • 4.1.1 前言:为何又是 CLIP?
      • 4.1.2 摘要
      • 4.1.3 模型结构
      • 4.1.4 实验结果
      • 4.1.5 局限性
      • 4.1.6 结论
    • 4.2 DALL-E2(放到另一篇,后续补)
  • 五、
  • Image Encoder:DPT结构(使用了ViT进行有监督训练的语义分割模型,结构就是ViT+decoder),backbone可以是ResNet或者ViT。正比例的。

    1. prompt ensembling

      作者尝试了集成多个模板的效果,即在多个zero-shot分类器上进行集成,这些分类器使用不同的提示模板来构造不同的文本。

  • 上面物体类别就是 Base categories(也叫CB,Class Base),和Mask R-CNN有监督训练的基础类一样,所以ViLD-text做的还是有监督训练。但如果直接喂给文本编码器,很可能被模型认为是遥远的意思。能够使得训练出来的模型能够扩展到 VQA / ImageCaption 任务上。而定位损失也是直接与GT box计算L1 损失。因为分割任务的数据集都比较小(10-20万),训练的话结果会不好。

    在这里插入图片描述

    1.1.3.3 CLIPDraw

    论文《CLIPDraw: Exploring Text-to-Drawing Synthesis through Language-Image Encoders》

    在这里插入图片描述

      这也是一个利用CLIP预训练模型指导图片的生成。

      使用上面的方式统一损失之后,就可以用grounding模型方法来预训练检测任务,从而使GLIP模型可以做zero-shot检测。下面改成这几个词试试:

    text =clip.tokenize(["money","new year","red","envelogp","china"]).to(device)Label probs:[[0.014089940.0152310.054915810.002063370.91369987]]

      可以看到模型没有选择红色或者是信封,而是选择了和红包紧密结合的china这个概念,可见模型的相关语义还是学的很好。

  • 基于SimCLRv2训练的ResNet50,
  • 有监督训练的ResNet50。MAE、再经过一个MLP层变成z I \mathbf{z}^I zI维的图片特征。这样就完成了文本和图像的特征融合,就可以进行zero-shot检测了。
    一阶段得到的候选框proposals经过检测头得到 region embeddings,然后经过分类头得到预测的bounding box以及对应的类别。因为 detection的标签是one-hot的类别单词,而Vision grounding的标签是一个句子。按照原先的 loss 设计,图片中的只能够做到和 ‘person’ 相似, 和 ‘cat” 不相似,但是没有办法和所有其它图片中各种各样的实体进行区分。

  • 同一个词语在不同数据集中所表示的意思可能有所不同。

  • 难以理解抽象/复杂概念
    CLIP在一些更抽象或更复杂的任务上zero-shot表现并不好。

  • Text Embeddings加上分别和可学习的背景 embedding以及 region embeddings进行点积来计算图文相似度得到logics,然后计算logics和GT的交叉熵损失来进行训练。在标注了的1203 类中,有很多类只标注了几次,即罕见类,所以将各个类别分为 fequent、因为只有这样,自注意力图才更准,初始化效果才会好,而有了背景,自注意力就会复杂很多。其中2个数据集在重叠数据上表现更差。
  • CLIP:简化版的ConVIRT,基于对比学习。训练超大模型,可以参考来自OpenAI的博文:《How to Train Really Large Models on Many GPUs?》及对应的CSDN翻译。

      最终Text Encoder固定选择一个包含63M参数的text transformer模型,而Image Encoder采用了两种的不同的架构。

    其他细节:

    • 论文中选用的是ViT-Small,数据集是2900万图文对。稳健性等等都分析的非常透彻,非常值得一读,这其中就包括CLIP对简笔画的迁移问题。

      1. 其它数据集zero-shot效果
        下图是LVis 数据集上预训练的ViLDPASCAL VOCCOCO数据集上zero-shot迁移效果,对比有监督训练的模型还是有一些差距。停车标识等等)输入CLIP图像编码器得到特征I 1 I_1 I1、 博文《CLIP改进工作串讲(上)》
    2.2.1 前言

      上一节讲的LSeg虽然能够实现 zero-shot 的语义分割,但是训练方式并不是对比学习(无监督训练),没有将文本作为监督信号来使用。Swin-Transformer

  • 李沐论文精读系列三:MoCo、《神器CLIP:连接文本和图像,打造可迁移的视觉模型》
  • 1.1 简介

    1.1.1 前言

      CLIP是OpenAI在2021年2月发表的一篇文章,其全称为Contrastive Language-Image Pre-training,即一种基于对比文本-图像对的预训练方法。
      之所以选择Linear probe而不是微调,因为Linear probe只有最后一层FC是可以训练的,可学习的空间比较小,相比微调没那么灵活。

  • ResNet50是在ImageNet上用有监督的方式预训练好的
  • 对比结果:
    • 绿色 + 表示相比ResNet-50提升了多少,蓝色 - 表示相比ResNet-50降低了多少。也可以说,相对于之前的对比学习,CLIP只是将单模态的样本,换成了多模态的样本。最初是选择64个 group tokens(聚类中心),不大不小,后期可以合并。房子、

    • N , C , H ~ , W ~ N,C,\tilde{H},\tilde{W} N,C,H~,W~分别是类别 个数(可变)、

    • (d) :ViLD-text 和 ViLD-image的合体
      为了训练简单,将M pre-complete proposalsN proposals一起输入检测头Head得到n+m个embedding,然后拆分为N region embeddingsM region embeddings。《CLIP学习笔记》、后续工作考虑如何提高few-shot的性能

    • 1.7 demo

      下面是复制自CLIP官网的一段代码,使用红包图片(不在ImageNet那1000个类里面)进行一下简单的测试:
      在这里插入图片描述

      importnumpy asnpimporttorchimportclipfromPIL importImagedevice ="cuda"iftorch.cuda.is_available()else"cpu"model,preprocess =clip.load("ViT-B/32",device=device)# 加载base模型image =preprocess(Image.open("red_envelogp.png")).unsqueeze(0).to(device)text =clip.tokenize(["plane","dog","a cat","bird"]).to(device)withtorch.no_grad():image_features =model.encode_image(image)text_features =model.encode_text(text)logits_per_image,logits_per_text =model(image,text)# 计算图文特征相似性probs =logits_per_image.softmax(dim=-1).cpu().numpy()# 和图片最相似的文本就是图片的类别print("Label probs:",probs)Label probs:[[0.31314860.31749140.087633720.28172636]]

        可以看到对于text给出完全不相关的类别,模型很困惑。

  • 伪标签训练(self training):
    • 将所有目标检测任务和phrase grounding任务的数据集(一共3M)全部拿来做有监督训练,得到GLIP-T(C)模型。R 2 R_2 R2进行蒸馏(计算L1损失)
  • 推理:

    • i m a g e → b a c k b o n e + R P N p r o p o s a l s → R o I A l i g n + C o n v r e g i o n − e m b e d d i n g s image\overset{backbone+RPN}{rightarrow}proposals\overset{RoIAlign+Conv}{rightarrow}region-embeddings imagebackbone+RPNproposalsRoIAlign+Convregionembeddings
    • C N + C B → p r o m p t T e x t → T e x t − E n c o d e r t e x t − e m b e d d i n g ( B 1 . . B n + N 1 . . . N k ) CN+CB\overset{prompt}{rightarrow}Text\overset{Text-Encoder}{rightarrow}text-embedding(B_1..B_n+N_{1}...N_{k}) CN+CBpromptTextTextEncodertextembedding(B1..Bn+N1...Nk)
    • c l a s s = a r g m a x ( r e g i o n − e m b e d d i n g s ⋅ t e x t − e m b e d d i n g ) class=argmax(region-embeddings\cdot text-embedding) class=argmax(regionembeddingstextembedding)
  • 3.1.4 实验
    1. LVis 数据集 zero-shot 效果对比

      LVis 数据集图片采样自COCO数据集,但却是一个十分长尾的数据集。

    2.2.4 实验
    1. Comparison with Zero-Shot Baselines
      下表是和其它的一些 Zero-Shot 推理模型效果对比:
      在这里插入图片描述
    2. Comparison with Fully-Supervised Transfer
    • 在PASCAL VOC 2012数据集上 ,Zero-Shot GroupViT(无微调)优于所有自监督预训练的ViT变体(有监督的微调)
    • 在 PASCAL Context数据集上,Zero-Shot GroupViT的效果也和它们相当。

      1.1.3.2 StyleCLIP
      • 论文《StyleCLIP: Text-Driven Manipulation of StyleGAN Imagery》(ICCV2021)
      • 还有另一篇相关的:《StyleCLIPDraw: Coupling Content and Style in Text-to-Drawing Synthesis》

        顾名思义,这是一篇CLIP+styleGAN的工作,可以通过文字的改变引导图像的生成。预测大概还需要当前1000倍的规模才可以弥补上十几个点的这个差距,现有的硬件条件也无法完成。ViLD即Vision and Knowledge Language Distillation,即用CLIP当做teacher蒸馏网络,从而能达到Zero-Shot检测。
      在这里插入图片描述

      • 左图的横纵坐标是ImageNet的分布偏移。关于这点,论文也采用一个重复检测器对评测的数据集重合做了检查,发现重合率的中位数为2.2%,而平均值在3.2%,去重前后大部分数据集的性能没有太大的变化,如下所示:
        在这里插入图片描述

        • 左:虽然几个数据集在检测到的重叠和干净示例上的zero-shot准确度有高达±20%的明显差异,但在35个数据集中只有5个具有99.5%的Clopper-Pearson置信区间,排除了0%的准确度差异。GLIP v1/v2
        • 视频理解:VideoCLIP、同样,当使用单边二项式检验计算时,只有6个数据集的准确性提高具有统计学意义。BERT
        • 李沐论文精读系列二:Vision Transformer、这正符合了作者想要的 group 分组合并的效果。
      • 推理
        文本和图像分别经过各自的编码器得到文本特征和图像特征,然后计算相似度,得到最匹配的图像文本对,就可以知道每个group embedding对应什么class。

    • 使推理和预训练时保持一致(消除distribution gap)。CLIP语义分割

      • 2.1 LSeg
        • 2.1.1 模型效果
        • 2.1.2 模型框架
        • 2.1.3 实验结果
      • 2.2 GroupViT
        • 2.2.1 前言
        • 2.2.2 模型结构
        • 2.2.3 Group tokens可视化
        • 2.2.4 实验
        • 2.2.5 局限性
      • 2.3 总结
    • 三、

    •   另外,还可以根据不同的数据集来调整这个模板,进而提升zero-shot的性能。对应group token g i 1 \mathbf{g}_i^1 gi1的尺寸是64×384。红包一般是中国特有的,新年的时候都会在里面塞钱。pointCLIP、

    • 图片间的对比学习损失L i n t e r L_{inter} Linter。其它方向