Segment Everything Everywhere All at Once

论文链接:https://arxiv.org/pdf/2304.06718.pdf

项目链接:https://github.com/UX-Decoder/Segment-Everything-Everywhere-All-At-Once

试玩地址:https://huggingface.co/spaces/xdecoder/SEEM

Meta 发布「分割一切」AI 模型 ——Segment Anything Model(SAM)。SAM 被认为是一个通用的图像分割基础模型,它学会了关于物体的一般概念,可以为任何图像或视频中的任何物体生成 mask,包括在训练过程中没有遇到过的物体和图像类型。这种「零样本迁移」的能力令人惊叹,甚至有人称 CV 领域迎来了「GPT-3 时刻」。

最近,一篇「一次性分割一切」的新论文《Segment Everything Everywhere All at Once》再次引起关注。在该论文中,来自威斯康星大学麦迪逊分校、微软、香港科技大学的几位华人研究者提出了一种基于 prompt 的新型交互模型 SEEM。SEEM 能够根据用户给出的各种模态的输入(包括文本、图像、涂鸦等等),一次性分割图像或视频中的所有内容,并识别出物体类别。该项目已经开源,并提供了试玩地址供大家体验。

该研究通过全面的实验验证了 SEEM 在各种分割任务上的有效性。即使 SEEM 不具有了解用户意图的能力,但它表现出强大的泛化能力,因为它学会了在统一的表征空间中编写不同类型的 prompt。此外,SEEM 可以通过轻量级的 prompt 解码器有效地处理多轮交互。

大型语言模型 (Large Language Model, LLMs) 的成功,如 ChatGPT,证明了现代人工智能模型在与人类互动中的重要性,并提供了人工通用智能 (AGI) 的一瞥。与人类互动的能力需要一个用户友好的界面,可以接受尽可能多类型的人类输入,并生成人类容易理解的响应。在自然语言处理 (NLP) 领域,这样的通用交互界面已经出现并发展了一段时间,从早期的模型如 GPT 和 T5,到一些更高级的技术,如提示和思维链。在图像生成领域,一些最近的工作尝试将文本提示与其他类型,如草图或布局相结合,以更准确地捕捉用户意图,生成新的提示并支持多轮人工智能交互。

本文提出了一种通用的提示方案,可以通过多种类型的提示(如文本、点击、图像)与用户交互,进而构建一个通用的 “分割一切” 的模型 SEEM。该模型采用 Transformer 编码器-解码器结构,将所有查询作为提示输入到解码器中,并使用图像和文本编码器作为提示编码器来编码所有类型的查询,从而使视觉和文本提示始终保持对齐。

此外,该模型还引入了记忆提示来缩减以前的分割信息,并与其他提示进行通信,以增强互动性。与 SAM 等其他工作不同的是,该模型支持多种提示类型,具有零样本泛化能力。实验结果表明,SEEM 在许多分割任务中具有强大的性能,包括封闭集和开放集全景分割、交互式分割、接地分割以及使用多种提示的分割任务。

在变形金刚的合影中把「擎天柱」分割出来:

图片

还能对一类物体做分割,比如在一张景观图片中分割出所有建筑物:

图片

SEEM 也能轻松分割出视频中移动的物体:

图片

这个分割效果可以说是非常丝滑了。我们来看一下该研究提出的方法。

方法概述

该研究旨在提出一个通用接口,以借助多模态 prompt 进行图像分割。为了实现这一目标,他们提出了一种包含 4 个属性的新方案,包括多功能性(versatility)、组合性(compositionality)、交互性(interactivity)和语义感知能力(semantic-awareness),具体包括

1)多功能性该研究提出将点、掩码、文本、检测框(box)甚至是另一个图像的参考区域(referred region)这些异构的元素,编码成同一个联合视觉语义空间中的 prompt。

2)组合性通过学习视觉和文本 prompt 的联合视觉语义空间来即时编写查询以进行推理。SEEM 可以处理输入 prompt 的任意组合。

3)交互性:该研究引入了通过结合可学习的记忆(memory) prompt,并通过掩码指导的交叉注意力保留对话历史信息。

4)语义感知能力:使用文本编码器对文本查询和掩码标签进行编码,从而为所有输出分割结果提供了开放集语义。

架构方面,SEEM 遵循一个简单的 Transformer 编码器 – 解码器架构,并额外添加了一个文本编码器。在 SEEM 中,解码过程类似于生成式 LLM,但具有多模态输入和多模态输出。所有查询都作为 prompt 反馈到解码器,图像和文本编码器用作 prompt 编码器来编码所有类型的查询。

具体来说,该研究将所有查询(如点、框和掩码)编码为视觉 prompt,同时使用文本编码器将文本查询转换为文本 prompt,这样视觉和文本 prompt 就能保持对齐。5 种不同类型的 prompt 都能都映射到联合视觉语义空间中,通过零样本适应来处理未见过的用户 prompt。通过对不同的分割任务进行训练,模型具有处理各种 prompt 的能力。此外,不同类型的 prompt 可以借助交叉注意力互相辅助。最终,SEEM 模型可以使用各种 prompt 来获得卓越的分割结果。

除了强大的泛化能力,SEEM 在运行方面也很高效。研究人员将 prompt 作为解码器的输入,因此在与人类进行多轮交互时,SEEM 只需要在最开始运行一次特征提取器。在每次迭代中,只需要使用新的 prompt 再次运行一个轻量级的解码器。因此,在部署模型时,参数量大运行负担重的特征提取器可以在服务器上运行,而在用户的机器上仅运行相对轻量级的解码器,以缓解多次远程调用中的网络延迟问题。

如上图 3(b)所示,在多轮交互中,每次交互包含一个人工循环和一个模型循环。在人工循环中,人接收上一次迭代的掩码输出,并通过视觉 prompt 给出下一轮解码的正反馈或负反馈。在模型循环中,模型接收并更新记忆 prompt 供未来的预测。

SEEM 是一种采用通用编码器-解码器架构的模型, 但具有复杂的查询和提示交互, 如图3(a) 所示。给定输入图像 , 首先使用图像编码器提取图像特征 , 然后 SEEM 解码器基于与视觉、文本和记忆提示、 交互的查询输出  来预测掩模  和语义概念 。

在训练期间,  被复制用于全景分割、指代分割和交互分割。

在推断时,可学习的查询从相同的权重集合初始化,从而实现 zero-shot 组合。这种设计受到 X-Decoder 的成功实践的启发,但不同之处是,这允许使用具有以下属性的通用图像分割模型:

多功能

除了文本输入外,SEEM 还引入了视觉提示来处理所有的非文本输入,例如点、框、涂鸦和另一幅图像的区域引用等。

当文本提示无法准确识别正确的分割区域时,非文本提示就能够提供有用的补充信息,帮助准确定位分割区域。 以往的交互式分割方法通常将空间查询转换为掩模,然后将它们馈送到图像骨干网络中,或者针对每种输入类型(点、框)使用不同的提示编码器。然而,这些方法存在重量过大或难以泛化的问题。

为了解决这些问题,SEEM 提出了使用视觉提示来统一所有非文本输入。这些视觉提示以令牌的形式统一表示,并位于同一视觉嵌入空间中,这样就可以使用同一种方法来处理所有非文本输入。 为了提取这些视觉提示的特征,该模型还引入了一个称为“视觉采样器”的方法,用于从输入图像或引用图像的特征映射中提取特定位置的特征。

此外,SEEM 还通过全景和引用分割来持续学习通用的视觉-语义空间,使得视觉提示与文本提示能够自然地对齐,从而更好地指导分割过程。在学习语义标签时,提示特征与文本提示映射到相同的空间以计算相似度矩阵,从而更好地协同完成分割任务。

可组合

用户可以使用不同或组合的输入类型表达其意图,因此在实际应用中,组合式提示方法至关重要。

然而,在模型训练时会遇到两个问题。首先,训练数据通常只涵盖一种交互类型(例如,无、文本、视觉)。其次,虽然我们已经使用视觉提示来统一所有非文本提示并将它们与文本提示对齐,但它们的嵌入空间仍然本质上不同。

为了解决这个问题,本文提出了将不同类型的提示与不同的输出进行匹配的方法。在模型训练后,SEEM 模型变得熟悉了所有提示类型,并支持各种组合方式,例如无提示、单提示类型或同时使用视觉和文本提示。值得注意的是,即使是从未像这样训练过的样本,视觉和文本提示也可以简单地连接并馈送到 SEEM 解码器中。

可交互

SEEM 通过引入记忆提示来进行多轮交互式分割,使得分割结果得到进一步优化。记忆提示是用来传递先前迭代中的分割结果,将历史信息编码到模型中,以在当前轮次中使用。

不同于之前的工作使用一个网络来编码掩模,SEEM 采用掩模引导的交叉注意力机制来编码历史信息,这可以更有效地利用分割历史信息来进行下一轮次的优化。值得注意的是,这种方法也可以扩展到同时进行多个对象的交互式分割。

语义感知

与之前的类别无关的交互式分割方法不同,SEEM 将语义标签应用于来自所有类型提示组合的掩码,因为它的视觉提示特征与文本特征在一个联合视觉-语义空间中是对齐的。

在训练过程中,虽然没有为交互式分割训练任何语义标签,但是由于联合视觉-语义空间的存在,掩膜嵌入(mask embeddings)和 视觉取样器 (visual sampler)之间的相似度矩阵可以被计算出来,从而使得计算出的 logits 可以很好的对齐,如图3(a)所示。

这样,在推理过程中,查询图像就可以汇集多个示例的信息。

实验结果

该研究将 SEEM 模型与 SOTA 交互式分割模型进行了实验比较,结果如下表 1 所示。

作为一个通用模型,SEEM 实现了与 RITM,SimpleClick 等模型相当的性能,并且与 SAM 的性能非常接近,而 SAM 用于训练的分割数据是 SEEM 的 50 倍之多。

