Open-Vocabulary Semantic Segmentation with Mask-adapted CLIP(基于掩码适应CLIP的开放词汇语义分割)


论文链接
代码链接

Abstract

摘要讲述的是一种名为开放词汇语义分割的技术,旨在将图像划分为根据文本描述的语义区域,这些文本描述在训练期间可能未曾见过。
近期的两阶段方法:(1)首先生成与类别无关的掩码提议,(2)然后利用预训练的视觉-语言模型(例如CLIP)来分类被掩码的区域。
瓶颈:预训练的CLIP模型,因为它在处理被掩码的图像时表现不佳。
解决方案:(1)对CLIP进行微调,使用一系列被掩码的图像区域及其对应的文本描述作为训练数据。通过挖掘现有的图像-标题数据集(例如COCO Captions),使用CLIP匹配被掩码图像区域到图像标题中的名词,来收集训练数据。与更精确且手动标注的具有固定类别的分割标签(例如COCO-Stuff)相比,他们嘈杂但多样的数据集能更好地保持CLIP的泛化能力。(2)除了对整个模型进行微调之外,还利用了被掩码图像中的*“空白”区域*,采用了一种称为掩码提示调整的方法。
实验表明,掩码提示调整在不修改任何CLIP权重的情况下带来了显著的改进,并且能进一步提高完全微调的模型的性能。特别是,当在COCO上训练并在ADE20K-150上评估时,他们的最佳模型达到了29.6%的mIoU,比之前的最高水平高出了8.5%。首次,开放词汇的通用模型在没有数据集特定适配的情况下,达到了2017年监督学习的专家模型的性能水平。

总结: 通过对CLIP模型的微调和创新的掩码提示调整方法,显著提高了开放词汇语义分割的性能。这使得模型能够更好地理解和分割在训练时未见过的文本描述的图像区域,打破了以往技术的限制,并使其性能达到了新的高度。

1. Introduction

开放词汇语义分割的核心挑战在于模型需要能够理解和处理在训练时未曾遇到的类别。传统的语义分割方法通常依赖于固定的、预先定义的类别集合,这意味着它们只能识别和分割这些预定义类别的对象。然而,现实世界中的场景远比这些固定类别复杂得多,存在大量的对象和概念,这些都是传统方法难以处理的。
为了克服这一局限,开放词汇语义分割的研究尝试让模型学会根据文本描述来理解和分割图像中的对象和区域。这种方法的优势在于它能够适应广泛的类别,包括那些在模型训练过程中未曾见过的新类别。通过这种方式,开放词汇语义分割致力于达到更接近人类的图像理解能力,使机器能够更加灵活地应对多变的视觉环境和挑战。
总结: 语义分割的目标:将像素分组到具有相应语义类别的有意义区域。
局限:传统的语义分割模型主要是用预定义的类别进行训练的,这限制了它们泛化到未见类别的能力。
类比:人类能够以开放词汇的方式理解场景,通常涵盖成千上万的类别。
解决:为了接近人类级别的感知,研究了开放词汇语义分割,即模型通过文本描述的任意类别来分割图像。

视觉-语言模型,如CLIP,通过学习数十亿规模的图像-文本对来掌握丰富的多模态特征。基于其卓越的开放词汇分类能力,先前的工作提出使用预训练的视觉-语言模型来进行开放词汇分割。其中,两阶段方法展现出了巨大的潜力:它们首先生成与类别无关的掩码提议,这些掩码大致描绘了图像中的不同物体或区域。然后利用预训练的CLIP进行开放词汇分类,来识别这些掩码中的内容属于什么类别。它们的成功依赖于两个假设:(1)模型能够生成与类别无关的掩码提议;(2)预训练的CLIP能将其分类性能转移到被掩码的图像提议上。
为了检验上述两个假设,进行了以下分析。首先,假设一个“预言家”级别的掩码生成器和一个普通的CLIP分类器。(“预言家”级别的掩码提议(Oracle Mask Proposals):指理想情况下,可以完美地识别出图像中所有感兴趣区域的掩码生成系统。这些掩码与图像中实际对象的位置、形状和边界完全一致,在实验中,这通常是通过使用图像的真实标注数据来模拟的;普通的CLIP分类器:未经任何针对性优化或调整以适应特定任务,直接使用预训练的CLIP模型来对提议的掩码区域进行分类)使用真实标注的掩码作为区域提议,并将被掩码的图像输入到预训练的CLIP中进行分类。这个模型在ADE20K-150数据集上只达到了20.1%的平均交并比(mIoU)。接下来,假设一个“预言家”级别的分类器,但使用一个普通的掩码提议生成器(“预言家”级别的分类器(Oracle Classifier):一个理想化的分类器,它能够以完美的准确度对图像区域进行分类。在实验中,这通常意味着使用真实的标注数据来模拟分类器的决策;普通的掩码提议生成器:实际操作中使用的系统,它根据学习到的模式从原始图像中生成可能包含特定对象或特征的区域提议。这些生成的掩码提议可能并不完美,可能会包括一些错误或遗漏)——在COCO数据集上预训练的MaskFormer。首先提取被掩码的区域提议,然后将每个区域与真实的对象掩码进行比较,找到重叠度最高的对象,并将该对象的标签分配给提取出的区域。尽管区域提议不完美,这个模型达到了显著更高的mIoU,为66.5%。
这一分析清楚地表明,预训练的CLIP模型在对被掩码图像进行分类时不能达到令人满意的效果,成为两阶段开放词汇分割模型的性能瓶颈。我们假设这是由于被掩码图像与CLIP训练图像之间存在显著的领域差异所导致的。CLIP是在自然图像上预训练的,数据增强非常有限。另一方面,掩码提议是从原始图像中裁剪和调整大小得来的,并且进一步被嘈杂的分割掩码所破坏。
总结: CLIP模型优点:CLIP模型是利用大量的自然图像和对应文本进行预训练的,这些训练图像几乎未经过任何修改或仅进行了最基本的数据增强处理。因此,CLIP在理解完整、未被遮挡的图像方面表现出色。
CLIP模型挑战:(1)在开放词汇语义分割任务中,模型需要处理的是经过裁剪、调整大小,甚至被分割掩码部分遮挡的图像。这些被掩码的图像与CLIP的训练数据在视觉上存在显著差异,导致CLIP在对这些图像进行分类时遇到困难。(2)掩码提议的生成过程可能会导致图像质量下降,如分辨率降低、对象的一部分被遮挡等,这进一步加大了模型面临的挑战。(3)CLIP在训练时所见的图像大多保持完整,这种领域差异意味着CLIP对被掩码图像的理解能力受到限制,从而影响了其在开放词汇语义分割任务中的性能。
在这里插入图片描述图1展示了开放词汇语义分割的一种两阶段方法的概览以及性能瓶颈的分析。
(a)部分显示的是CLIP模型的预训练过程。在这个过程中,CLIP是使用自然图像以及相应的文本描述来进行训练的,其中的数据增强非常有限。这种训练使得CLIP能够理解和识别各种自然图像和相应的文本描述。
(b)部分描述了开放词汇语义分割的两阶段方法的框架。首先是类别不可知的掩码提议生成器,它生成图像中可能的对象掩码。然后,这些被掩码的图像送入预训练好的CLIP模型进行分类。图中说明了输入到CLIP模型的是被裁剪和掩码处理过的图像,这些图像与CLIP训练时使用的自然图像有很大的领域差异。
(c)部分展示了性能瓶颈的分析结果。使用“预言家”级别的掩码提议和普通的CLIP分类器,模型在ADE20K-150数据集上的平均交并比(mIoU)仅为20.1%。而使用普通的掩码提议生成器和“预言家”级别的分类器,模型的mIoU显著提高至66.5%。这表明预训练的CLIP在被掩码的图像上的表现并不理想,这一点是限制了两阶段开放词汇语义分割方法性能的主要因素。

