Segment Anything文章要点

核心方法:

1. 数据

Unfortunately, there is no web-scale data source for segmentation; to address this, we build a “data engine”
没有大规模的数据源用于分割; 为了解决这个问题,我们构建了一个“数据引擎”

We iterate between using our efficient model to assist in data collection and using the newly collected data to improve the model.
在使用我们的高效模型来辅助数据收集和使用新收集的数据来改进模型之间进行迭代

Inspired by this line of work, we propose the promptable segmentation task, where the goal is to return a valid segmentation mask given any segmentation prompt. A prompt simply specifies what to segment in an image, e.g., a prompt can include spatial or text information identifying an object.

2. 任务

我们提出了可提示分割任务,其目标是在给定任何分割提示时返回有效的分割掩码。prompt示例:

在这里插入图片描述

We use the promptable segmentation task as both a pre-training objective and to solve general downstream segmentation tasks via prompt engineering.
我们使用提示分割任务作为预训练目标,并通过提示工程解决一般的下游分割任务。

3. 模型

a powerful image encoder computes an image embedding, a prompt encoder embeds prompts, and then the two information sources are combined in a lightweight mask decoder that predicts segmentation masks.
一个图像编码器,一个提示编码器,然后将两个信息源组合在一个轻量级的掩码解码器中,预测分割掩码。我们把这个模型称为分段任意模型(Segment Anything model),或SAM
在这里插入图片描述
We focus on point, box, and mask prompts, and also present initial results with free-form text prompts. To make SAM ambiguity-aware, we design it to predict multiple masks for a single prompt allowing SAM to naturally handle ambiguity, such as the shirt vs. person example.
我们主要关注点、框和掩码提示,并使用自由形式的文本提示来呈现初始结果。为了使SAM能够识别歧义,我们将其设计为为单个提示预测多个掩码,允许SAM自然地处理歧义,例如衬衫vs.人的示例。

4. 数据引擎

在这里插入图片描述

为了实现对新数据分布的强泛化,我们发现有必要在一个大而多样的掩码集上训练SAM,而不是任何已经存在的分割数据集。虽然基础模型的典型方法是在线获取数据,但掩码自然并不丰富,因此我们需要一种替代策略。我们的解决方案是构建一个“数据引擎”,即 we co-develop our model with model-in-the-loop dataset annotation。我们的数据引擎有三个阶段:辅助手动、半自动和全自动。在第一阶段,SAM帮助标注员标注掩码,类似于经典的交互式分割设置。在第二阶段,SAM可以自动为对象的一个子集生成掩码,方法是提示它可能的对象位置,而标注员则专注于标注剩余的对象,这有助于增加掩码的多样性。在最后阶段,我们用前景点的规则网格提示SAM,平均每张图像产生约100个高质量蒙版。

5. 最终的SA-1B数据集

11M个图像的超过1B个掩码。使用data engine最后阶段完全自动收集,比任何现有的分割数据集拥有多400倍的掩码。

6. SAM

We take inspiration from NLP, where the next token prediction task is used for foundation model pre-training and to solve diverse downstream tasks via prompt engineering. To build a foundation model for segmentation, we aim to define a task with analogous capabilities.

收到NLP启发, 即next token prediction任务被当成一个预训练任务,然后通过prompt engineering来解决下游的其他任务。为了建立一个分割的基础模型,我们的目标是定义一个具有类似功能的任务。

We start by translating the idea of a prompt from NLP to segmentation, where a prompt can be a set of foreground / background points, a rough box or mask, free-form text, or, in general, any information indicating what to segment in an image. The promptable segmentation task, then, is to return a valid segmentation mask given any prompt. The requirement of a “valid” mask simply means that even when a prompt is ambiguous and could refer to multiple objects (e.g., recall the shirt vs. person example, and see Fig. 3), the output should be a reasonable mask for at least one of those objects. This requirement is similar to expecting a language model to output a coherent response to an ambiguous prompt. We choose this task because it leads to a natural pre-training algorithm and a general method for zero-shot transfer to downstream segmentation tasks via prompting.