与现有的交互式模型不同,SEEM 是第一个不仅支持经典分割任务,还支持各种用户输入类型的通用接口,包括文本、点、涂鸦、框和图像,提供强大的组合功能。如下表 2 所示,通过添加可组合的 prompt,SEEM 在 cIoU,mIoU 等指标上有了显著的分割性能提升。

我们再来看一下交互式图像分割的可视化结果。用户只需要画出一个点或简单涂鸦,SEEM 就能提供非常好的分割结果

也可以输入文本,让 SEEM 进行图像分割

还能直接输入参考图像并指出参考区域,对其他图像进行分割,找出与参考区域一致的物体:

Zero-shot video object segmentation using the first frame plus one stroke:

总结

本文介绍了 SEEM,该模型可以同时对所有语义进行全局分割,并且可以与用户互动,接受来自用户的不同类型的视觉提示,包括点击、框选、多边形、涂鸦、文本和参考图像分割。这些提示 (prompt) 通过提示编码器映射到联合视觉-语义空间中,使我们的模型适用于各种提示,并可以灵活地组合不同的提示。通过大量实验证明,该模型在几个开放和交互分割基准测试上表现出竞争力。

当然,SEEM 并不是完美的,其存在的两个主要限制为:训练数据规模有限SEEM 不支持基于部分的分割。我们通过利用更多的训练数据和监督,可以进一步提高模型性能,而基于部分的分割可以在不改变模型的情况下无缝地从中学习。最后,非常感谢 SAM 提出的分割数据集,这是是非常宝贵的资源,我们应该好好利用起来。

Segment Anything

CV的大模型,而且新数据集+新范式+超强零样本泛化能力。

一直觉得CV的大模型可能会像BERT那样,一个处理全部任务,但是其实在CV上并没有这么好的效果。

SAM的出现统一了分割这个任务(CV任务的一个子集)的下流应用,说明了CV的大模型是可能存在的。

其肯定会对CV的研究带来巨大的变革,很多任务会被统一处理,可能再过不久,检测、分割和追踪也会被all in one了。

paper: https://arxiv.org/abs/2304.02643

Code: https://github.com/facebookresearch/segment-anything

Dataset: https://ai.facebook.com/datasets/segment-anything/

Demo的效果非常惊人: https://segment-anything.com/

1. 解决的问题

在网络规模数据集上预训练的大型语言模型正在通过强大的零样本和少样本泛化能力彻底改变NLP。 这些“基础模型”(foundation models)可以泛化到超出训练期间所见的任务和数据分布。此功能通常通过提示工程(prompt engineering)实现,其中使用手工制作的文本来提示语言模型为手头的任务生成有效的文本响应。 当使用来自网络的大量文本语料库进行缩放和训练时,这些模型的零样本和少样本性能与微调模型相比(在某些情况下甚至匹配)出奇地好。经验趋势表明,这种行为会随着模型规模、数据集大小和总训练计算量的增加而改善。

基础模型也在计算机视觉中进行了探索,尽管程度较小。也许最突出的工作是对齐来自网络的成对文本和图像。例如,CLIP 和 ALIGN 使用对比学习来训练对齐两种模式的文本和图像编码器。一旦经过训练,工程化的文本提示就可以零样本泛化到新颖的视觉概念和数据分布。此类编码器还可以与其他模块有效组合,以支持下游任务,例如图像生成(例如,DALL·E)。虽然在视觉和语言编码器方面取得了很大进展,但计算机视觉包括超出此范围的广泛问题,并且对于其中许多问题,并不存在丰富的训练数据。

在这项工作中,作者的目标是建立图像分割的基础模型。 也就是说,寻求开发一个可提示的模型,并使用能够实现强大泛化的任务在广泛的数据集上对其进行预训练。有了这个模型,其目标是使用提示工程解决新数据分布上的一系列下游分割问题。(基础模型是指即在广泛的数据上进行大规模训练,并且是适应广泛的下游任务)

该计划的成功取决于三个组成部分:任务、模型和数据。 为了开发它们,作者解决了以下有关图像分割的问题:

  1. 什么任务可以实现零样本泛化?
  2. 对应的模型架构是怎样的?
  3. 哪些数据可以为这项任务和模型提供支持?

2. 提出的方法

上述错综复杂,需要综合解决。作者首先定义一个可提示的分割任务,该任务足够通用以提供强大的预训练目标并支持广泛的下游应用程序。这个任务需要一个支持灵活提示的模型,并且可以在提示时实时输出分割掩码,以供交互使用。为了训练合格的模型,更是需要多样化、大规模的数据源。

不幸的是,没有用于分割的超大网络规模数据源; 为了解决这个问题,作者构建了一个“数据引擎”,即,在使用本文提出的高效模型来协助数据收集和使用新收集的数据来改进模型之间进行迭代。

2.1 任务:Segment Anything Task

任务:首先将提示(prompt)的概念从 NLP 转化为分割,其中提示可以是一组前景/背景点、粗略的框或掩码(mask)、自由格式的文本,或者一般来说,任何指示要分割内容的信息。 然后,可提示的分割任务是在给定任何提示的情况下返回有效的分割掩码。 “有效”掩码的仅仅意味着即使提示不明确并且可能引用多个对象(例如,回想一下衬衫与人的例子,如下图),输出也应该是至少一个对象的合理掩码。此要求类似于期望语言模型对模棱两可的提示输出连贯的响应。作者选择这个任务是因为它会产生一个自然的预训练算法和一个通过提示将零样本迁移到下游分割任务的通用方法。

预训练:可提示分割任务提出了一种自然的预训练算法,该算法为每个训练样本模拟一系列提示(例如,点、框、掩码),并将模型的掩码预测与标注进行比较。作者从交互式分割中采用这种方法,尽管与交互式分割的目的是在足够的用户输入后最终预测一个有效掩码不同,本文的目标是始终为任何提示预测一个有效掩码,即使提示是模棱两可的。

零样本迁移:直觉上,所提出的预训练任务赋予模型在推理时对任何提示作出适当响应的能力,因此下游任务可以通过设计适当的提示来解决。例如,如果有一个猫的边界框检测器,则可以通过将检测器的框输出作为提示提供给我们的模型来解决猫实例分割。 一般来说,大量实际应用的分割任务都可以建模为提示的形式。

相关任务:分割是一个广泛的领域:有交互式分割、边缘检测、超像素化、对象候选生成、前景分割、语义分割、实例分割、全景分割等。本文可提示分割任务的目标是生成一个功能广泛的模型,可以通过提示工程适应许多(尽管不是全部)现有的和新的分割任务。 这种能力是任务泛化的一种形式,这与之前关于多任务分割系统的工作不同。 在多任务系统中,单个模型执行一组固定的任务,例如联合语义、实例和全景分割,但训练和测试任务是相同的。本文工作中的一个重要区别是,经过提示分割训练的模型可以在推理时通过充当更大系统中的组件来执行新的、不同的任务,例如,为了执行实例分割,可提示分割模型与现有的物体检测器可以结合。

讨论:提示和组合是强大的工具,可以使单个模型以可扩展的方式使用,有可能完成模型设计时未知的任务。 这种方法类似于其他基础模型的使用方式,例如,CLIP 如何成为 DALL·E 图像生成系统的文本图像对齐组件。作者预计,由提示工程等技术提供支持的可组合系统设计将支持比专门为一组固定任务训练的系统更广泛的应用程序。 从组合的角度比较可提示分割和交互式分割也很有趣:虽然交互式分割模型是为人类用户设计的,但为可提示分割训练的模型也可以组合成更大的算法系统。

2.2 模型:Segment Anything Model

可提示的分割任务和现实世界使用的目标对模型架构施加了约束。具体地说,该模型必须支持灵活的提示,需要分摊实时计算掩码以允许交互式使用,并且必须具有歧义识别能力。作者发现一个简单的设计满足所有三个约束:一个强大的图像编码器计算一个图像嵌入,一个提示编码器嵌入提示,然后这两个信息源被组合在一个轻量级掩码解码器中,预测分割掩码。作者将此模型称为 Segment Anything 模型或 SAM。通过将 SAM 分离成一个图像编码器和一个快速提示编码器/掩码解码器,相同的图像嵌入可以在不同的提示下重复使用(及其成本分摊)。给定一个图像嵌入、提示编码器和掩码解码器在 ~50 毫秒的网络浏览器中根据提示预测掩码。 本文专注于点、框和掩码提示,并且还使用自由格式的文本提示呈现初始结果。为了使 SAM 具有歧义意识, 作者将其设计为预测单个提示的多个掩码,从而使 SAM 能够自然地处理歧义。

图像编码器:在可扩展性和强大的预训练方法的推动下,作者使用 MAE 预训练视觉ViT,最低限度地适应处理高分辨率输入。图像编码器每张图像运行一次,可以在提示模型之前应用。

提示编码器:考虑两组提示:稀疏(点、框、文本)和密集(掩码)。作者通过位置编码和每个提示类型的学习嵌入相加来表示点和框,并使用来自 CLIP 的现成文本编码器来表示自由格式文本。 密集提示(即掩码)使用卷积嵌入,并与图像嵌入逐元素求和。

掩码解码器:掩码解码器有效地将图像嵌入、提示嵌入和输出标记映射到掩码。 该设计受 DETR 和 Maskformer 的启发,采用了 Transformer 解码器块的修改,后跟动态掩码预测头。修改后的解码器块在两个方向(提示图像嵌入和反之亦然)使用提示自注意力和交叉注意力来更新所有嵌入。运行两个块后,我们对图像嵌入进行上采样,MLP 将输出标记映射到动态线性分类器,然后计算每个图像位置的蒙版前景概率。

解决歧义:使用一个输出,如果给定一个具有歧义的提示,模型将平均多个有效掩码。为了解决这个问题,作者修改模型以预测单个提示的多个输出掩码。 实验发现 3 个掩码输出足以解决大多数常见情况(嵌套掩码通常最多三个深度:整体、部分和子部分)。在训练期间,仅反向传播掩码的最小损失。为了对掩模进行排名,该模型预测每个掩模的置信度分数(即估计的 IoU)。