为了解决预训练的CLIP模型在处理被掩码图像上的表现不佳的问题,我们提出了一个解决方案,即通过在被掩码的图像及其对应的文本标签上进行微调来适应CLIP模型。一种直接的解决办法是使用分割标签进行训练,例如使用COCO-stuff数据集中的标签。但是,这种方法导致模型在未见过的类别上泛化能力差(第4.3.1节)。这些手动注释的掩码虽然精确,但其类别数量有限,只限于一个封闭的集合(例如,COCO-stuff只有171个类别)。我们推测,文本类别的缺乏多样性导致微调后的CLIP模型丧失了对开放词汇概念的泛化能力。
作为替代,我们通过挖掘现有的图像-标题数据集(例如COCO Captions)来收集训练数据。针对每对图像-标题,我们首先提取标题中的名词,并使用预训练的分割模型生成与类别无关的掩码区域提议。然后,我们利用预训练的CLIP模型为每个提取出的名词分配最匹配的提议。通过从这种弱监督的掩码图像和新类别之间的对齐关系中学习,调整后的CLIP模型更好地保持了对开放词汇分类的泛化能力。
总结: 解决预训练的CLIP模型在处理被掩码图像上的表现不佳的问题的方法:(1)使用有限类别的手动标注掩码进行微调(不采用,泛化能力差)(2)利用图像和它们的标题描述来创建一个更加多样化的训练集(采用,这样可以保留并增强CLIP模型理解和分类未在训练数据中直接出现过的开放词汇类别的能力,使CLIP模型可以更好地适应并执行开放词汇语义分割任务)

接下来的问题是如何有效地微调CLIP模型?被掩码图像和自然图像之间最显著的区别是,在被掩码图像中背景像素被遮挡了,导致图像中存在许多空白区域。当这些空白区域输入到CLIP的变换器(transformer)中时,它们会被转换成“零标记(zero tokens)”(“零标记”指的是由于图像被掩码部分没有携带任何有关原始像素的信息,因此在模型内部表示为零值的标记。在CLIP的预训练数据集中,所有的输入图像都是完整的自然图像,没有这样的“零”区域,所以模型没有学会如何处理这种类型的输入)。这些零标记不仅不包含有用信息,而且还会给模型带来领域分布的转变(因为在自然图像中不存在这样的标记),从而导致性能下降。为了缓解这一问题,我们提出了一种掩码提示调整(mask prompt tuning),这受到了视觉提示调整(visual prompt tuning)的启发。在对被掩码图像进行标记化(tokenizing)时,我们用可学习的提示标记(prompt tokens)来替换“零标记”。
在微调过程中,我们可以选择只训练提示标记而保持CLIP模型的权重不变,或者同时训练两者。我们发现,仅仅通过掩码提示调整就能显著提高CLIP在被掩码图像上的表现。这一属性对于多任务场景非常重要,在这种场景中我们不能改变CLIP的权重,因为它与其他任务共享。当与完整模型的微调结合时,掩码提示调整可以进一步以一个非琐碎的幅度提高性能。
总结: 采用一种创新的微调方法——掩码提示调整,通过引入可以学习的标记来代替“零标记”,帮助模型更好地处理这些空白区域。它通过添加和训练新的提示标记来帮助CLIP模型更好地处理被掩码的图像,而不需要改变模型本身的权重。

在我们的实验中,我们以“零样本”(zero-shot)的方式评估了在保留的分割数据集上的开放词汇语义分割性能——我们没有针对每个评估数据集调整模型。我们使用带有标题的COCO-stuff数据集来训练我们的模型,并在具有挑战性的ADE20K(150类和846类别)、Pascal Context(59类和459类别)和PASCAL VOC(20类)上进行测试。我们的最佳模型在ADE20K的150个类别(A-150)上达到了29.6%的平均交并比(mIoU),这比同样设置下的现有最先进方法OpenSeg高出了8.5%。在更具挑战性的847类别的ADE20K(A-847)和459类别的Pascal Context(PC-459)上,我们的模型设定了新的最高标准,分别达到了9.0%和12.4%的mIoU,超过了以前最好的方法分别高出2.7%和3.4%。更重要的是,我们首次展示了开放词汇通用模型可以匹配2017年数据集特定适配的监督学习专家模型的性能。
总结: 这个模型在没有对特定评估数据集进行任何调整的情况下,即在一个零样本的学习框架内,就能实现对图像进行准确的开放词汇语义分割。并显示出比以前的方法更高的准确度。

总结一下我们的研究贡献包括:
性能瓶颈分析:我们的分析揭示了预训练的CLIP模型在处理掩码提议时表现不佳,成为了两阶段方法的性能瓶颈。
适配CLIP模型:我们从图像的描述中收集了多样化的掩码-类别对,以适应CLIP模型处理被掩码的图像,并保持其泛化能力。
掩码提示调整:我们提出了专门针对被掩码图像适应的掩码提示调整方法。这种方法不会改变CLIP模型的权重,使得可以进行多任务的权重共享。
开放词汇模型的性能展示:我们首次展示,开放词汇的通用模型可以匹配到2017年监督学习的专家模型的性能,而且不需要针对特定数据集进行调整

2. Related Work

预训练的视觉-语言模型如CLIP通过连接视觉概念与文本描述来增强计算机视觉任务的语言能力。CLIP在开放词汇分类方面表现出强大的能力,即能够用语言描述的任意类别对图像进行分类。它已经被用于提升多种计算机视觉任务的性能,包括图像操作、图像生成、对象检测和图像分割等。
我们的工作与RegionCLIP类似,RegionCLIP通过在区域提议上进行微调来适配CLIP于对象检测任务。然而,我们的方法与RegionCLIP有所不同:(1)我们适配CLIP处理被掩码的图像,而RegionCLIP处理的是完整的区域裁剪;(2)我们利用被掩码图像中的空白区域,提出了掩码提示调整方法,这种方法可以在不改变CLIP权重的情况下对其进行调整。这使得在多任务场景中可以与其他任务共享CLIP的权重,而RegionCLIP则不支持这一功能。