我们首先将提示符的思想从NLP转换为分割,其中提示符可以是一组前景/背景点,一个粗略的框或掩码,自由形式的文本,或者通常情况下,指示图像中要分割的内容的任何信息。那么,提示分割任务是在给定任何提示时返回一个有效的分割掩码。“有效”掩码的要求仅仅意味着,即使提示符是模糊的,并且可能涉及多个对象,输出也应该是这些对象中至少一个的合理掩码。这一需求类似于期望语言模型对模棱两可的提示符输出一致的响应。我们选择这个任务是因为它导致了一个自然的预训练算法和一个通过提示将zero-shot转移到下游分割任务的通用方法。

提示分割任务提出了一种自然的预训练算法,该算法为每个训练样本模拟一系列提示(例如,点、框、掩码),并将模型的掩码预测与实际情况进行比较。我们从交互式分割中采用了这种方法,尽管与交互式分割的目标是在足够的用户输入后最终预测有效的掩码不同,我们的目标是始终预测任何提示的有效掩码,即使提示是模糊的。这确保了预训练的模型在涉及歧义的用例中是有效的,包括我们的数据引擎§4所要求的自动注释。我们注意到,在这项任务中表现良好具有挑战性,需要专门的建模和训练损失选择,我们将在§3中讨论。

直观地说,我们的预训练任务赋予了模型在推理时对任何提示作出适当响应的能力,因此可以通过设计适当的提示来解决下游任务。例如,如果有一个猫的边界盒检测器,猫实例分割可以通过提供检测器的盒子输出作为我们的模型的提示来解决。一般来说,大量的实际分割任务都可以作为提示。除了自动数据集标记之外,我们还在§7的实验中探索了五个不同的示例任务。

分割是一个广泛的领域:有交互式分割(interactive segmentation),边缘检测(edge detection),超像素化(super pixelization), 目标建议生成(object proposal generation),前景分割(foreground segmentation ),语义分割(semantic segmentation),实例分割(instance segmentation ), 全景分割(panoptic segmentation)等。

我们的提示分割任务的目标是产生一个泛化模型,可以适应许多(虽然不是全部)现有的和新的分割任务通过提示工程。这种能力是任务泛化的一种形式。注意,这与以前的多任务分割系统不同。在多任务系统中,单个模型执行一组固定的任务,例如联合语义、实例和全景分割,但训练和测试任务是相同的。在我们的工作中,一个重要的区别是,为prompt segmentation训练的模型通过作为一个更大的系统组件可以在推理时执行一个新的、不同的任务,例如,为了执行实例分割,prompt segmentation模型与现有的object detector相结合。

提示和组合是强大的工具,可以以可扩展的方式使用单个模型,潜在地完成模型设计时未知的任务。这种方法类似于其他基础模型的使用方式,例如CLIP[82]是DALL•E[83]图像生成系统的文本图像对齐组件。我们预计,由提示工程等技术驱动的可组合系统设计,将比专门为固定任务集训练的系统能够实现更广泛的应用程序。从组合的角度比较提示分割和交互式分割也很有趣:虽然交互式分割模型是在设计时考虑到人类用户的,但为提示分割训练的模型也可以组成一个更大的算法系统,正如我们将演示的那样。

模型结构:

在这里插入图片描述

6.1 Image Encoder

其中Image Encoder使用MAE预训练的ViT模型。

6.2 Prompt Encoder

prompt encoder分为两种:

  • sparse prompt: points, boxes, text, We represent points and boxes by positional encodings summed with learned embeddings for each prompt type and free-form text with an off-the-shelf text encoder from CLIP. 我们通过位置编码来表示点和框,并对每种提示类型和自由形式的文本使用CLIP现成的文本编码器进行学习嵌入。

  • dense prompt: mask, Dense prompts (i.e., masks) are embedded using convolutions and summed element-wise with the image embedding. 密集提示(即掩码)使用卷积嵌入,并与图像嵌入元素相加。

6.3 Decoder

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

6.4 Resolving ambiguity

对于一个output token, 如果给出模棱两可的提示,模型将平均多个valid mask. 为了解决这个问题,我们修改了模型,以预测单个prompt的多个mask。我们发现3个掩码输出足以解决大多数常见情况(嵌套掩码通常最多有三种深度:整体、部分和子部分)。训练时,我们只反向传播loss最小的mask。为了对mask进行排名,模型预测每个mask的置信度分数(即估计的IoU)。