效率:整体模型设计很大程度上受效率驱动。 给定一个预先计算的图像嵌入,提示编码器和掩码解码器在 CPU 上的 Web 浏览器中运行,时间约为 50 毫秒。这种运行时性能使模型能够进行无缝、实时的交互式提示。

损失和训练:我们使用 DETR 中使用的焦点损失和骰子损失的线性组合来监督掩码预测。 我们使用混合的几何提示来训练可提示的分割任务。 我们通过在每个掩码 11 轮中随机抽样提示来模拟交互式设置,从而使 SAM 能够无缝集成到我们的数据引擎中。

2.3 数据集:Segment Anything Dataset

SA-1B,由数据引擎收集的 1100 万张多样化、高分辨率、许可和隐私保护图像和 11亿高质量分割掩码组成。 同时,作者开源了 SA-1B 以帮助未来开发计算机视觉基础模型。注意到,SA-1B 将根据一项有利的许可协议发布,用于某些研究用途并保护研究人员。

图片:从直接与摄影师合作的供应商处获得了一组 1100 万张新图片的许可。 这些图像具有高分辨率(平均 3300×4950 像素),由此产生的数据大小可能会带来可访问性和存储方面的挑战。因此,本文将发布最短边设置为 1500 像素的下采样图像。 即使在下采样之后,我们的图像的分辨率也比许多现有的视觉数据集高得多(例如,COCO 图像约为 480×640 像素)。请注意,当今大多数模型都在低得多的分辨率输入上运行。发布的图像中的面部和车辆牌照已经模糊。

掩码:论文所提出的数据引擎产生了 11亿掩码,其中 99.1% 是全自动生成的。

掩码质量:为了估计掩模质量,作者随机抽取了 500 张图像(~50k 掩模)并要求专业注释者提高这些图像中所有掩模的质量。注释者使用我们的模型和像素精确的“画笔”和“橡皮擦”编辑工具来做到这一点。这个过程产生了一对自动预测和专业校正的掩码。作者计算了每对之间的 IoU,发现 94% 的对具有大于 90% 的 IoU(并且 97% 的对具有大于 75% 的 IoU)。为了进行比较,先前的工作估计注释器间的一致性为 85-91% IoU。 本文的实验通过人类评级证实,相对于各种数据集而言,掩码质量较高,并且在自动掩码上训练SAM几乎与使用数据引擎生成的所有掩码一样好。

3. 实验和效果

作者考虑五个任务,其中四个与用于训练 SAM 的可提示分割任务有很大不同。这些实验在训练期间未见的数据集和任务上评估 SAM(对“零样本迁移”的使用遵循其在 CLIP 中的使用)。数据集可能包括新颖的图像分布,例如水下或以第一视角的图像,这些图像不会出现在 SA-1B 中。

实验首先测试可提示分割的核心目标:从任何提示生成有效的掩码。 本文强调单个前景点提示的挑战性场景,因为它比其他更具体的提示更容易产生歧义。接下来,我们展示了一系列实验,这些实验遍历低、中和高级图像理解,并大致与该领域的历史发展平行。具体来说,提示 SAM:

  1. 执行边缘检测;
  2. 分割所有内容,即对象候选生成;
  3. 分割检测到的对象,即实例分割;
  4. 作为概念验证,以分割来自自由格式文本的对象(根据文本分割)。

这四个任务与 SAM 接受训练并通过提示工程实现的提示分割任务有很大不同。

实施细节:除非另有说明,SAM 使用 MAE 预训练的 ViT-H 图像编码器。SAM 在 SA-1B 上训练,注意该数据集仅包括从数据引擎的最后阶段自动生成的掩码。

3.1 零样本迁移点分割验证

评估从单个前景点分割对象。这个任务是不适定的,因为一个点可以指代多个对象。大多数数据集中的 Ground truth 掩码不会枚举所有可能的掩码,这会使自动度量变得不可靠。 因此,作者用一项人类研究来补充标准的 mIoU 指标(即,预测掩码和真实掩码之间所有 IoU 的平均值),其中注释者将掩码质量从 1(无意义)到 10(像素完美)进行评分。

我们主要与 RITM 进行比较,RITM 是一种强大的交互式分割器,与其他强大的基线相比,它在我们的基准测试中表现最佳。 我们使用了一套新编译的 23 个数据集,这些数据集具有不同的图像分布。下图是对比的实验结果:

SAM 在 23 个数据集中的 16 个上产生了更高的结果,高达 ∼47 IoU。论文还提供了一个“oracle”结果,其中最相关的 SAM 的 3 个掩码是通过将它们与真实注释进行比较来选择的,而不是选择最有信心的掩码。这揭示了歧义对自动评估的影响。 特别是,通过 oracle 执行歧义消解,SAM 在所有数据集上都优于 RITM。

3.2 零样本迁移边缘检测

使用 BSDS500 在边缘检测的经典low-level任务上评估 SAM。我们使用 16×16 的前景点规则网格提示 SAM,从而产生 768 个预测掩码(每个点 3 个)。NMS 删除冗余掩码。然后,使用未阈值掩模概率图的 Sobel 过滤和标准轻量级后处理(包括边缘 NMS)计算边缘图。

定性地,可以观察到即使 SAM 没有接受过边缘检测训练,它也会产生合理的边缘图。 与 ground truth 相比,SAM 预测了更多的边缘,包括 BSDS500 中未注释的敏感边缘。

SAM 自然落后于学习 BSDS500 偏差的最先进方法,即抑制哪些边缘。 尽管如此,与 HED(也在 BSDS500 上训练)等开创性的深度学习方法相比,SAM 表现良好,并且明显优于之前的零样本迁移方法,尽管这已经过时了。

3.3 零样本目标候选生成

目标候选生成在目标检测研究中发挥了重要作用,作为开创性系统的中间步骤。为了生成对象候选,论文运行了一个稍微修改过的自动掩码生成管道版本。数据集使用 LVIS,因为它的大量类别提出了具有挑战性的测试。 SAM与作ViTDet检测器(使用级联 Mask R-CNN ViT-H)实现的强基线进行比较。注意到,这个“基线”对应于向游戏 AR 展示的“检测器伪装成提议生成器”(DMP) 方法,使其成为一个真正苛刻的比较。

在上表中,不出所料地看到使用 ViTDet-H 的检测作为对象候选总体上表现最好。 然而,SAM 在几个指标上表现非常出色。 值得注意的是,它在中型和大型物体以及稀有和常见物体上的表现优于 ViTDet-H。 事实上,SAM 仅在小对象和频繁对象上表现不如 ViTDet-H,而 ViTDet-H 可以轻松学习 LVIS 特定的注释偏差,因为它是在 LVIS 上训练的,与 SAM 不同。 作者还与 SAM 的消除歧义无意识版本(“单挑”)进行了比较,后者在所有 AR 指标上的表现都明显低于 SAM。

3.4 零样本迁移实例分割

转向更高层次的愿景,使用 SAM 作为实例分割器的分割模块。 实现很简单:运行对象检测器(之前使用的 ViTDet)并使用其输出框提示 SAM。 这说明了在更大的系统中编写 SAM。

观察到两个数据集上的差距,其中 SAM 相当接近,但肯定落后于 ViTDet。假设在 COCO 上,mask AP 间隙较大且标注质量相对较低(正如人类研究所证实的那样),ViTDet 学习了 COCO masks 的特定偏差。SAM 作为一种零样本方法,无法利用这些(通常不受欢迎的)偏差。LVIS 数据集具有更高质量的 ground truth,但仍然存在特定的特性(例如,masks 不包含孔,它们是构造简单的多边形)和模态与 amodal masks 的偏差。 同样,SAM 没有接受过学习这些偏差的训练,而 ViTDet 可以利用它们。

3.5 零样本文本引导的掩码生成

考虑一个更高级别的任务:从自由格式文本中分割对象。该实验是 SAM 处理文本提示的能力的概念验证。 虽然在之前的所有实验中都使用了完全相同的 SAM,但对于这个 SAM 的训练过程进行了修改,使其具有文本感知能力,但不需要新的文本注释。 具体来说,对于每个面积大于 100^2 的手动收集掩码,我们提取 CLIP 图像嵌入。 然后,在训练期间,我们使用提取的 CLIP 图像嵌入提示 SAM 作为其第一次交互。这里的关键观察是,因为 CLIP 的图像嵌入经过训练以与其文本嵌入对齐,所以我们可以使用图像嵌入进行训练,但使用文本嵌入进行推理。 也就是说,在推理时,我们通过 CLIP 的文本编码器运行文本,然后将生成的文本嵌入作为 SAM 的提示。

SAM 可以根据简单的文本提示(如“轮子”)和短语(如“海狸齿格栅”)来分割对象。 当 SAM 无法仅从文本提示中选择正确的对象时,一个额外的点通常会修复预测,类似于PhraseClick。

3.5 消融实验

数据引擎阶段、图像编码器缩放和训练数据缩放的消融研究。(左)每个数据引擎阶段都会改进我们的 23 个数据集套件,并且仅使用自动数据进行训练会产生与使用所有三个阶段的数据相似的结果。 (中)用约 10% 的 SA-1B 和完整的 SA-1B 训练的 SAM 具有可比性。默认使用所有 1100 万张图像进行训练,但使用 100 万张图像是一个合理的实际设置。(右)缩放 SAM 的图像编码器显示出有意义但饱和的增益。 然而,在某些设置中可能更喜欢较小的图像编码器。

4. 总结和不足

Segment Anything 项目试图将图像分割提升到基础模型时代,这篇论文试图使这一飞跃成为可能的新任务(可提示分割)、模型(SAM)和数据集(SA-1B)。