开放词汇分割的目标是理解由文本描述的任意类别的图像。开创性的工作ZS3Net使用生成模型通过未见类别的词嵌入合成像素级特征。SPNet利用词嵌入(例如word2vec)将语义含义与视觉特征对齐。GroupViT直接从文本监督中分组分割掩码。最近,研究人员提出利用预训练的CLIP模型进行开放词汇语义分割。LSeg将像素嵌入与相应语义类别的文本嵌入对齐,后者由CLIP的文本编码器生成。不同于像素级的LSeg,OpenSeg提出通过区域-词语定位将段落级视觉特征与文本嵌入对齐。
我们的方法属于两阶段方法的类别,如ZSSeg和ZegFormer:它们首先生成与类别无关的掩码提议,然后利用预训练的CLIP进行开放词汇分类。不同于ZSSeg和ZegFormer直接使用原始的CLIP进行被掩码图像分类,我们适配CLIP以提高性能。

提示调整(Prompt Tuning)是一种适应大规模预训练模型到新任务的策略。这一概念起源于自然语言处理领域,并且近期的研究将提示调整扩展到计算机视觉中。例如,CoOp通过在类别词前添加可学习的向量来适应CLIP进行多种识别任务。文本提示调整也被广泛应用于开放词汇对象检测和语义分割。
我们的掩码提示调整与视觉领域的提示调整更为相关,其中可学习的向量被应用于图像领域。不同于视觉提示调整那样在实际图像标记之前插入额外的标记,我们是用可学习的提示来替换被掩码的标记。此外,掩码提示调整在完全微调的模型上带来了额外的改进。这种额外的改进在之前的工作中未曾报道过。

3. Method

在本节中,我们首先回顾两阶段开放词汇语义分割方法。然后,我们将讨论如何获得掩码-类别对的数据集来微调CLIP。最后,我们将讨论提出的掩码提示调整技术,以适应CLIP处理被掩码的图像。
在这里插入图片描述图2展示了一个包含分割模型(如MaskFormer)和CLIP模型的两阶段方法。这个过程可以分为以下几个主要步骤:
1.分割模型训练(Segmentation model training):首先,修改过的MaskFormer模型与CLIP的文本嵌入一起进行训练,以便执行开放词汇的语义分割。这里,MaskFormer学习如何根据图像中的不同区域生成掩码提议,并预测每个提议的类别。
2.收集掩码-类别对(CLIP adaptation with collected mask-category pairs):使用预训练的分割模型生成类别不可知的提议,并根据相应图像的标题中提取的名词与这些提议对齐。这些名词通过语言解析器从图像的说明文字中提取出来。
3.微调CLIP(Finetune CLIP with mask prompt tuning):在收集了多样化的掩码-类别对后,使用提出的掩码提示调整技术对CLIP进行微调,以适应被掩码的图像。
整个流程中,“LOSS_mask” 和 “LOSS_cls” 分别表示在训练过程中使用的掩码损失和分类损失。这些损失函数指导模型在分割任务上产生准确的掩码提议,并在CLIP的适配过程中正确分类每个掩码区域。

3.1. Two-stage models for open-vocabulary semantic segmentation

我们的两阶段开放词汇语义分割模型由一个生成掩码提议的分割模型和一个开放词汇分类模型组成。
总结:
第一阶段 - 分割模型:从输入的图像中生成掩码提议。这些掩码提议代表了图像中可能的感兴趣区域,即便这些区域的具体类别在这一阶段还未知。
第二阶段 - 开放词汇分类模型:一旦获得了掩码提议,下一步就是使用的开放词汇分类模型确定这些提议区域的具体类别,模型能够将图像中的每个掩码区域分类到一个开放的、由文本描述的词汇集中。