6.5 Loss and Training

使用Focal Loss和Dice Loss的线性组合。我们使用混合的几何提示来训练提示分割任务。按照[92,37],我们通过在每个掩码中随机抽取11轮提示来模拟交互式设置,允许SAM无缝集成到我们的数据引擎中。

7. Data Engine

7.1 stage 1: Assisted-manual stage

在第一阶段,类似于经典的交互式分割,一组专业的注释人员使用SAM支持的基于浏览器的交互式分割工具,通过单击前景/背景对象点来标记mask。mask可以使用像素精确的“笔刷”和“橡皮擦”工具来细化。我们的模型辅助注释直接在浏览器中实时运行(使用预先计算的图像嵌入),从而实现真正的交互式体验。我们没有对标记对象施加语义约束,标注员可以自由地标记“stuff”和“things”[1]。我们建议标注员标记他们可以命名或描述的对象,但没有收集这些名称或描述。标注员被要求按显著性顺序标注对象,如果一个mask上花费了超过30秒,标注员就可以标注下一个图像。

在这一阶段的开始,SAM使用公共分割数据集进行训练。在足够的数据标注后,仅使用新标注的掩码重新训练SAM。随着越来越多的掩模被收集,图像编码器从ViT-B缩放到ViT-H,其他架构细节也在进化;我们总共重新训练了我们的模型6次。随着模型的改进,每个掩码的平均注释时间从34秒减少到14秒。我们注意到,14秒比COCO的掩码标注快6.5倍[66],仅比极值点的边界框标注慢2倍[76,71]。随着SAM的改进,每张图像的平均掩码数量从20个增加到44个。总的来说,我们在这个阶段从12万张图片中收集了430万个mask。

7.2 stage 2: Semi-automatic stage

在这个阶段,我们的目标是增加mask的多样性,以提高我们的模型分割任何东西的能力。为了将让标注员集中在不太突出的对象上,我们首先自动检测confident mask。然后,我们向标注员展示了预先填充了这些mask的图像,并要求他们标注其他未标注的对象。为了检测confident mask,我们使用通用的“对象”类别在所有第一阶段掩码上训练了一个bounding box detector。在此阶段,我们在180k图像中收集了额外的590万个mask(总共1020万个面具)。与第一阶段一样,我们定期对新收集的数据重新训练我们的模型(5次)。每个mask的平均注释时间回到了34秒(不包括自动生成的mask),因为这些对象的标签更具挑战性。每张图片的平均mask数量从44个增加到72个(包括自动生成的mask)。

7.3 stage 3: Fully automatic stage

在最后阶段,注释是完全自动的。这是可行的,因为我们的模型有两个主要的增强。首先,在这一阶段的开始,我们收集了足够多的mask来极大地改进模型,包括前一阶段的各种mask。第二,在这个阶段,我们已经开发了模糊感知模型(ambiguity-aware),它允许我们在模糊的情况下预测有效的mask。

Specifically, we prompted the model with a 32×32 regular grid of points and for each point predicted a set of masks that may correspond to valid objects.

具体来说,我们使用32×32规则点网格来提示模型,并为每个点预测一组可能对应于有效对象的掩码。对于识别歧义的模型,如果一个点位于一个部件或子部件上,我们的模型将返回子部件、部分和整个对象。利用模型中的IoU预测模块来选择有信心的面具;此外,我们仅识别和选择了稳定的掩码(如果将概率图阈值设为0.5−δ和0.5 + δ会产生相似的掩码,则我们认为掩码是稳定的)。最后,在选择自信和稳定的掩码后,应用非最大抑制(non- maximum suppression, NMS)对重复数据进行过滤。为了进一步提高较小mask的质量,我们还处理了多个重叠的放大图像的crop。关于这一阶段的更多细节,请参见§B。我们对数据集中的所有11M张图像应用了全自动mask生成,总共生成了1.1亿个高质量的mask。接下来,我们描述并分析结果数据集SA-1B。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值