限制:虽然 SAM 总体上表现良好,但并不完美。它可能会错过精细的结构,有时会产生不连贯的小组件的幻觉,并且不会像“放大”的计算密集型方法那样清晰地产生边界。一般来说,专用的交互式分割方法在提供许多点时优于 SAM。与这些方法不同,SAM 是为通用性和使用广度而不是高 IoU 交互式分割而设计的。 此外,SAM 可以实时处理提示,但是当使用重型图像编码器时,SAM 的整体性能并不是实时的。 本文中对 text-to-mask 任务的尝试是探索性的,并不完全可靠,尽管可以相信它可以通过更多的努力得到改进。 虽然 SAM 可以执行许多任务,但尚不清楚如何设计实现语义和全景分割的简单提示

未来:预训练模型可以提供新功能,甚至超出训练时的想象(涌现现象)。一个突出的例子是 CLIP如何用作更大系统中的一个组件,例如 DALL·E。本文的目标是使用 SAM 使这种组合变得简单明了,通过要求 SAM 为广泛的分割提示预测有效掩码来实现这一目标。 效果是在 SAM 和其他组件之间创建可靠的接口。 例如,MCC可以轻松地使用 SAM 来分割感兴趣的对象,并实现对未见对象的强泛化,以便从单个 RGB-D 图像进行 3D 重建。在另一个示例中,SAM 可以通过可穿戴设备检测到的注视点进行提示,从而启用新的应用程序。 由于 SAM 能够泛化到第一视角的图像等新领域,这样的系统无需额外培训即可工作。

MPViT : Multi-Path Vision Transformer for Dense Prediction

https://arxiv.org/abs/2112.11010(CVPR2022)

https://github.com/youngwanLEE/MPViT

Introduction

  • 在这项工作中,作者以不同于现有Transformer的视角,探索多尺度path embedding与multi-path结构,提出了Multi-path Vision Transformer(MPViT)
  • 通过使用 overlapping convolutional patch embedding,MPViT同时嵌入相同大小的patch特征。然后,将不同尺度的Token通过多条路径独立地输入Transformer encoders,并对生成的特征进行聚合,从而在同一特征级别上实现精细和粗糙的特征表示。
  • 在特征聚合步骤中,引入了一个global-to-local feature interaction(GLI)过程,该过程将卷积局部特征与Transformer的全局特征连接起来,同时利用了卷积的局部连通性和Transformer的全局上下文。

Vision Transformers for dense predictions.

  • 密集的计算机视觉任务,如目标检测和分割,需要有效的多尺度特征表示,以检测或分类不同大小的物体或区域。Vision Transformer(ViT)构建了一个简单的多阶段结构(即精细到粗糙),用于使用单尺度patch的多尺度表示。然而ViT的变体专注于降低自注意的二次复杂度,较少关注构建有效的多尺度表示。
  • CoaT通过使用一种co-scale机制,同时表示精细和粗糙的特征,允许并行地跨层注意,从而提高了检测性能。然而,co-scale机制需要大量的计算和内存开销,因为它为基础模型增加了额外的跨层关注(例如,CoaT-Lite)。因此,对于ViT体系结构的多尺度特征表示仍有改进的空间。

Comparison to Concurrent work.

  • CrossViT利用了不同的patch大小和单级结构中的双路径,如ViT和XCiT。然而,CrossViT的分支之间的相互作用只通过[CLS]token发生,而MPViT允许所有不同规模的patch相互作用。此外,与CrossViT(仅限分类)不同的是,MPViT更普遍地探索更大的路径维度(例如,超过两个维度),并采用多阶段结构进行密集预测。

Method

Conv-stem

输入图像大小为:H×W×3,两层卷积:采用两个3×3的卷积,通道分别为C2/2,C2,stride为2,生成特征的大小为H/4×W/4×C2,其中C2为stage 2的通道大小。

  • 说明:每个卷积之后都是Batch Normalization 和一个Hardswish激活函数。
  • In LeViT , a convolutional stem block shows better low-level representation (i.e., without losing salient information) than non-overlapping patch embedding.

从stage 2到stage 5,作者在每个阶段对所提出的Multi-scale Patch Embedding(MS-PatchEmbed)和Multi-path Transformer(MP-Transformer)块进行堆叠

Multi-Scale Patch Embedding

通过改变stride和padding来调整token的序列长度。也就是说,可以输出具有不同patch大小的相同大小(即分辨率)的特征。因此,作者并行地形成了几个具有不同卷积核大小的卷积patch embedding层。例如,如图1所示,可以生成相同序列长度的不同大小的vision token,patch大小分别为3×3,5×5,7×7。

由于具有相同通道和滤波器大小的连续卷积操作扩大了接受域,并且需要更少的参数,在实践中选择了连续的3×3卷积层。为了减少参数量,在实践中选择了两个连续的3×3卷积层代替5×5卷积。对于triple-path结构,使用三个连续的3×3卷积,通道大小为C’,padding为1,步幅为s,其中s在降低空间分辨率时为2,否则为1。

  • 说明:为了减少模型参数和计算开销,采用3×3深度可分离卷积,包括3×3深度卷积和1×1点卷积。
  • 每个卷积之后都是Batch Normalization 和一个Hardswish激活函数。

接着,不同大小的token embedding features 分别输入到transformer encoder中。

Multi-path Transformer

原因:Transformer中的self-attention可以捕获长期依赖关系(即全局上下文),但它很可能会忽略每个patch中的结构性信息和局部关系。相反,cnn可以利用平移不变性中的局部连通性,使得CNN在对视觉对象进行分类时,对纹理有更强的依赖性,而不是形状。

因此,MPViT以一种互补的方式将CNN与Transformer结合起来。

  • 为了表示局部特征 
  • 采用了一个 depthwise residual bottleneck block,包括1×1卷积、3×3深度卷积和1×1卷积和残差连接。
  • 为了减轻多路径结构的计算负担,使用了CoaT中提出的有效的因素分解自注意:

Global-to-Local Feature Interaction

将局部特征和全局特征聚合起来:

为了保持可比性的参数和FLOPs,增加路径的数量需要减少通道C或层数L(即,transformer encoder的数量)。作者通过减少C而不是L,从单路径(即CoaT-Lite baseline)扩展到triple-path。在消融研究中,验证了减少C比减少L获得更好的性能(见表5)。由于stage2的特征分辨率较高,导致计算成本较高,作者在stage2中将triple-path模型的路径数设置为2。从stage3开始,三路径模型有3条路径。

作者还发现,虽然 triple-path和双路径在ImageNet分类中产生相似的精度,但 triple-path模型在密集预测任务中表现出更好的性能。因此,建立了基于 triple-path结构的MPViT模型。MPViT的详细情况见表1。

Experiments

Ablation study

对MPViT-XS的每个组件进行消融研究,以研究提出的多路径结构对图像分类和使用Mask R-CNN检测的有效性。

Exploring path dimension.

Cityscapes数据集

官网:https://www.cityscapes-dataset.com/

这个大型数据集包含了来自50个不同城市的街景场景中记录的多样化的双目视频序列,除了20000个弱注释帧以外,还有5000帧的高质量像素级注释。

主要参考如下:

下载前3个文件即可。其中3文件代表训练使用的原图,1文件代表精细标注label,2文件代表非精细标注label。有的同学要问了,那我下载1、3不就行了吗?我要这2有何用?其实Cityscapes数据集提供了34种分类,但有时我们不需要那么多,比如仅需要19分类(默认的)或任意多个分类,进行图像语意分割的神经网络训练,我们就需要用到他Cityscapes提供的自带工具进行label的转换,若缺少2文件,转换代码会报错无法进行。

该数据集由gtFine和leftImg8bit这两个目录组成,结构如下所示,其中aachen等表示拍摄场景的城市名:

├── gtFine
│   ├── train
│   │   ├── aachen
│   │   ├── bochum
│   │   └── bremen
│   └── val
│       └── frankfurt
└── leftImg8bit
    ├── train
    │   ├── aachen
    │   ├── bochum
    │   └── bremen
    └── val
        └── frankfurt

   原图存放在leftImg8bit文件夹中,精细标注的数据存放在gtFine (gt : ground truth) 文件夹中 。其中训练集共2975张(train),验证集500张(val),都是有相应的标签的。但测试集(test)只给了原图,没有给标签,官方用于线上评估大家提交的代码(防止有人用test集训练刷指标)。因此,实际使用中可以用validation集做test使用。

   标签文件中每张图像对应4个文件,其中_gtFine_polygons.json存储的是各个类和相应的区域(用多边形顶点的位置表示区域的边界);_gtFine_labelIds.png的值是0-33,不同的值代表不同的类,值和类的对应关系在代码中cityscapesscripts/helpers/labels.py中定义;_gtFine_instaceIds.png是示例分割的; _gtFine_color.png是给大家可视化的,不同颜色与类别的对应关系也在labels.py文件中说明。

可以使用Cityscapes的coarse标签做初步训练然后再用精细标签训练

这个数据集包含语义分割,实例分割,深度估计等标签数据,对应的训练标签如下所示:

cd $CITYSCAPES_ROOT
# 训练和校准对应的数据集
ls leftImg8bit/train/*/*.png > trainImages.txt
ls leftImg8bit/val/*/*.png > valImages.txt

# 训练和校准标签对应的数据集
ls gtFine/train/*/*labelIds.png > trainLabels.txt
ls gtFine/val/*/*labelIds.png.png > valLabels.txt

# 训练和校准实例标签对应的数据集
ls gtFine/train/*/*instanceIds.png > trainInstances.txt
ls gtFine/val/*/*instanceIds.png.png > valInstances.txt

# 训练和校准深度标签对应的数据集
ls disparity/train/*/*.png > trainDepth.txt
ls disparity/val/*/*.png.png > valDepth.txt

另外,torchvision支持很多现成数据集:

Class Definitions:

cityscapesscripts 脚本工具:

cityscapes scripts公开以下工具:

  • csDownload: 命令行下载cityscapes包
  • csViewer: 查看图像并覆盖批注(overlay the annotations)。
  • csLabelTool: 标注工具.
  • csEvalPixelLevelSemanticLabeling: Evaluate pixel-level semantic labeling results on the validation set. This tool is also used to evaluate the results on the test set.像素级评估
  • csEvalInstanceLevelSemanticLabeling: Evaluate instance-level semantic labeling results on the validation set. This tool is also used to evaluate the results on the test set.实例级评估
  • csEvalPanopticSemanticLabeling: Evaluate panoptic segmentation results on the validation set. This tool is also used to evaluate the results on the test set.全景分割评估
  • csCreateTrainIdLabelImgs: Convert annotations in polygonal format to png images with label IDs, where pixels encode “train IDs” that you can define in labels.py.将多边形格式的注释转换为带标签ID的png图像,其中像素编码“序列ID”,可以在labels.py中定义。
  • csCreateTrainIdInstanceImgs: Convert annotations in polygonal format to png images with instance IDs, where pixels encode instance IDs composed of “train IDs”.将多边形格式的注释转换为具有实例ID的png图像,其中像素对由“序列ID”组成的实例ID进行编码。
  • csCreatePanopticImgs: Convert annotations in standard png format to COCO panoptic segmentation format.将标准png格式的注释转换为COCO全景分割格式。

cityscapes scripts文件夹

文件夹内容如下:

  • helpers: 被其他脚本文件调用的帮助文件
  • viewer: 用于查看图像和标注的脚本
  • preparation: 用于将GroundTruth注释转换为适合您的方法的格式的脚本
  • evaluation: 评价你的方法的脚本
  • annotation: 被用来标注数据集的标注工具
  • download: 下载Cityscapes packages

请注意,所有文件顶部都有一个小型documentation。 非常重要

  • helpers/labels.py: 定义所有语义类ID的中心文件,并提供各种类属性之间的映射。
  • helpers/labels_cityPersons.py: 文件定义所有CityPersons行人类的ID并提供各种类属性之间的映射。
  • viewer/cityscapesViewer.py 查看图像并覆盖注释。
  • preparation/createTrainIdLabelImgs.py 将多边形格式的注释转换为带有标签ID的png图像,其中像素编码可以在“labels.py”中定义的“训练ID”。
  • preparation/createTrainIdInstanceImgs.py 将多边形格式的注释转换为带有实例ID的png图像,其中像素编码由“train ID”组成的实例ID。
  • evaluation/evalPixelLevelSemanticLabeling.py 该脚本来评估验证集上的像素级语义标签结果。该脚本还用于评估测试集的结果。
  • evaluation/evalInstanceLevelSemanticLabeling.py 该脚本来评估验证集上的实例级语义标签结果。该脚本还用于评估测试集的结果。
  • setup.py 运行 setup.py build_ext --inplace 启用cython插件以进行更快速的评估。仅针对Ubuntu进行了测试。

CLIPSeg:一个使用文本和图像prompt能同时作三个分割任务的模型

Image Segmentation Using Text and Image Prompts (CVPR 2022).

论文地址:https://arxiv.org/abs/2112.10003

代码地址:https://github.com/timojl/clipseg

图像分割通常是通过为一组固定的对象类训练模型来解决的。之后合并其他类或更复杂的查询是昂贵的,因为它需要在包含这些表达式的数据集上重新训练模型。在本文中,作者提出了一个可以在测试时根据任意prompt生成图像分割的系统。prompt可以是文本或图像。这种方法使模型能够为三个常见的分割任务创建一个统一的模型(只训练一次),这些任务具有不同的挑战:引用表达式分割、zero-shot分割和one-shot分割。本文以 CLIP 模型为骨干,使用基于Transformer的解码器进行扩展,以实现密集预测。在对 PhraseCut 数据集的扩展版本进行训练后,本文的系统会根据自由文本prompt或表达查询的附加图像为图像生成二进制分割图。这种新颖的混合输入不仅可以动态适应上述三个分割任务,还可以适应任何可以制定文本或图像查询的二进制分割任务。最后,作者发现本文的系统能够很好地适应通用查询。

图像分割需要一个模型来输出每个像素的预测。与图像分类相比,分割不仅需要预测可以看到的内容,还需要预测可以找到的位置。经典语义分割模型仅限于分割训练集中的类别。目前,已经出现了不同的方法来扩展这种相当受限的设置:

1)在广义的zero-shot分割中,需要通过将未见类别与已见类别相关联来分割已见和未见类别。

2)在one-shot分割中,除了要分割的查询图像之外,还以图像的形式提供所需的类。

3)在引用表达式分割(RES)中,模型在复杂的文本查询上进行训练,但在训练期间可以看到所有类(即没有对未见过的类进行泛化)。

在这项工作中,作者引入了 CLIPSeg 模型(如上图),该模型能够基于任意文本查询或图像进行分割。 CLIPSeg 可以解决上述所有三个任务。这种多模态输入格式超越了现有的多任务基准,例如 Visual Decathlon,其中输入始终以图像的形式提供。为了实现这个系统,作者使用预训练的 CLIP 模型作为主干,并在顶部训练一个轻量的条件分割层(解码器)。作者使用CLIP 的联合文本-视觉嵌入空间来调节本文的模型,这使模型能够处理文本形式的prompt以及图像。本文的想法是教解码器将 CLIP 内的激活与输出分割相关联,同时允许尽可能少的数据集偏差并保持 CLIP 的出色和广泛的预测能力。

本文采用通用的二进制预测设置,其中与prompt匹配的前景必须与背景区分开来。这种二进制设置可以适应Pascal zero-shot分割所需的多标签预测。虽然本文工作的重点是建设一个通用模型,作者发现 CLIPSeg 在三个low-shot分割任务中实现了竞争性能。此外,它能够泛化到它从未见过分割的类和表达式。

本文的主要技术贡献是 CLIPSeg 模型,它通过提出一种基于Transformer的轻量级解码器,扩展了著名的 CLIP Transformer用于zero-shot和one-shot分割任务。该模型的一个关键新颖之处在于分割目标可以通过不同的方式指定:通过文本或图像。这使模型能够为多个基准训练一个统一的模型。对于基于文本的查询,与在 PhraseCut 上训练的网络不同,本文的模型能够泛化到涉及看不见的单词的新查询。对于基于图像的查询,作者探索了各种形式的视觉prompt 工程——类似于语言建模中的文本prompt 工程。

方法

作者使用基于视觉Transformer的 (ViT-B/16) CLIP模型作为主干,并使用小型、参数高效的Transformer解码器对其进行扩展。解码器在自定义数据集上进行训练以执行分割,而 CLIP 编码器保持冻结状态。一个关键的挑战是避免在分割训练期间对预测施加强烈的bias并保持 CLIP 的多功能性。

考虑到这些需求,作者提出了 CLIPSeg:一个简单的、纯基于Transformer的解码器。当查询图像通过 CLIP 视觉Transformer时,某些层 S 的激活被读取并投影到解码器的token嵌入大小 D。然后,这些提取的激活(包括 CLS  token)在每个Transformer之前添加到解码器的内部激活中。

解码器具有与提取的 CLIP 激活一样多的Transformer块。解码器通过在其Transformer(最后一层) 的token上应用线性投影来生成二进制分割,其中 P 是 CLIP 的patch大小。为了告知解码器分割目标,作者使用 FiLM通过条件向量调制解码器的输入激活。

这个条件向量可以通过两种方式获得:(1) 使用文本查询的 CLIP 文本Transformer嵌入和 (2) 在特征工程prompt图像上使用 CLIP 视觉Transformer。CLIP 本身没有经过训练,仅用作冻结特征提取器。由于紧凑的解码器,对于 D = 64,CLIPSeg 只有 1,122,305 个可训练参数。

由于学习到的位置嵌入,原始 CLIP 被限制为固定的图像大小。本文通过插入位置嵌入来启用不同的图像大小(包括更大的图像)。为了验证这种方法的可行性,作者比较了不同图像尺寸的预测质量,发现对于大于 350 像素的图像,ViT-B/16 的性能只会降低。

在本文的实验中,作者使用 CLIP ViT-B/16,patch大小 P 为 16,如果没有另外说明,则使用 D = 64 的投影尺寸。作者在 S = [3 , 7 , 9] 层提取 CLIP 激活,因此本文的解码器只有三层。

模型通过条件向量接收有关分割目标的信息(“要分割什么?”),这可以通过文本或图像(通过视觉prompt工程)提供。由于 CLIP 为图像和文本标题使用共享嵌入空间,可以在嵌入空间和插值向量上的条件之间进行插值。形式上,设是支持图像的嵌入,是样本 i 的文本嵌入,作者通过线性插值获得条件向量 ,其中 a 是从[0 , 1]均匀采样 。作者在训练期间使用这种随机插值作为数据增强策略。

1 PhraseCut + Visual prompts (PC+)

本文使用 PhraseCut 数据集,其中包含超过 340,000 个具有相应图像分割的短语。最初,该数据集不包含视觉支持,而仅包含短语,并且每个短语都存在相应的对象。作者以两种方式扩展这个数据集:视觉支持样本和负样本。为了为prompt p 添加视觉支持图像,作者从共享prompt p 的所有样本的集合Sp中随机抽取。

此外,作者将负样本引入数据集,即没有对象与prompt匹配的样本。为此,样本的短语被替换为概率为qneg的不同短语。短语使用一组固定前缀随机扩充。在考虑到对象位置的情况下,作者在图像上应用随机裁剪,确保对象至少部分可见。在本文的其余部分,将此扩展数据集称为 PhraseCut+(缩写为 PC+)。与仅使用文本来指定目标的原始 PhraseCut 数据集相比,PC+ 支持使用图像-文本插值进行训练。这样,本文可以训练一个对文本和视觉输入进行操作的联合模型。

2 Visual Prompt Engineering

在传统的基于 CNN 的one-shot语义分割中,masked pooling 已成为计算用于条件的原型向量的标准技术。提供的支持mask被下采样并与来自 CNN 沿空间维度的后期特征图相乘,然后沿空间维度汇集。这样,只有与支持对象有关的特征才被考虑在原型向量中。