遵循之前的研究工作,我们选择MaskFormer作为分割模型。(MaskFormer是一种用于图像分割任务的深度学习模型。它的设计理念与传统的每像素分类方法不同,MaskFormer专注于直接预测整个图像的分割掩码集合,每个掩码代表图像中的一个对象或一块区域。MaskFormer生成的掩码提议是类别不可知的,这意味着在初始阶段,并不需要确定每个掩码对应的具体类别。)与每像素分割模型不同,MaskFormer预测一组N个掩码提议及其对应的类别预测。每个提议由一个H×W的二值掩码表示,标示了目标对象的位置。类别预测是一个C维分布,其中C是训练集中的类别数量。我们对MaskFormer进行了修改,使其对于每个掩码,都生成一个C维的提议嵌入,这里的C是CLIP模型的嵌入维度(对于ViT-B/16是512,对于ViT-L/14是768)。这个改动允许MaskFormer执行开放词汇分割。具体来说,假设我们想要将掩码分类到K个类别,我们首先使用CLIP模型的文本编码器为每个类别生成K个文本嵌入{tk|tk ∈ RC}k=1,···,K。接下来,我们将每个掩码嵌入vi与文本嵌入进行比较,并预测属于类别k的概率为pi,k = exp(σ(vi, tk)/τ )/ ∑k(exp(σ(vi, tk)/τ ))。这里σ(·, ·)表示两个嵌入向量之间的余弦相似度,τ是温度系数。
我们在COCO-Stuff数据集上训练修改后的MaskFormer,该数据集包含171个类别。我们使用CLIP的文本编码器处理类别名称以生成文本嵌入。我们还添加了一个可学习的嵌入∅来表示“无对象”的类别。对于其他训练设置,我们遵循原始MaskFormer的设置。
总结: 关键步骤:
1.使用MaskFormer进行分割:MaskFormer是一个基于Transformer的分割模型,它不是为每个像素预测类别,而是直接预测出一组掩码,每个掩码代表图像中的一个对象。
2.生成二值掩码:每个掩码提议由一个H×W的二值掩码表示,这个掩码确定了目标对象在图像中的位置,其中1代表对象的前景,0代表背景。
3.类别预测:对于每个掩码提议,MaskFormer还预测一个C维的分布,这里的C是训练集中的类别数量。每个维度代表一个特定类别,其值表示掩码提议属于该类别的概率。
4.修改以适配CLIP:为了使MaskFormer能够与CLIP协同工作,进行了改动,使其能为每个掩码生成一个与CLIP的嵌入维度相匹配的C维提议嵌入向量。(C维提议嵌入的维度C,此处特指与CLIP模型的嵌入维度匹配的维度,而非类别数量。
5.生成文本嵌入:使用CLIP的文本编码器为数据集中的每个类别名称生成文本嵌入。
6.计算概率:对于每个掩码嵌入,计算与所有类别文本嵌入之间的余弦相似度,然后使用softmax函数来预测每个掩码属于各个类别的概率。

公式:Pi,k = exp(σ(vi, tk)/τ)/∑k(exp(σ(vi, tk)/τ))
vi:一个特定掩码提议的C维嵌入向量;tk:代表某个类别 k 的文本描述经过CLIP文本编码器后得到的C维嵌入向量;σ(vi,tk):掩码提议嵌入 vi 与类别嵌入tk之间的余弦相似度;τ:是一个正的缩放参数,称为温度系数。它用于控制softmax函数的“平滑度”或“尖锐度”。温度系数较低会使概率分布更尖锐(即,差异更大的分类概率),而温度系数较高则使分布更平滑。
公式的分子计算了掩码提议 vi 与类别 k 的嵌入tk之间相似度的指数加权值。通过除以温度系数τ,可以调节这个相似度值的影响程度。
公式的分母是对所有类别 k 的相似度指数加权值进行求和,这个求和保证了所有类别的概率加起来等于1,满足概率分布的要求。
最终,公式计算得到的是掩码提议vi属于类别k 的概率。这个概率值基于掩码提议的视觉特征与类别文本描述的语义特征之间的相似度。

掩码提议生成器(mask proposal generator)在训练过程中的一个特定注意点,即这样训练的掩码提议生成器并不严格地“与类别无关”(class-agnostic)。这是因为对象的定义是由训练集中的类别定义决定的。也就是说,模型识别和分割对象的能力,在很大程度上依赖于它在训练过程中“看到”的类别。例如,如果训练集中只包含“人”这一个类别,那么模型不太可能自动将一个人分割成“脸”、“手”、“身体”或更细小的身体部分,因为它没有被训练去识别这些更细粒度的类别。

疑问: 文中一方面说MaskFormer预测的掩码提议与类别预测相关,另一方面又提到它是“与类别无关”的,出现了矛盾。
解答: 与类别无关的掩码提议:“与类别无关”(class-agnostic)指的是在生成掩码提议的过程中,模型不预先假定任何特定的类别信息。即模型的目标是识别图像中所有可能的对象或区域,而不是识别特定类别的对象。这种方法允许模型捕获图像中的各种潜在对象,而不受限于训练集中的类别定义。在这个阶段,模型生成的掩码提议仅仅表示了图像中可能的感兴趣区域,而不包含这些区域具体属于哪个类别的信息。
掩码提议的类别预测:尽管掩码提议是与类别无关的,一旦这些提议被生成,MaskFormer会进一步对每个掩码提议进行类别预测,这时就涉及到具体的类别信息了。即对于每个识别出的掩码区域,模型会尝试预测它最有可能属于训练集中的哪个类别。
也就是说,在MaskFormer模型中,首先以一种与类别无关的方式生成掩码提议,这些提议代表图像中的潜在对象或区域。然后,模型利用训练过程中学到的类别信息,对这些掩码提议进行类别预测。

在MaskFormer的基础上,参考先前的研究,我们添加了一个并行的预测分支,利用CLIP模型。MaskFormer生成一系列掩码提议 {Mi|Mi ∈ {0, 1}H×W }i=1,··· ,N,其中1表示前景,0表示背景。对于每个掩码,我们选择一个紧凑的边界框来包含所有前景像素,然后裁剪图像、屏蔽背景,并将其大小调整到CLIP模型所需的分辨率。之后,我们将每个掩码提议送入CLIP模型,并计算属于类别k的概率^pi,k。我们通过融合两个预测来计算最终的预测概率,即pi,k= p(1−λ)i,k ∗ ˆpλ i,k 其中λ ∈ [0, 1],我们使用MaskFormer的融合模块来将掩码级别的预测融合成语义分割结果。
总结: 1.掩码提议生成:MaskFormer通过其分割网络在图像上生成一系列的二值掩码提议,这些掩码精确地划分了图像中的前景对象和背景区域。
2.掩码处理和CLIP输入:对于每个掩码,选择一个包含所有前景像素的最小边界框,并对图像进行裁剪和背景屏蔽,然后调整裁剪后的图像到CLIP模型所需的分辨率。这个过程保证了送入CLIP模型的是仅包含前景对象的图像区域。
3.CLIP模型预测:调整后的图像被送入CLIP模型,CLIP对这些裁剪和处理过的图像进行分类,为每个掩码提议生成一个类别概率分布^pi,k。
4.预测结果融合:MaskFormer的原始预测 (pi,k) 和CLIP模型的预测 (^pi,k)进行融合,其中权重λ 调节两个预测的相对重要性。
5.语义分割融合:最终,这些融合后的掩码级别预测通过MaskFormer的融合模块整合,生成整个图像的语义分割结果。

def forward(self, batched_inputs):
    """
    前向传播函数:
    - `self`: 模型的自引用。
    - `batched_inputs`: 输入数据批次,每项包含一张图像的输入数据及其相关信息。
    """
    
    dataset_name = [x["meta"]["dataset_name"] for x in batched_inputs]
    """
    从输入数据中提取每张图像所属的数据集名称。
    """
    
    assert len(set(dataset_name)) == 1
    """
    断言所有图像来自同一个数据集。
    """
    
    dataset_name = dataset_name[0]
    """
    获取数据集名称。
    """
    
    images = [x["image"].to(self.device) for x in batched_inputs]
    """
    将每张图像转移到模型所在的设备(例如GPU)。
    """
    
    images = [(x - self.pixel_mean) / self.pixel_std for x in images]
    """
    对图像进行标准化处理:减去均值,除以标准差。
    """
    
    images = ImageList.from_tensors(images, self.size_divisibility)
    """
    将处理过的图像列表转换成一个 `ImageList` 对象,便于后续处理。
    """
    
    features = self.backbone(images.tensor)
    """
    使用模型的骨架网络(backbone)提取图像特征。
    """
    
    outputs = self.sem_seg_head(features)
    """
    将提取的特征传递给语义分割头部(sem_seg_head),获取分割结果。
    """
    
    class_names = self.get_class_name_list(dataset_name)
    """
    根据数据集名称,获取类别名称列表。
    """
    
    text_features = self.clip_adapter.get_text_features(class_names)
    """
    使用 CLIP 适配器为每个类别名称生成文本特征。
    """
    
    outputs["pred_logits"] = self.clip_adapter.get_sim_logits(
        text_features, self.clip_adapter.normalize_feature(outputs["pred_logits"])
    )
    """
    使用 CLIP 适配器,将预测的 logits 与类别的文本特征进行相似度计算,以提高预测准确性。
    """
    
    if self.training:
        """
        如果模型处于训练状态,执行以下步骤:
        """
        if "aux_outputs" in outputs.keys():
            for i in range(len(outputs["aux_outputs"])):
                outputs["aux_outputs"][i]["pred_logits"] = self.clip_adapter.get_sim_logits(
                    text_features,
                    self.clip_adapter.normalize_feature(outputs["aux_outputs"][i]["pred_logits"])
                )
        """
        对辅助输出也进行相似度计算处理。
        """
        
        if "instances" in batched_inputs[0]:
            gt_instances = [x["instances"].to(self.device) for x in batched_inputs]
            targets = self.prepare_targets(gt_instances, images)
        else:
            targets = None
        """
        准备目标实例,用于训练过程中的损失计算。
        """
        
        losses = self.criterion(outputs, targets)
        """
        计算损失。
        """
        
        for k in list(losses.keys()):
            if k in self.criterion.weight_dict:
                losses[k] *= self.criterion.weight_dict[k]
            else:
                losses.pop(k)
        """
        根据损失权重调整损失值,未指定权重的损失将被移除。
        """
        
        return losses
    else:
        """
        如果模型处于推理状态,执行以下步骤:
        """
        
        mask_cls_results = outputs["pred_logits"]
        """
        获取预测的类别 logits。
        """
        
        mask_pred_results = outputs["pred_masks"]
        """
        获取预测的分割掩码。
        """
        
        mask_pred_results = F.interpolate(
            mask_pred_results, size=(images.tensor.shape[-2], images.tensor.shape[-1]),
            mode="bilinear", align_corners=False
        )
        """
        将预测掩码上采样到原始图像大小。
        """
        
        processed_results = []
        """
        初始化处理后的结果列表。
        """
        
        for mask_cls_result, mask_pred_result, input_per_image, image_size in zip(
            mask_cls_results, mask_pred_results, batched_inputs, images.image_sizes
        ):
            """
            遍历每张图像的预测结果和输入数据。
            """
            
            height, width = image_size
            """
            获取当前图像的大小。
            """
            
            mask_pred_result = sem_seg_postprocess(
                mask_pred_result, image_size, height, width
            )
            """
            对预测掩码进行后处理,调整掩码大小匹配原始图像。
            """
            
            image = input_per_image["image"].to(self.device)
            """
            将当前处理的图像移至模型所在的设备。
            """
            
            r, regions = self.semantic_inference(
                mask_cls_result, mask_pred_result, image, class_names
            )
            """
            进行语义推理,获取每个区域的类别和掩码。
            """
            
            height = input_per_image.get("height", image_size[0])
            width = input_per_image.get("width", image_size[1])
            """
            获取图像的实际输出大小。
            """
            
            r = sem_seg_postprocess(r, image_size, height, width)
            """
            对推理结果的掩码进行后处理。
            """
            
            processed_results.append({"sem_seg": r})
            """
            将处理后的语义分割结果添加到结果列表。
            """
            
            if self.panoptic_on:
                """
                如果开启了全景分割功能。
                """
                
                panoptic_r = self.panoptic_inference(
                    mask_cls_result, mask_pred_result
                )
                """
                进行全景分割推理。
                """
                
                processed_results[-1]["panoptic_seg"] = panoptic_r
                """
                将全景分割结果添加到当前图像的处理结果中。
                """
                
        return processed_results
        """
        返回处理后的结果列表。
        """
def semantic_inference(self, mask_cls, mask_pred, image, class_names):
    # 定义语义推理函数,使用模型预测和CLIP适配器进行图像中各个区域的类别推理。

    mask_cls = F.softmax(mask_cls, dim=-1)[..., :-1]
    # 对模型预测的类别 logits 应用 softmax 函数进行归一化,排除最后一个类别(通常为背景)。

    mask_pred = mask_pred.sigmoid()
    # 对模型预测的分割掩码应用 sigmoid 函数,将输出转换为概率值。

    regions = None
    # 初始化区域变量,用于存储由CLIP适配器返回的额外信息。

    if self.clip_ensemble:
        # 检查是否启用了 CLIP 模型集成。

        clip_cls, regions, valid_flag = self.clip_adapter(
            image, class_names, mask_pred, normalize=True
        )
        # 使用 CLIP 适配器对图像和预测掩码进行处理,获取类别预测、区域信息和有效性标志。

        if clip_cls is None:
            # 如果 CLIP 模型未返回类别预测,则初始化一个空的预测张量。
            clip_cls = torch.empty(0, mask_cls.shape[-1] + 1, device=self.device)

        clip_cls = F.softmax(clip_cls[:, :-1], dim=-1)
        # 对 CLIP 模型的类别预测应用 softmax 函数进行归一化。

        if self.clip_ensemble_weight > 0:
            # 检查集成权重是否大于0,以确定是否结合原始模型预测和 CLIP 模型预测。

            map_back_clip_cls = mask_cls.new_ones(mask_cls.shape)
            # 创建与原始类别预测相同形状的全1张量。

            map_back_clip_cls[valid_flag] = clip_cls
            # 使用有效性标志更新张量,将 CLIP 模型的预测放入相应位置。

            mask_cls = torch.pow(mask_cls, 1 - self.clip_ensemble_weight) * \
                       torch.pow(map_back_clip_cls, self.clip_ensemble_weight)
            # 将原始模型预测和 CLIP 模型预测按权重融合。

        else:
            # 如果集成权重为0,则仅使用 CLIP 模型预测。
            mask_cls = clip_cls
            mask_pred = mask_pred[valid_flag]
            # 更新掩码预测,只保留有效的预测。

    semseg = torch.einsum("qc,qhw->chw", mask_cls, mask_pred)
    # 使用 einsum 计算最终的语义分割结果,结合类别概率和掩码预测。

    return semseg, regions
    # 返回语义分割结果和区域信息。

我们的分析显示CLIP在处理被掩码的图像时表现并不理想。具体来说,CLIP是在自然图像上进行训练的,数据增强非常有限。然而,被掩码图像包含了大量的“空白区域”。这样显著的领域差异使得CLIP难以将其分类性能转移到这些被掩码的图像上。
我们还尝试过在不屏蔽背景像素的情况下裁剪提议,但观察到性能更差(详见附录)。我们推测,保留背景像素使得CLIP更难以正确分类前景对象。

3.2. Collecting diverse mask-category pairs from captions

为了让CLIP更好地处理被掩码的图像,我们提议在由被掩码图像和文本对组成的数据集上对CLIP进行微调。一种直接的解决方案是利用手动标注的分割标签,例如来自COCO-Stuff的标签。这些标签虽然准确,但类别集是封闭的。我们尝试了这个解决方案,并从COCO-Stuff中收集了965K个掩码-类别对,涵盖了171个类别(例如,香蕉、橙子)。然后,我们对CLIP的图像编码器进行微调,同时冻结文本编码器,遵循之前的研究方法。然而,我们观察到这种简单的方法限制了CLIP的泛化能力,因为如果存在更多未见过的类别,性能会下降。我们假设,由于文本词汇有限,微调后的CLIP过度拟合了171个类别,失去了泛化到未见类别的能力。
总结: 微调CLIP时只使用COCO-Stuff数据集中的类别,这意味着CLIP模型在训练过程中只“看到”了一个相对较小的词汇集,这限制了模型学习和理解更广泛文本描述的能力。当CLIP模型在一个封闭且固定的类别集上被微调时,它可能过度拟合这些类别,从而在遇到训练集外的新类别时性能下降。这是因为模型变得过于专注于训练集中的特定类别,而没有保持足够的泛化能力。

与分割标签相比,图像标题包含了关于图像更丰富的信息,并且涉及到更广泛的词汇量。例如,在图3中,图像的标题是“There are apple and orange and teapot.”(图中有苹果、橙子和茶壶)。尽管“苹果”和“橙子”在COCO-Stuff数据集中是有效的类别,但其他概念,如“茶壶”,并不是有效的类别,因此在使用COCO-Stuff等数据集进行训练时会被忽略。
基于这一观察,我们设计了一种自标注策略来提取掩码-类别对。正如图3所示,给定一张图像,我们首先使用预训练的MaskFormer提取被掩码的提议。同时,从对应的图像标题中,我们使用现成的语言解析器提取所有名词,将它们视为潜在的类别。然后,我们利用CLIP将最匹配的掩码提议与每个类别配对。从COCO-Captions数据集中,我们使用每张图像的5个标题收集了130万个掩码-类别对,包含27,000个独特的名词;或者使用每张图像的1个标题收集了44万对,包含12,000个名词。实验显示,这个噪声但多样化的掩码-类别数据集带来的性能明显优于手动分割标签。
在这里插入图片描述图3展示了如何使用图像标题来提取图像中的对象并将它们与相应的类别关联起来,这个过程涉及到MaskFormer、名词解析器,以及CLIP模型的结合使用。具体步骤如下:1.MaskFormer分割:图像首先通过MaskFormer进行处理,MaskFormer是一个图像分割模型,它能够识别和分割出图像中的各个对象。
2.提取名词:与此同时,图像的标题(在这个例子中是“There are apple and orange and teapot.”,即“有苹果、橙子和茶壶。”)被送入一个名词解析器,该解析器能够从标题中提取出所有的名词。在这个例子中,它提取出了“apple”、“orange”和“teapot”。

def _get_text_features(self, noun_list: List[str]): # 定义一个方法,用于获取一组名词的文本特征,输入是一个名词列表。
    left_noun_list = [ # 创建一个新的列表,用于存储还未在文本特征缓冲区中找到特征的名词。
        noun for noun in noun_list if noun not in self.text_feature_buffer
    ]
    if len(left_noun_list) > 0: # 如果有尚未获取特征的名词存在。
        left_text_features = self.text_templates( # 使用 text_templates 方法(可能是某种模型或功能)来获取这些名词的文本特征。
            left_noun_list, self.clip_model
        )
        self.text_feature_buffer.update( # 更新文本特征缓冲区,将新获取的名词和它们的特征加入缓冲区。
            {
                noun: text_feature
                for noun, text_feature in zip(
                    left_noun_list, left_text_features
                )
            }
        )
    return torch.stack([self.text_feature_buffer[noun] for noun in noun_list]) # 从文本特征缓冲区中提取所有输入名词的特征,并将它们堆叠成一个张量返回。

3.CLIP模型处理:之后,利用CLIP模型,分别对这些名词和MaskFormer分割出的对象进行配对。CLIP模型能够理解图像内容和相关的文本描述,因此可以用来判断哪个分割出的对象最可能对应于标题中的每个名词。在图中的矩阵里,CLIP模型为每个对象(分割出的掩码区域)与每个名词(类别)计算了一个匹配度分数,其中“teapot”的匹配度得分最高的区域对应的分数被高亮显示。
在这个例子中,虽然“apple”和“orange”是COCO数据集中的有效类别,但“teapot”不是。通过从标题中提取名词,我们不仅能识别数据集中已有的类别,还能识别出新的类别“teapot”。

3.3. Mask prompt tuning

在收集了数据集之后,一个自然的问题是如何有效地微调CLIP?被掩码图像与自然图像最显著的不同在于,被掩码图像中的背景像素被设为零,导致了许多“空白区域”。当将被掩码图像输入到CLIP时,图像会被分割成不重叠的小块并随后被标记化。那些空白区域随后变成零标记。这样的标记不仅不含有用信息,还给模型带来了领域分布的变化(因为在自然图像中不存在这样的标记),从而导致性能下降。为了缓解这个问题,我们提出了一种称为掩码提示调整的技术,借鉴了视觉提示调整的概念。具体来说,当将被掩码图像输入CLIP时,图像会被标记化为一个张量 T ∈ RNp ×E其中Np是小块的数量,E 是标记的维度。被掩码图像还伴随着一个简化的二值掩码 Mp∈{0,1}Np,每个元素指示给定的小块是保留还是被掩码。只有当小块内的所有像素完全被掩码时,该小块才被视为一个掩码标记。直觉上,边界像素,通常存在于部分被掩码的小块中,对于区域分类至关重要。我们分配了一个可学习的张量来代表提示标记,即 P ∈ RNp ×E 。最终输入到变换器的计算为T ⊗ Mp + P ⊗ (1 − Mp),其中 ⊗ 表示元素级乘法。借鉴“深度提示”的概念,我们可以将这样的提示标记添加到变换器的更深层。
总结: 掩码提示调整步骤:1.小块的划分:首先,整个图像被划分为多个固定大小的非重叠小块。
2.张量表示:每个小块接着被转换(或称为“标记化”)成一个向量,这个向量是高维空间中的一个点,可以捕获该小块的视觉信息。这个向量的维度(E)是预先定义的。
张量
3.T的构成:所有这些向量(代表图像中的每个小块)被组合成一个张量T,张量的维度是Np×E,其中Np是小块的总数,E是每个向量的维度。这个张量为整个图像提供了一个压缩且信息丰富的表示。
4.二值掩码 Mp:Mp是一个二值向量,其长度 Np等于图像被分割的小块数量。每个元素的值要么是0要么是1,对应于每个小块的状态。只有当一个小块内的所有像素都未被掩码时,我们才将该小块视为一个掩码标记。
5.可学习的张量P(提示标记):P∈RNp×E是一个可学习的张量,其中每个元素(或称为“提示标记”)都对应于图像中的一个小块。这个张量的目的是为模型提供额外的信息,帮助模型更好地处理那些因掩码操作而缺乏有效视觉信息的小块。
6.最终输入的计算:T ⊗ Mp + P ⊗ (1 − Mp)是计算最终送入模型变换器的输入的公式。公式中的第一部分T ⊗ Mp负责保留那些未被掩码(即,图像中有效部分)的小块信息。当Mp中的元素为1时,相应的T中的元素(即,图像小块的标记化向量)被保留;当Mp中的元素为0时,相应的T中的元素被忽略(乘以0)。第二部分P ⊗ (1 − Mp)则负责引入提示标记,为被掩码的小块提供额外的信息。当Mp中的元素为0时,
1−Mp为1,此时提示标记P的相应元素被加入到最终输入中。
*P ⊗ (1 − Mp)特别强调了边界像素的重要性,*即那些通常存在于部分被掩码小块中的像素。即使一个小块只有部分像素被掩码,这些边界像素仍然可以提供关于对象形状和边缘的重要信息,对于区域分类至关重要。通过将提示标记融入到被掩码的区域,可以帮助模型利用这些关键信息进行更准确的分类。

与对整个模型进行完全微调相比,掩码提示调整(Mask Prompt Tuning)具有几个优点。下面详细解释这些优势:
1.针对分割任务的专门设计:掩码提示调整专为处理分割任务而设计,特别是针对输入图像中部分区域被掩码的情况。这种方法直接解决了在进行语义分割或其他类型的分割任务时常见的问题,即如何有效处理和利用被掩码的图像区域。
2.可训练参数量显著减少:与完全微调整个模型相比,掩码提示调整中可训练的参数数量要少得多,数量级上的差异导致了更高的训练效率。这意味着在使用掩码提示调整时,模型的训练速度更快,所需的计算资源更少,同时减少了过拟合的风险。
3.适合多任务场景:作为一个基础模型,CLIP可能同时用于多个任务,而在某些情况下,可能不允许修改CLIP的权重。掩码提示调整不需要改变CLIP的权重,因此非常适合这种需要模型在多个任务间共享且保持固定权重的场景。
4.单独使用即可显著改善性能:实验表明,仅使用掩码提示调整就能带来显著的性能提升。这说明即便不对整个模型进行微调,仅通过调整输入的方式也能有效提升模型对被掩码图像的处理能力。
5.与全模型微调结合使用能进一步提升性能:如果将掩码提示调整与全模型微调结合使用,可以进一步提高开放词汇分割的性能。这种组合方法兼顾了微调带来的直接性能提升和掩码提示调整在特定场景下的优化,实现了性能的最大化提升。在这里插入图片描述
图4展示了掩码提示调整(Mask Prompt Tuning)的过程,这是一种适应CLIP模型以处理被掩码图像的技术,而不需要改变模型的权重。在这个示例中,处理的目标是一个图像,其中有一个茶壶,以及对应的文本“a photo of a {teapot}”。这里的步骤包括:1.文本编码(Text enc.):首先,文本“a photo of a {teapot}”被送入文本编码器(text encoder),这个编码器的参数是冻结的,意味着在训练过程中不会更新。
2.图像编码(Image enc.):同时,图像经过处理,其中被掩码的区域被特殊的掩码提示(mask prompt)所代替,这些掩码提示是可学习的,即它们的值在训练过程中会更新以更好地适应任务。
3.Patchify:接着,处理后的图像被分割成小块(patches),每个小块被转换为嵌入向量(embeddings)。在这个过程中,所有的空白区域(通常由于掩码操作而产生)被替换为掩码提示。
4.掩码提示替换(Replacement):图像中的零标记(zero tokens)——这些通常对应于空白区域——被掩码提示所替换。这一步是通过元素级乘法来实现的,使得只有零标记对应的位置会被掩码提示所替换。
5.Transformer处理:然后,这些带有替换过的掩码提示的嵌入向量被送入变换器(Transformer)。这里的Transformer是CLIP模型中处理图像和文本信息,提取特征并进行分类的核心部分。
6.类别预测:最终,输出用于预测图像中物体类别的特征向量。

4. Experiments

4.1. Experimental setup

训练数据集 我们在COCO数据集上训练我们的模型。首先,我们使用COCO-Stuff数据集的分割标签来训练修改过的MaskFormer。接下来,我们在从COCO Captions数据集中获得的掩码-类别数据集上微调CLIP。该数据集有118k张训练图像,标注了171个有效类别,这些类别范围涵盖了物品(例如橙子、汽车)和背景(例如天空、道路)。除非另有说明,我们在训练期间使用所有171个类别的数据。
评估数据集 我们的开放词汇模型能够在任意数据集上进行零样本分割,而无需针对特定数据集进行调整。因此,我们在具有挑战性的ADE20K、Pascal VOC和Pascal Context数据集上测试我们的模型。ADE20K是一个密集像素级标注的场景理解数据集,它包含了室内外场景的多样化标注。其验证集有2K张图像。我们选择了两种类别版本,一种是150个常用类别(A-150),另一种是更多样化的847个类别(A-847)。Pascal VOC是一个用于分割的经典数据集。我们在其1.5K张验证图像上进行评估,这些图像包含20个类别(PAS-20)。Pascal Context是对PASCAL VOC 2010的额外注释集,它通过提供整个场景的注释,超越了原始PASCAL的语义分割任务。其验证集有5K张图像。我们也选择了两种类别版本,一种是59个常用类别(PC-59),另一种是全部459个类别(PC-459)。
实施细节 如前所述,我们的模型由两部分组成:一个基于MaskFormer的分割模型和一个适配CLIP的掩码模型。最终的类别预测是MaskFormer预测和CLIP预测的集成。集成权重λ的具体数值可以在附录中找到。对于分割模型,我们有两种骨干网络选择:ResNet-101c和Swin-Base。对于CLIP模型,我们有两种选择:ViT-B/16和ViT-L/14。我们在这里详细描述了我们最大的模型设置,而R101c模型的训练配方可以在附录中找到。对于Swin-Base分割模型,骨干网络权重初始化为ImageNet-21K预训练模型。我们使用AdamW优化器,并采用多项式学习率策略。初始学习率和权重衰减分别设置为6·10-5和10-2。我们使用640×640的裁剪尺寸,批量大小为32,并训练模型120K次迭代。对于数据增强和其他超参数,我们主要遵循[9]中的设置。
为了适应CLIP ViT-L/14模型,我们使用了OpenCLIP的实现。在从标题中收集了440K掩码-类别对后,我们提出了三种适应CLIP的方法:仅掩码提示调整(MPT)、仅完整模型微调(FT)和联合MPT+FT。对于仅MPT,我们使用官方OpenAI权重初始化CLIP模型,并随机初始化可学习的token。我们还使用了[20]中提出的深度提示。除非另有说明,提示深度默认设置为3。训练优化器是AdamW,初始学习率为2·10-2,权重衰减为0。采用余弦退火调度器来调整学习率。模型以224×224的输入尺寸训练,批量大小为256,训练5个时代。对于仅FT,我们保持类似的训练过程,但学习率大大降低到5·10-6,权重衰减增加到0.2。对于MPT+FT,我们首先用完全微调的模型初始化CLIP,然后在其上应用掩码提示调整,我们发现这种方法更稳定且有效(见附录)。所有其他超参数与仅MPT相同。在我们所有的实验中,CLIP的文本编码器都是冻结的。

4.2. Main results on open vocabulary semantic seg- mentation

OVSeg在开放词汇模型中表现最佳。我们使用常见的ResNet-101(R-101)模型尺寸,在表1中与其他开放词汇泛用模型进行了比较。我们使用了R-101c,它用3个连续的3×3卷积层替换了R-101的首个7×7卷积层,在语义分割领域很受欢迎。除非另有说明,我们最好的性能是通过联合掩码提示调整和微调得到的。首先,与逐像素方法(例如SPNet、ZS3Net、LSeg和LSeg+)相比,基于提议的方法(例如OpenSeg、SimBaseline和ZegFormer)表现得更好。我们的OVSeg也属于基于提议的类别。与其他基于提议的方法相比,我们的模型在所有五个基准测试中都显示出显著的改进。特别是,我们的R101c模型在具有挑战性的A-847和PC-459上分别实现了7.1%和11.0%的mIoU,甚至比基于EfficientNet-B7的OpenSeg模型表现得更好。我们注意到,开放词汇分割是一个新的研究问题,因此不同的方法可能会使用不同的实验设置,如不同的COCO注释。我们的实验表明,不同的注释导致的性能差异相对较小:当我们将COCO-Stuff-171更改为COCO-Stuff-156时,我们只观察到A-150上0.8%的mIoU下降。
最大的OVSeg模型在零样本基准测试中设立了新的SOTA(最优)结果。当我们放大模型时,我们的方法可以进一步获得更好的结果。使用Swin-Base(Swin-B)骨架和CLIP ViT-L/14,我们的模型在A-150和Pascal PC-59上可以实现29.6%和55.5%的mIoU,比SOTA零样本结果分别高出+8.5%和+13.6%。在具有挑战性的A-847和PC-459上,我们的模型设立了新的零样本最优记录,分别为9.0%和12.4%的mIoU。我们在附录中进一步详细介绍了A-150类别的类别级IoU。
开放词汇泛用模型可以与2017年的专业监督模型匹敌。我们的泛用模型显示出在没有任何特定数据集训练的情况下可以实现具有竞争力的性能。在具有挑战性的A-150上,我们的模型实现了与全监督FCN-8s相似的性能。在PAS-20上,我们的模型实现了94.5%的mIoU,甚至比SOTA专业模型高出+4.5%。我们注意到,OVSeg与监督模型并不直接可比,因为OVSeg没有在评估数据集上进行训练。OVSeg也有不同的骨架和分割模型架构。因此,与监督模型的比较仅供参考。我们的泛用模型在性能上仍然落后于更高级的专业模型,如监督的MaskFormer。
在这里插入图片描述表1 展示了开放词汇泛用模型和监督专家模型的平均交并比(mIoU)结果。SPNet和ZS3Net在PAS-20上的结果来自文献[23]。ZegFormer在PAS-20上的结果由我们重新计算。SimBaseline、ZegFormer和OpenSeg使用相同的COCO图像,即2017年的118K张图片,但是使用不同的标注。COCO-Stuff-156/171表示使用了COCO Stuff的156/171个类别的掩码标注。在R101c模型尺度下,我们的模型显著优于其他开放词汇模型。我们最大的Swin-Base模型可以与2017年一些监督专家模型的性能相匹敌。

4.3. Ablation study

4.3.1 Collecting mask-category pairs

表2探讨了微调数据对模型性能的影响。基线模型是使用原始CLIP ViT-L/14的MaskFormer Swin-Base。我们的初步尝试(案例(1))是收集有监督的真实类别标签(GT)掩码。我们可以收集到965K个掩码-类别对,包含171个独特名词(即COCO-stuff定义的类别数量)。然后我们用收集到的对微调CLIP模型。我们在A-847数据集上观察到了-2.0%的性能下降。这是因为适配后的CLIP过度拟合了这171个GT类别。尽管模型在PC-59(其类别与COCO-Stuff高度重叠)上取得了不错的结果,但在A-847中对更多样化的概念表现不佳。正如3.2节中详述的,我们建议利用标题来收集多样化的掩码-类别对。在解析标题中的名词后,我们将名词与基线模型生成的GT掩码(案例(2))或提议(案例(3))匹配。通过将GT掩码替换为提议,A-150的mIoU显著提高(从24.2%提高到28.8%)。我们推测很多区域没有被标记为GT掩码(参见图3中的例子),因此被忽略了。相比之下,生成的提议(通常为100个)可以覆盖图像中的大多数感兴趣区域,从而带来更好的性能。如果使用每张图像的所有5个标题(案例(4)),我们观察到在A-150和PC-59上有轻微的-0.2%退化。我们假设12K个名词对CLIP保持其开放词汇能力已经足够。因此,出于效率考虑,我们选择使用1个标题,因为它在训练中比使用5个标题快5倍。
在这里插入图片描述表2:掩码-类别对的消融研究。基线是搭载原始CLIP ViT-L/14的MaskFormer Swin-Base。掩码来自真实标记(GT)或生成的提议。类别名词来自真实标记(GT)类别或标题。我们还计算了收集到的对的统计数据(对的数量和独特名词的数量)。

4.3.2 Mask prompt tuning

我们在表3中评估了掩码提示调整(Mask Prompt Tuning, MPT)的效果。基线模型是搭载CLIP ViT-L/14的MaskFormer Swin-Base。如果我们只使用掩码提示调整(案例(a)),相比于基线模型,我们的模型在ADE-150和PC-59上分别取得了大幅提升,mIoU分别提高了+4.7%和+4.0%。案例(b)展示了完整模型微调的结果。尽管它取得了最好的准确率,但可训练的参数数量要多得多。与此相对的是,我们提出的掩码提示调整只修改了输入,而没有改变CLIP模型的权重。此外,如案例©所示,掩码提示调整还可以在完全微调过的模型的基础上进一步提高性能。案例©在ADE-150上达到了29.6%的mIoU,这比完全微调过的模型提高了显著的+0.8%。
在这里插入图片描述表3:对掩码提示调整(MPT)和完整模型微调(full model tuning)的消融研究。基线是搭载CLIP ViT-L/14的MaskFormer Swin-Base。我们报告了在代表性的ADE-847、ADE-150和PC-59数据集上的零样本(zero-shot)mIoU。所有的提升都是基于基线模型进行计算的。

4.4. Discussions

4.4.1 Segmentation with user-defined queries.

我们的方法允许用户定义任意查询,并在图像中搜索这些查询内容。无需训练我们的模型来学习特定概念,我们的模型可以在相应的图像中定位并分割出作为乐高火箭的土星五号(Saturn V)、作为VR头盔的Oculus,以及作为桥梁的金门大桥(golden gate)。这证明了开放词汇语义分割的强大潜力。
在这里插入图片描述图5:使用用户定义查询的开放词汇分割。我们的模型能够精确地分割未见过的类别,如土星五号火箭(Saturn V rocket)、Oculus头戴式显示器(headset)和金门大桥(Golden gate bridge)。

4.4.2 Ambiguity of open vocabulary evaluation

我们在图6中展示了来自A-150数据集的一些“失败”预测。对于左图,正确的类别应该是“建筑”(building),而我们的模型预测为“摩天大楼”(skyscrapers)。尽管“摩天大楼”是一个合理的描述,但标准的A-150评估协议会将其视为错误预测。右图中也发生了类似的情况,正确的“轨道”(rail)被识别为“道路”(road)。这是由于语言定义的类别是模糊的,且彼此之间可能存在重叠。为开放词汇分割模型设计更好的评估指标是我们未来研究的一个重要课题。请注意,由于知识产权的限制,我们使用我们自己的图像而非ADE20K图像作为图6的展示。但这种现象在ADE20K图像上广泛存在。在这里插入图片描述图6:开放词汇分割评估中类定义的歧义性。

5. Conclusion

本文研究了开放词汇语义分割问题,即模型通过文本描述的任意类别来分割图像。我们发现当前两阶段方法的性能瓶颈在于预训练的CLIP模型,因为它在处理被掩码的图像时表现不佳。我们提出了一种适配掩码图像的方法。为了保持CLIP的开放词汇分类能力,我们通过从图像-标题数据集中挖掘出来的多样化掩码-类别对来适配CLIP。我们进一步提出了掩码提示调整,这是一种可以适配CLIP而不改变其原始权重的方法。我们提出的模型是通用的,可以在任意数据集上进行零样本分割,而无需针对特定数据集进行适配。我们首次展示了开放词汇泛用模型可以与监督专业模型的性能相匹配。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值