这种方法不能直接应用于基于Transformer的架构,因为语义信息也在整个层次结构中的 CLS  token中积累,而不仅仅是在特征图中。绕过 CLS  token并直接从特征图的masked pooling中导出条件向量也是不可能的,因为它会破坏文本嵌入和 CLIP 视觉嵌入之间的兼容性。

为了更多地了解如何将目标信息整合到 CLIP 中,作者在一个没有分割的简单实验中比较了几个变体及其混杂效应。作者考虑视觉和基于文本的嵌入之间的余弦距离(对齐),并使用原始 CLIP 权重而无需任何额外的训练。


具体来说,作者使用 CLIP 来计算对应于图像中对象名称的文本嵌入ti。然后,将它们与原始图像的视觉嵌入s0和使用修改后的 RGB 图像或注意力mask突出显示目标对象的视觉嵌入sh进行比较。通过对对齐向量[sht0,sht1,…]进行softmax,获得了如上图所示的分布。

对于定量分数,作者只考虑目标对象名称嵌入t0,希望它与突出显示的图像嵌入sh比与原始图像嵌入s0具有更强的对齐。这意味着,如果突出显示技术改进了对齐方式,则对象概率的增加应该很大。作者基于LVIS 数据集进行分析,因为它的图像包含多个对象和一组丰富的类别。

CLIP-Based Masking


直接等效于视觉Transformer中的masked pooling是将mask应用于token。通常,视觉Transformer由一组固定的token组成,这些token可以通过多头注意力在每一层进行交互:用于读取的 CLS  token和最初从图像patch中获得的与图像区域相关的token。

现在,可以通过将一个或多个Transformer层的交互约束到mask内patch token以及仅 CLS  token来合并mask。上表(左)表明这种引入mask的形式效果不佳。通过限制与 CLS token的交互(上表 左,顶部两行),仅实现了小的改进,而限制所有交互会显着降低性能。由此得出结论,在内部结合图像和mask需要更复杂的策略。

Visual Prompt Engineering

除了在模型中应用mask,还可以将mask和图像组合成一个新图像,然后由视觉Transformer处理。类似于 NLP 中的prompt工程(例如在 GPT-3 中),作者将此过程称为视觉prompt工程。由于这种形式的prompt设计是新颖的,并且在这种情况下表现最好的策略是未知的,作者对设计视觉prompt的不同变体进行了广泛的评估。

发现mask和图像如何组合的确切形式非常重要。作者确定了三种图像操作来改善对象文本prompt和图像之间的对齐:降低背景亮度、模糊背景(使用高斯滤波器)和裁剪到对象。所有三者的组合表现最好。因此在其余部分,将使用这个变体。

实验


上表展示了在原始 PhraseCut 数据集上评估referring expression segmentation(RES)的性能对比。

在广义zero-shot分割中,测试图像除了包含已知类别外,还包含以前从未见过的类别。作者使用 Pascal-VOC 基准评估模型的zero-shot分割性能,性能如上表。

在 Pascal-5i 上,本文的通用模型 CLIPSeg (PC+) 在最先进的方法中实现了具有竞争力的性能,只有最近的 HSNet 表现更好。COCO-20i 上的结果表明 CLIPSeg 在除 PhraseCut(+) 之外的其他数据集上训练时也能很好地工作。

上图展示了CLIPSeg(PC+)对各种prompt的定性预测,深色表示预测强度。

从上表中,可以发现在 PC+ 上训练的 CLIPSeg 版本的性能优于 CLIP-Deconv baseline和在 L VIS 上训练的版本,后者仅包含对象标签而不是复杂的短语。这一结果表明,数据集的可变性和模型的复杂性都是泛化所必需的。

为了确定 CLIPSeg 性能的关键因素,作者对 PhraseCut 进行了消融研究。,如上表所示,作者分别评估基于文本和基于视觉prompt的性能以获得完整的图片。当使用随机权重而不是 CLIP 权重时(“无 CLIP 预训练”),基于文本的性能和视觉性能都会下降。当参数数量减少到 16 个(“D = 16”)时,性能大幅下降,这表明解码器中信息处理的重要性。使用不利的视觉prompt技术会降低视觉输入的性能。

SegFix: Model-Agnostic Boundary Refinement for Segmentation

paper:https://arxiv.org/abs/2007.04269

code:https://github.com/openseg-group/openseg.pytorch

本文提出了一种模型无关的后处理方案,即用内部像素的预测代替原来不可靠的边界像素预测,以提高由任何现有分割模型生成的分割结果的边界质量。该方法仅对输入图像进行两步处理:(i)定位边界像素;(ii)识别每个边界像素对应的内部像素(通过学习从边界像素到内部像素的方向来建立对应关系)。

该方法不需要先验信息的分割模型,达到接近实时的速度。实验验证,SegFix减少了cityspace数据集中各种先进模型(ADE20K和GTA5)所生成的分割结果的边界误差。

动机:现有的分割模型大多不能很好地处理边界上的误差预测。作者对比了三个模型的直方图误差,如图1(错误像素数到物体边缘的距离的统计)可以看到,距离边界越远的像素越有可能被很好地分类,并且有很多误差分布在沿边界约为5像素的范围内。

图1

提出了一种新方法来学习边界像素和内部像素的对应关系,即提出了一种新的模型无关的后处理方法来减少边缘误差,即用对应的内部像素的标签代替边缘像素的标签。使用边界映射和方向映射隐式编码边界像素的相对距离信息,偏移映射可以直接应用于各种方法,而不需要进行任何再训练。

主要包括2步:第一步是定位边界像素,第二步是找出每一个边界像素所关联的内部像素。我们采用一个向量去表示每个边界像素跟其对应内部像素的对应关系,这个向量从边界像素出发,指向一个内部像素。

1)首先要先确定物体边界:用卷积来预测一个binary mask来表示边界。1表示边界,0表示other
2)学习一个从边界pixel到内(外)部pixel的方向
3)让边界pixel沿着这个方向移动特定的距离即可确定该边界pixel。

训练阶段,我们首先将图像输入到主干网络中来预测特征图,然后应用边界分支预测二值边界图和应用方向分支预测方向图,我们将边界损失和方向损失分别应用到预测的边界图和方向图上。在测试阶段,我们首先将模型执行到图像上,以生成偏移量映射,然后根据偏移量图对现有方法的分割结果进行细化。

 边缘预测分支

边界分支实现为1×1conv→BN→ReLU,输出通道256个。然后我们应用线性分类器和上采样预测,生成最终的边界图B;训练时由真值boundary map监督约束,使用二值交叉熵损失作为边界损失,学习良好的边缘检测。

 方向预测分支

边界分支实现为1×1conv→BN→ReLU,输出通道256个。然后我们应用线性分类器和上采样预测,生成最终的方向图D;预测所有位置的像素与之最近的同类像素的方向,这里的方向不是连续的,而是对[0,2π)量化成m个值后的结果;

训练时使用真值direction map监督该分支生成的离散方向,使用多分类交叉熵损失(standard category-wise cross-entropy loss)来作为方向预测损失。

offset branch

用来转换预测得到的D(已经乘过了B )到坐标偏移图offset_map:不同的方向会被映射到不同的坐标偏移值。重新对现有方法在边界区域的预测结果进行调整。

最终通过坐标映射(the grid-sample scheme [Spatial transformer networks]),重新对现有方法在边界区域的预测结果进行调整。基于偏移映射对粗略标记图进行细化。用不同的箭头表示不同的偏移向量。在粗略标签图中红色标记错误位置,在精确标签图中箭头方向标记相应的修正位置。

  真值生成和分析

先从ground-truth分割图生成distance map,再在此基础上生成boundary map和direction map,过程如图3(b)。

(1)    distance map

对于每个像素而言,distance map上都记录了它相距属于其他类别像素的最小欧式距离。这实际上也表示了像素到边界的距离。

首先将真值mask分解成K个binary map (0 or 1),每个map关联着不同的类别(语义类别、实例类别),K表示图像中包含的类别数量。之后在每个binary map上独立计算distance map,这里使用了scipy的函数scipy.ndimage.morphology.distance_transform_edt() 。这个函数用于距离转换,计算图像中非零点到最近背景点(即0)的距离。它被用在每个类别独立的binary mask上,正好计算的就是相距于其他类别(每个binary mask上的0表示的就是“其他类别”)的最小欧氏距离。

计算完各个mask后,再计算一个融合的distance map来实现对于所有的K个distance map的集成。

(2)    boundary map

使用融合后的distance map,对其使用一个预设的阈值进行划分,小于阈值的作为边界区域的像素,大于阈值的认为在特定目标区域内部。因为距离值越小,说明越接近边界。

(3)    direction map

这里在未合并的K层distance map上,分别使用9×9的Sobel滤波器。基于Sobel滤波器的方向是在[0°,360°)内,并且每个像素位置的方向都指向邻域内部距离目标边界最远的像素。整个方向范围被均匀划分成m=8类,然后每个像素的方向被赋值成对应的方向类别

  实验结果

backboneHRNet、DeepLab V3等。

数据集:Cityscapes and GTA5

参数设置:初始学习率为0.04,权值衰减为0.0005,裁剪大小为512×512,批量大小为16,并训练80K次迭代。0.9的“poly”学习率策略。

数据增强:随机水平翻转、随机裁剪和随机亮度抖动。

评价指标:mask F-score and top-1 direction accuracy 对预测的二值边界图进行mask F-score,对预测的方向图进行方向精度评定。

定量评价:用mIoU分类度量区域分割的整体性能边界;F-score用于测量距离上有小松弛的预测掩模的边界质量。

语义分割任务
实例分割任务

DenseCLIP:CVPR2022 用文本指导图像分割

代码链接:https://github.com/raoyongming/DenseCLIP

论文链接:https://arxiv.org/abs/2112.01518

最近的研究表明,使用对比图像文本对进行大规模的预训练可能是从自然语言监督中学习高质量视觉表示的有前途的方法。得益于更广泛的监督来源,这一新范式在下游分类任务和可迁移性方面展现出了不错的结果。

然而,将从图像-文本对中学习到的知识转移到更复杂的密集预测任务的问题几乎没有被研究在这项工作中,作者通过隐式和显式地利用CLIP的预训练的知识,提出了一个新的密集预测框架。

具体而言,作者将CLIP中的原始图像-文本匹配问题 转换为像素-文本匹配问题 ,并使用像素-文本得分图来指导密集预测模型的学习。通过进一步使用来自图像的上下文信息来提示语言模型,能够促进模型更好地利用预训练的知识。

本文的方法与模型无关,可以应用于任意密集预测模型和各种预训练的视觉主干,包括CLIP模型和ImageNet预训练的模型。广泛的实验证明了本文的方法在语义分割,目标检测和实例分割任务上的卓越性能。

在本文中,作者研究了如何将预训练的CLIP模型迁移到密集的预测任务 。与传统的ImageNet预训练模型相比,一个明显的挑战是上游对比预训练任务和下游像素预测任务之间的差距,前者涉及图像和文本的实例级表示,而后者仅基于像素级别的视觉信息。

为了解决这个问题,作者提出了一个新的语言指导的密集预测框架,名为DenseCLIP

如上图所示,它是通过隐式和显式地利用来自CLIP模型的预训练的知识而为各种密集预测任务而设计的。利用预训练的知识的一种隐式方法是直接微调下游数据集上的模型。结果表明,通过对超参数进行一些修改,CLIP模型可以优于传统的ImageNet预训练模型(如下图所示)。

但是直接的方法不能充分利用CLIP模型的潜力。受CLIP中的原始对比学习框架的启发,作者提出将CLIP中的原始图像-文本匹配问题转换为像素-文本匹配问题,并使用像素-文本得分图来明确地指导密集预测模型的学习

通过进一步使用图像中的上下文信息,使用Transformer模块来提示语言模型,能够通过优化文本嵌入,使模型更好地利用预训练的知识。

Preliminaries: Overview of CLIP

CLIP由两个编码器组成,包括一个图像编码器 (ResNet或ViT) 和一个文本编码器 (Transformer)。CLIP的目标是通过对比目标在预训练期间对齐视觉和语言的嵌入空间。

为了学习更多可迁移的预训练知识,CLIP收集4亿图像-文本对进行模型训练。迁移CLIP的知识,对于下游分类任务,一种简单但有效的方法是基于模板(如“a photo of a [CLS]”)构建一组文本提示,其中[CLS]可以替换为实际的类名。

然后给定一个图像,可以使用CLIP来计算图像和嵌入空间中的文本提示之间的相似性,并且得分最高的类被视为最终预测。最近,一些作品已经表明CLIP可以通过很少的样本获得强大的分类性能。因此,这就出现了一个有趣的问题: CLIP强大的能力是否可以迁移到像密集预测这样更复杂的视觉任务中?

但是,这种扩展是不容易的。首先,如何在密集预测任务中利用视觉语言预训练模型是一个几乎没有被研究的问题。尽管一种简单的解决方案是仅像预训练的2D主干一样使用图像编码器,但作者认为文本编码器中包含的语言先验也非常重要

其次,由于上游对比预训练任务与下游每像素预测任务之间存在巨大差距,因此将知识从CLIP转移到密集预测更加困难 ,前者考虑图像和文本的实例级表示,后者仅基于视觉信息,但需要像素级输出。

Language-Guided Dense Prediction

为了解决上述问题,作者提出了本文的语言指导的密集预测框架,该框架可以更好地利用CLIP预训练模型中的语言先验。本文的模型结构如上图所示。作者发现,除了全局图像特征之外,还可以从CLIP图像编码器的最后一层中提取语言兼容的特征图。

为了说明这一点,下面首先详细描述CLIP图像编码器的结构。以ResNet 编码器为例,总共有4个阶段,将特征图表示为。与原始的ResNet不同,CLIP添加了一个注意力池化层。

具体而言,CLIP首先对执行全局平均池化,以获得全局特征 ,其中是从主干网络第4阶段开始的特征图的高度,宽度和通道数。然后将concat的特征输入到多头自注意层(MHSA) 中:

在CLIP的标准训练过程中,全局特征用作图像编码器的输出,而其他输出通常被忽略。然而,作者发现z有两个有趣的特性:

1)z仍然保留了足够的空间信息,因此可以用作特征图

2)因为MHSA对每个输入元素都是对称的,所以z可能和 相似 。根据以上观察结果,作者可以将z用作语言兼容的特征图。

为了获得文本特征,可以从模板“a photo of a [CLS].”中构造文本提示使用K类名称,并使用CLIP文本编码器将特征提取。然后,使用语言兼容的特征图z和文本特征t通过以下方式计算像素文本得分图

其中和是沿通道维度的z和t的l2归一化版本。得分图表示了像素文本匹配的结果,这是本文框架中最关键的要素之一。首先,可以将分数图视为具有较低分辨率的分割结果,因此可以使用它们来计算辅助分割损失。

其次,将分数映射concat到最后一个特征映射,以显式地合并语言先验,即。本文的框架是与模型无关的,因为修改的特征图可以像往常一样直接用于分割或检测。

Context-Aware Prompting

先前的研究已经证明,减少视觉或语言领域的差距可以显着提高CLIP模型在下游任务中的性能。因此,作者寻求其他方法来改进文本特征t,而不是使用人类预先定义的模板。

Language-domain prompting

与原始CLIP不同,原始CLIP使用人工设计的模板,如“a photo of a [CLS]”。CoOp引入了可学习的文本上下文,通过使用反向传播直接优化上下文,在下游任务中实现更好的可迁移性。受CoOp的启发,作者还在框架中使用可学习的文本上下文作为baseline,其中仅包括语言域提示。文本编码器的输入变为:

其中是可学习的文本上下文,而是第k类名称的嵌入。

Vision-to-language prompting

包括视觉上下文的描述可以使文本更加准确。例如,“a photo of a cat in the grass.”比“a photo of a cat.”更准确。因此,作者研究了如何使用视觉上下文来重新提取文本特征。通常可以使用Transformer decoder中的交叉注意机制来建模视觉和语言之间的相互作用。

作者提出了两种不同的上下文感知提示策略,如上图所示。作者考虑的第一个策略是pre-model prompting 。将特征传递给Transformer解码器以编码视觉上下文

其中是一组可学习的查询,而是提取的视觉上下文。

另一种选择是在文本编码器之后重新定义文本特征,即post-model prompting 。在此变体中,作者使用CoOp生成文本特征,并直接将其用作Transformer解码器的查询

尽管这两个变体的目标是相同的,但作者认为post-model prompting更好 ,主要有两个原因:

1)模型后提示是高效的。由于文本编码器的输入依赖于图像,因此在推理过程中,预模型提示需要额外的文本编码器前向传递。在后模型提示的情况下,可以存储训练后提取的文本特征,从而减少文本编码器在推理过程中带来的开销。

2) 实验结果表明,模型后提示可以比模型前提示获得更好的性能。

基于扩散模型的语义分割

论文标题:LABEL-EFFICIENT SEMANTIC SEGMENTATION WITH DIFFUSION MODELS

论文地址:https://arxiv.org/pdf/2112.03126.pdf

论文代码:https://github.com/yandex-research/ddpm-segmentation

摘要

  1. 背景介绍: 去噪扩散概率模型DDPM最近受到了很多研究关注,因为它们优于其他方法,如GAN,并且目前提供了最先进的生成性能。差分融合模型的优异性能使其在修复、超分辨率和语义编辑等应用中成为一个很有吸引力的工具。
  2. 研究方法: 作者为了证明扩散模型也可以作为语义分割的工具,特别是在标记数据稀缺的情况下。对于几个预先训练的扩散模型,作者研究了网络中执行逆扩散过程马尔可夫步骤的中间激活。结果表明这些激活有效地从输入图像中捕获语义信息,并且似乎是分割问题的出色像素级表示。基于这些观察结果,作者描述了一种简单的分割方法,即使只提供了少量的训练图像也可以使用。
  3. 实验结果: 提出的算法在多个数据集上显着优于现有的替代方法。

Mask Scoring RCNN

论文: https://arxiv.org/abs/1903.00241 CVPR2019

code: https://github.com/zjhuang22/maskscoring_rcnn

这篇论文从实例分割中mask 的分割质量角度出发,提出过去的经典分割框架存在的一个缺陷:用Bbox bounding box的classification confidence作为mask score,导致mask score和mask quality不配准。因此文章基于Mask R-CNN提出一个新的框架Mask Scoring R-CNN,能自动学习出mask quality,试图解决不配准的问题。

摘要

让一个深度网络意识到自己预测的质量是一个有趣但重要的问题。在实例分割任务中,大多数实例分割框架使用实例分类的置信度作为mask质量分数。然而,将mask质量量化为实例mask与其ground truth之间的IoU,通常与分类分数的相关性并不好。

在本文中,我们提出Mask Scoring R-CNN来学习预测实例mask的质量。提出的网络块将实例特征和相应的预测mask结合起来回归mask IoU。Mask评分策略校准mask质量和mask评分之间的偏差,并通过在COCO AP评估期间优先处理更准确的mask预测来改进实例分割性能。

通过对COCO数据集的广泛评估,Mask Scoring R-CNN与不同的模型带来一致和显着的增益,并优于Mask RCNN。

总而言之,这项工作的主要贡献突出如下:

1. 提出Mask Scoring R-CNN,这是第一个解决实例分割假设得分问题的框架。它探索了改善实例分割模型性能的新方向。通过考虑实例mask的完整性,如果实例mask的得分较高而mask不够好,则可以对实例mask的分数进行惩罚。

2. MaskIoU head非常简单有效。能够在各个backbone上涨点。

正文:

在实例分割(instance segmentation)中,比如Mask R-CNN,mask 分支的分割质量(quality)来源于检测分支的classification confidence。Mask R-CNN其实Faster R-CNN系列的延伸,其在Faster R-CNN的基础上添加一个新的分支用来预测object mask,该分支以检测分支的输出作为输入,mask的质量一定程度上依赖于检测分支。这种简单粗暴的做法取得了SOTA的性能,近年来COCO比赛的冠军或者前几名基本是Mask R-CNN及其变体,但依然有上升的空间。

更仔细的来讲,Mask R-CNN存在的问题是:bounding box的classification confidence不能代表mask的分割质量。classification confidence高可以表示检测框的置信度高(严格来讲不能表示框的定位精准),但也会存在mask分割的质量差的情况。高的分类置信度也应该同时有好的mask 结果。

回到原始的初衷,文章希望得到精准的mask质量,那么如何评价输出的mask质量呢?

是AP,或者说是instance-level的IoU。这个IoU和检测用到的IoU是一个东西,前者是predict mask和gt mask的pixel-level的Intersection-over-Union,而后者则是predict box和gt box的box-level的Intersection-over-Union。所以一个直观的方法就是用IoU来表示分割的质量,那么让网络自己学习输出分割的质量也是简单直观的做法。学习出mask的IoU,那么最后的mask score就等于maskIoU乘以classification score,mask score就同时表示分类置信度和分割的质量。

作者在Mask R-CNN的基础上添加了一个MaskIoU分支用于预测当前输出的mask和gt mask的IoU。MaskIoU的输入由两部分组成,一是ROIAlign得到的RoI feature map,二是mask分支输出的mask。两者concat之后经过3层卷积和2层全连接输出MaskIoU。

training过程:

box分支和mask保持不变,输出的mask先经过阈值为0.5的binarize,再计算binary mask和gt的IoU作为target,采用L2 loss作为损失函数,loss weight设为1,3个分支同时end-to-end训练。

inference过程:

检测分支输出score最高的100个框,再送入mask分支,得到mask结果,RoI feature map再和mask送入MaskIoU分支得到mask iou,与box的classification score相乘就得到最后的mask score。

实验结果,在COCO 2017 test集上,相对于Mask R-CNN,mask AP有1个点多的提升。

同时作者还做了对比实验,验证不同的MaskIoU输入对性能的影响。文章列举了4种输入方式:

  1. target mask和ROI feature concat
  2. target mask和ROI feature 相乘
  3. 所有mask和ROI feature concat
  4. target mask和高分辨率的ROI feature concat

其网络结构示意图如下:

验证不同training target对性能的影响:

  1. 只学习target类别的MaskIoU,忽略其他类别
  2. 学习所有类别的MaskIoU,相应的其他类别的MaskIoU的学习目标就是0
  3. 学习出现在ROI区域的类别的MaskIoU。

可以看出,setting#1的效果最好,setting#2的效果最差。

同时作者还做了实验探索Mask Scoring R-CNN的性能上界。

对每个输出的MaskIoU,用输出的mask 和匹配的gt mask iou来代替,MaskIoU分支就输出了mask分支的真实quality,这时就得到了Mask Scoring R-CNN的性能上界。实验结果表明Mask Scoring R-CNN依然比Mask R-CNN更好,说明MaskIoU起到了alignment的效果,但很显然会比用gt mask iou 代替的效果差,说明一方面box的准确性和mask分支本身也会影响mask任务的性能,另一方面MaskIoU 分支的学习能力可以进一步提升,Mask Scoring R-CNN依然有提升的空间。

速度方面,作者在Titan V GPU上测试一张图片,对于ResNet18-FPN用时0.132s,Resnet101-DCN-FPN用时0.202s,Mask Scoring R-CNN和Mask R-CNN速度一样。

总结:

作者motivation就是想让mask的分数更合理,从而基于mask rcnn添加一个新的分支预测来得到更准确的分数,做法简单粗暴,从结果来看也有涨点。其实mask的分割质量也跟box输出结果有很大关系,这种detection-based分割方法不可避免,除非把detection结果做的非常高,不然mask也要受制于box的结果。这种做法与IoU-Net类似,都是希望直接学习最本质的metric方式来提升性能。

为了同时提升detection和mask的效果,最近的Cascade方法很受欢迎,从人脸检测领域的Cascade CNN, 到Cascade R-CNN: Delving into High Quality Object Detection,再到友商的HTC不仅在COCO中拿了冠军,同时也被CVPR2019接收,Cascade方式展现了强大实力,相信在未来会出现越来越多的Cascade,如Cascade RetinaNet,Cascade TridentNet。。。

让网络来学习resize:插即用的新型图像调整器模型

Learning to Resize Images for Computer Vision Tasks

论文地址:https://arxiv.org/abs/2103.09950

代码:https://github.com/KushajveerSingh/resize_network_cv

尽管近年来卷积神经网络很大地促进了计算机视觉的发展,但一个重要方面很少被关注:图像大小对被训练的任务的准确性的影响 。通常,输入图像的大小被调整到一个相对较小的空间分辨率(例如,224×224),然后再进行训练和推理。这种调整大小的机制通常是固定的图像调整器(image resizer)(如:双行线插值)但是这些调整器是否限制了训练网络的任务性能呢? 作者通过实验证明了典型的线性调整器可以被可学习的调整器取代,从而大大提高性能 。虽然经典的调整器通常会具备更好的小图像感知质量(即对人类识别图片更加友好),本文提出的可学习调整器不一定会具备更好的视觉质量,但能够提高CV任务的性能。

在不同的任务中,可学习的图像调整器与baseline视觉模型进行联合训练。这种可学习的基于cnn的调整器创建了机器友好的视觉操作,因此在不同的视觉任务中表现出了更好的性能 。作者使用ImageNet数据集来进行分类任务,实验中使用四种不同的baseline模型来学习不同的调整器,相比于baseline模型,使用本文提出的可学习调整器能够获得更高的性能提升。

主要包括了两个重要的特性:(1) 双线性特征调整大小(bilinear feature resizing),以及(2)跳过连接(skip connection),该连接可容纳双线性调整大小的图像和CNN功能的组合。

第一个特性考虑到以原始分辨率计算的特征与模型的一致性。跳过连接可以简化学习过程,因为重定大小器模型可以直接将双线性重定大小的图像传递到基线任务中。

与一般的编码器-解码器架构不同,这篇论文中所提出的体系结构允许将图像大小调整为任何目标大小和纵横比(注意:这个大小必须是我们自己设定的,而不是网络 自己学习的)。并且可学习的resizer性能几乎不依赖于双线性重定器的选择,这意味着它可以直接替换其他现成的方法。

以上之后,就没有别的了,还以为是什么样子的惊天设计,最后不就是:给网络变得复杂了吗,把这种复杂说成是可学习的resizer,这样的话,普通网络的浅层都可以说成是可学习的resizer不是吗?

另外,通过一些实验 来说,确实能够提升效果。个人认为 作者提出的resizer模型实际上是一个可训练的数据增强方法,甚至也可以认为就是将模型变得更加复杂。整体的网络就像是一般模型中resblock。

作者的对比试验是这样做的:首先通过常用的reisze方法训练网络模型,作为baseline,然后在训练好的网络模型前面添加可学习的resizer,然后进行训练,作为自己的方法。感受一下作者的实验结果吧。如表3和表4

表3 训练配置
表4 对比试验

四. 总结

文章写得好,加上点运气,都可以发高质量论文,以上

代码实现:

import torch
import torch.nn as nn
import torch.nn.functional as F
from functools import partial

"""
    Learning to Resize Images for Computer Vision Tasks
    https://arxiv.org/pdf/2105.04714.pdf
"""

def conv1x1(in_chs, out_chs = 16):
    return nn.Conv2d(in_chs, out_chs, kernel_size=1, stride=1, padding=0)


def conv3x3(in_chs, out_chs = 16):
    return nn.Conv2d(in_chs, out_chs, kernel_size=3, stride=1, padding=1)


def conv7x7(in_chs, out_chs = 16):
    return nn.Conv2d(in_chs, out_chs, kernel_size=7, stride=1, padding=3)


class ResBlock(nn.Module):
    def __init__(self, in_chs,out_chs = 16):
        super(ResBlock, self).__init__()
        self.layers = nn.Sequential(
            conv3x3(in_chs, out_chs),
            nn.BatchNorm2d(out_chs),
            nn.LeakyReLU(0.2),
            conv3x3(out_chs, out_chs),
            nn.BatchNorm2d(out_chs)
        )
    def forward(self, x):
        identity = x
        out = self.layers(x)
        out += identity
        return out


class Resizer(nn.Module):
    def __init__(self, in_chs, out_size, n_filters = 16, n_res_blocks = 1, mode = 'bilinear'):
        super(Resizer, self).__init__()
        self.interpolate_layer = partial(F.interpolate, size=out_size, mode=mode,
            align_corners=(True if mode in ('linear', 'bilinear', 'bicubic', 'trilinear') else None))
        self.conv_layers = nn.Sequential(
            conv7x7(in_chs, n_filters),
            nn.LeakyReLU(0.2),
            conv1x1(n_filters, n_filters),
            nn.LeakyReLU(0.2),
            nn.BatchNorm2d(n_filters)
        )
        self.residual_layers = nn.Sequential()
        for i in range(n_res_blocks):
            self.residual_layers.add_module(f'res{i}', ResBlock(n_filters, n_filters))
        self.residual_layers.add_module('conv3x3', conv3x3(n_filters, n_filters))
        self.residual_layers.add_module('bn', nn.BatchNorm2d(n_filters))
        self.final_conv = conv7x7(n_filters, in_chs)

    def forward(self, x):
        identity = self.interpolate_layer(x)
        conv_out = self.conv_layers(x)
        conv_out = self.interpolate_layer(conv_out)
        conv_out_identity = conv_out
        res_out = self.residual_layers(conv_out)
        res_out += conv_out_identity
        out = self.final_conv(res_out)
        out += identity
        return