DL学习日记——Segment Anything 小白论文阅读

如果有任何不妥或者错误之处,恳请您的批评指正,也欢迎讨论。由于本人接触大模型较少因此在其中添加了很多相关支撑知识和文档,阅读体验有所下降,请见谅。

论文网址:[2304.02643] Segment Anything (arxiv.org)

目录

1 Introduction

1.1 任务

1.1.1提示工程

1.1.1.1 提示工程

1.1.1.2提示工程的优点

1.1.2 任务内容

1.2 模型

1.3 数据

1.4 实验

2. Segment Anything Task

2.1 任务

2.2 预训练

2.3 零样本转换

2.4 相关任务

3. Segment Anything Model

3.1 Image Encoder

3.1.1MAE Vision Transformer

3.1.2 Image encoder

3.2 Prompt Encoder

3.2.1 CLIP的text encoder

3.2.2 prompt encoder

3.3 模糊提示输出多个mask

3.3.1 mask的数量

3.3.2 多个mask的实现

3.4 Lightweight mask decoder

3.4.1 decoder结构和细节(原文搬运)

3.4.2 Loss

4. Segment Anything Data Engine

4.1 辅助阶段

4.2  半自动阶段

4.3 全自动阶段

5. Segment Anything Dataset

6. Segment Anything RAI Analysis

7. Zero-Shot Transfer Experiments

8.Discussion


1 Introduction

模型目标:建立一个图像分割的零样本学习基础模型(图像分割界的gpt)

即寻求开发一个提示模型,并使用一个能够实现强大泛化的任务在广泛的数据集上对其进行预训练。有了这个模型,我们的目标是使用即时工程解决新数据分布上的一系列下游分割问题。

基础模型: 可以用较大的数据集训练后解决没有见过的问题和任务的模型
该计划的成功取决于三个组成部分:任务、模型和数据。为了开发它们,解决了以下关于图像分割的问题:

1. 什么任务可以实现zero-shot泛化?(zero-shot可视作零样本学习)

2. 相应的模型体系结构是什么? 

3. 哪些数据可以为这项任务和模型提供支持?

1.1 任务

1.1.1提示工程

参考文献:一文读懂「Prompt Engineering」提示词工程-CSDN博客

大模型LLM:最清晰解读提示工程(Prompt Engineering)-CSDN博客

1.1.1.1 提示工程

提示工程(Prompt Engineering),也称为上下文提示,是一种通过不更新模型的权重/参数来引导LLM行为朝着特定结果的方法。

Prompt提示是模型接收以生成响应或完成任务的初始文本输入。我们给AI一组Prompt输入,用于指导模型生成响应以执行任务。这个输入可以是一个问题、一段描述、一组关键词,或任何其他形式的文本,用于引导模型产生特定内容的响应。在我们这个任务当中可能是四种方式,分别为mask,point,box和text

prompt可以分为zero-shot prompt,few-shot prompt和 instruction prompt三种,而在解决一个较大问题时又需要拆分为小问题,分为COT思维链方式和递归方式。

1.1.1.2提示工程的优点

1.任务归一化:将所有的任务归一化为预训练语言模型的任务,使得所有的任务在方法上变得一致。避免了预训练和fine-tuning之间的gap

2.优秀的性能:在少样本的数据集上,Prompt Engineering能取得超过fine-tuning的效果

3.信息量丰富:有研究表明,一个prompt相当于100个真实数据样本。

4.适应能力强:prompt在下游任务「数据缺乏」的场景下、甚至是zero-shot场景下,有着无可比拟的优势。因为大模型通常无法在小数据上微调,因此,基于prompt的技术便成为首要选择。

1.1.2 任务内容

关键词:提示分割,模糊提示

task:提示分割任务,其目标是给定任何分割提示返回有效的分割掩码

提示符只是指定图像中要分割的内容,例如,提示符可以包括识别对象的空间或文本信息。有效输出掩码的要求意味着,即使提示是模糊的,并且可能引用多个对象(例如,衬衫上的一个点可能表示衬衫或穿着它的人),输出也应该是这些对象中至少一个对象的合理掩码

我们使用提示分割任务作为预训练目标,并通过提示工程解决一般的下游分割任务。(这也是提示工程最基础的目标)

1.2 模型

根据任务,模型需要满足的三个约束: flexible prompts , real-time ,  ambiguity-aware

提出了SAM满足以上三个约束:
 

  • flexible prompt:通过使用prompt encoder 和image encoder(生成一次性图像嵌入) ,相同的图片也可以通过不同的提示输出不同的mask 
  • real-time:给定图像嵌入,提示编码器和掩码解码器在web浏览器中从提示符预测掩码,时间为~ 50ms。
  • ambiguity-aware:模型可以预测同一个提示的多个掩码

1.3 数据

数据引擎和数据集

需要一个数据引擎来支持任务并改进数据集和模型。数据引擎分为三个阶段

  • 辅助手动,SAM 协助标注者标注掩膜,类似于经典的交互式分割设置。

交互式分割:用户提供少量交互完成对目标物的分割。 交互可以是点击(click),划线(scribble), 画框(box)等各种形式。(相比于传统标注,成本低)

参考文献:交互式分割(Interactive Segmentation)_interactive segmentation算法包-CSDN博客

  • 半自动,其中 SAM 可以通过提示可能的对象位置来自动为对象子集生成掩膜,而标注者则专注于标注其余对象,从而帮助增加蒙版多样性。

只保留那些可信度高的mask结果,而其他部分则由人工进行标注

  • 全自动,人工标注者通过前景点的规则网格提示 SAM,平均为每个图像生成 100 个高质量掩膜。

数据引擎构建了 Meta AI 发布的 10 亿级分割一切掩膜数据集。11M图像和超过1B的掩膜,每张图片平均100个掩膜。构建出数据集:SA-1B(现在也可以说是一个在图像基础模型上的经典数据集)

1.4 实验

将模型应用于各种图像分割方面的下游任务

具体来说:

首先,使用23个不同的新分割数据集,发现SAM从单个前景点产生高质量的掩模,通常仅略低于手动注释的地面真值。

其次,在zero-shot传输协议下使用即时工程的各种下游任务上发现了一致的强定量和定性结果,包括边缘检测,目标提案生成,实例分割以及文本到掩码预测的初步探索。

这些结果表明,SAM可以使用开箱即用的快速工程来解决涉及SAM训练数据之外的对象和图像分布的各种任务。也有一些可改进之处。

2. Segment Anything Task

2.1 任务

此小节的主要内容与 1.1.2 任务内容是类似的,这一小节主要叙述了如何将NLP任务迁移到图像领域

我们首先将提示的概念从NLP转换到分割

  • NLP的提示:可能是一个句子,关键词,文本或者其他(详细的可以参考提示工程的文章)
  • 图像分割的提示:一组前景/背景点,一个粗略的框或蒙版,自由格式的文本,或者一般情况下,任何指示图像中要分割的信息。

提示分割任务:在给定任何提示的情况下返回一个有效的分段掩码。

“有效”掩码的要求仅仅意味着,即使提示是模糊的,并且可以引用多个对象,输出也应该是这些对象中至少一个的合理掩码。这个需求类似于期望语言模型对不明确的提示输出一致的响应。下图是一个关于模糊提示的示例。

2.2 预训练

预训练方法:提示分割任务提出了一种自然的预训练算法,该算法为每个训练样本模拟一系列提示(例如,点、框、掩码),并将模型的掩码预测与基本事实进行比较(从交互式分割中采用了这种方法)

PS:交互式分割的目的是在足够的用户输入后最终预测一个有效的掩码

这个模型任务的重要点之一就是实现模糊分割,所以在预训练当中有些提示也是模糊的,这样保障在涉及歧义的样例当中模型也是有效的。

2.3 零样本转换

预训练任务赋予了模型在推理时对任何提示作出适当响应的能力,因此下游任务可以通过设计适当的提示来解决。

例如,如果有一个猫的边界框检测器,猫实例分割可以通过提供检测器的框输出作为提示给我们的模型来解决(这里是一个box作为prompt)。在1.4节做了五个实验,这里没有详细叙述。

2.4 相关任务

功能广泛模型vs多任务模型:

一个功能广泛的模型,可以通过提示工程适应许多(尽管不是全部)现有的和新的分割任务。这种能力是任务泛化的一种形式[26]。请注意,这与之前在多任务分割系统上的工作不同。在多任务系统中,单个模型执行一组固定的任务,例如联合语义分割、实例分割和全视分割[114,19,54],但训练和测试任务是相同的。

一个重要区别是,训练用于提示分割的模型可以作为更大系统中的组件在推理时间执行新的不同任务,例如,执行实例分割,提示分割模型与现有的对象检测器相结合。

3. Segment Anything Model

3.1 Image Encoder

3.1.1MAE Vision Transformer

在预训练过程中,图像补丁的一个大的随机子集(例如75%)被屏蔽掉。该编码器应用于可见补丁的小子集。在编码器之后引入掩码令牌(mask tokens),然后由一个小型解码器处理完整的编码补丁和掩码令牌,以像素为单位重建原始图像。预训练后,丢弃解码器,将编码器应用于未损坏的图像(完整的补丁集)进行识别任务。

maeViT论文:[2111.06377] Masked Autoencoders Are Scalable Vision Learners (arxiv.org)

3.1.2 Image encoder

对每张图像只运行一次。
输入(c,h,w)的图像,对图像进行缩放,按照长边缩放成1024,短边不够就padding,得到(c,1024,1024)的图像,经过image encoder,得到对图像16倍下采样的feature,大小为(256,64,64)。

3.2 Prompt Encoder

考虑两组提示:稀疏(点、框、文本)和密集(掩码)。下面是一个模型的概要。

3.2.1 CLIP的text encoder

我们通过位置编码来表示点和框,并对每个提示类型和使用CLIP的text encoder的自由格式文本进行学习嵌入求和。这是一个基于transformer的encoder。

CLIP模型的文本编码器是一个基于Transformer的架构,它使用因果注意力机制。这种机制允许每个token只能看到它之前的token,从而实现高效的自回归预测。在CLIP的文本编码器中,通常不使用[CLS]标记对应的向量作为整个文本的特征表示,而是使用[EOS]标记,即句子结束标记的向量,因为这个标记能够捕捉到整个文本序列的信息。

在CLIP模型中,文本编码器通过对文本序列进行处理,最终输出一个固定大小的向量,该向量代表了整个文本的语义信息,并将其映射到与图像编码器(image encoder)输出的向量相同的嵌入空间中。这样,模型可以通过计算文本向量和图像向量之间的余弦相似度来评估它们之间的匹配程度。

3.2.2 prompt encoder

  • point:映射到256维的向量,包含代表点位置的 positional encoding,加2个代表该点是前景/背景的可学习的embedding。
  • box:用一个embedding对表示(1)可学习的embedding代表左上角(2)可学习的embedding代表右下角
  • text:通过CLIP模型进行文本编码

参考blog:SAM,分割一切_web实现sam分割一切模型-CSDN博客

密集提示(即掩码mask)使用卷积嵌入,并在图像嵌入中按元素求和。

  • mask:用输入图像1/4分辨率的mask,然后用(2,2)卷积核,stride-2输出channel为4和16,再用(1,1)卷积核将channel升到256. mask 和iamge embedding通过element-wise相乘(逐元素相乘,可以理解成mask的feature对image的feature进行加权)

3.3 模糊提示输出多个mask

3.3.1 mask的数量

3个掩码输出足以解决大多数常见情况(嵌套掩码通常最多有三个深度:整体、部分和子部分)。

3.3.2 多个mask的实现

对每个掩膜进行置信度分数评估,例如估计IoU,然后排名选出来最好的三个掩膜

3.4 Lightweight mask decoder

我们首先在提示嵌入集合中插入一个学习过的输出令牌嵌入,它将用于解码器的输出,类似于ViT中的[class]令牌。

3.4.1 decoder结构和细节(原文搬运)

我们的解码器设计上图所示。每个解码器层执行4个步骤:(1)对令牌的自关注,(2)从令牌(作为查询)到图像嵌入的交叉关注,(3)point-wise逐点MLP更新每个令牌,以及(4)从图像嵌入(作为查询)到令牌的交叉关注。最后一步用提示信息更新图像嵌入。在交叉关注过程中,图像嵌入被视为642个256维向量的集合。

每个自/交叉注意和MLP在训练时具有残差连接层归一化和0.1的dropout。下一个解码器层从上一层获取更新的令牌和更新的图像嵌入。

为了确保解码器能够访问关键的几何信息,每当位置编码参与注意层时,都会将其添加到图像嵌入中。

此外,每当它们参与到注意层时,整个原始提示令牌(包括它们的位置编码)都会被重新添加到更新的令牌中。这允许对提示令牌的几何位置和类型有很强的依赖性。

在运行解码器之后,我们用两个转置卷积16层将更新后的图像嵌入上采样4倍(现在它相对于输入图像缩小了4倍)。

然后,令牌再次参与图像嵌入,我们将更新的输出令牌嵌入传递给一个小的3层MLP,该MLP输出与升级图像嵌入的通道维度匹配的向量。最后,我们用升级图像嵌入和MLP输出之间的空间点积来预测掩模。

transformer使用256的嵌入维数。

变压器MLP块的内部维度较大,为2048,但是MLP仅应用于提示令牌相对较少(很少大于20)的提示令牌。然而,在交叉关注层中,我们有一个64×64图像嵌入,为了提高计算效率,我们将查询、键和值的通道维度降低了2倍,降至128。所有的注意力层都使用8个头

用于升级输出图像嵌入的转置卷积是2×2,步幅2,输出通道尺寸为64和32,并具有GELU激活。它们通过层规范化来分离。

3.4.2 Loss

focal loss + dice loss(20:1)

focal loss的优点:

  1. 解决类别不平衡:Focal Loss通过降低易分类样本的损失权重,增加难分类样本的损失权重,使得模型在训练过程中更加关注那些难以正确分类的样本1。
  2. 改善模型泛化能力:由于Focal Loss减少了对易分类样本的关注,模型不会变得过度自信,从而有助于提高模型的泛化能力。

4. Segment Anything Data Engine

这部分的总结都在图片上面标注了,细节我也没有多写。

参考1.3节我们知道这个数据集构建有三个阶段,接下来逐个阶段介绍

4.1 辅助阶段

  • 在这个阶段,专业标注团队使用基于浏览器的交互式分割工具,通过点击前景/背景对象点来标记掩码。
  • SAM在这个过程中实时地协助标注者,类似于经典的交互式分割设置。
  • 标注者可以使用像素精确的“画笔”和“橡皮擦”工具来微调掩码。

4.2  半自动阶段

  • 这个阶段的目标是增加掩码的多样性,以提高模型分割各种对象的能力。
  • 首先,通过自动检测置信度高的掩码,然后让标注者专注于未被自动标注的对象。
  • 使用边界框检测器在第一阶段的掩码上训练,以自动检测对象,然后由标注者补充其余的对象。

4.3 全自动阶段

  • 最终阶段实现了完全自动化的标注过程,无需标注者输入。
  • 通过使用前景点的规则网格提示,SAM能够为每张图片生成大约100个高质量的分割掩码。
  • 这个阶段利用了SAM模型的歧义感知能力,能够预测有效掩码,即使在存在歧义的情况下。

5. Segment Anything Dataset

这一部分主要介绍了图像的来源,掩码的质量和生成的比例,并且与其他数据集做了对比,考虑到大模型的泛化能力,还对图像的地域分布有所要求,就是一个很好的数据集。不详细叙述了,想要多了解可以看一下论文。论文网址在最前面。

6. Segment Anything RAI Analysis

第6节讨论了在创建和使用SA-1B数据集和SAM模型时潜在的公平性和偏见问题,强调了模型在不同人群中的表现一致性,并提供了模型和数据集卡片以确保负责任的AI实践。详细可以看一下论文。

7. Zero-Shot Transfer Experiments

第7节通过广泛的实验评估了SAM模型的性能,展示了其在多种零样本迁移学习任务上的能力,包括边缘检测、对象提议生成、实例分割和文本到掩码预测等,证明了SAM通过提示工程能够解决多种任务。详细的任务,实现方法和结论可以看一下论文。

8.Discussion

  1. 组合性:SAM的设计允许它与其他系统组件结合使用,例如在3D重建或通过可穿戴设备检测视线点来实现分割。这种组合性使得SAM可以轻松地集成到更大的系统中。

  2. 局限性:尽管SAM在许多方面表现出色,但它也有局限性。例如,它可能无法捕捉到非常细微的结构,有时会产生小的不连续组件,并且在边界清晰度方面可能不如更计算密集的方法。

  3. 实时性能:SAM旨在实时处理提示,但其整体性能并非实时,特别是当使用重量级的图像编码器时。

  4. 文本到掩码任务:作者提到,SAM在将文本提示转换为掩码的任务上还有改进空间,尽管它已经能够处理简单的文本提示。

  5. 领域特定工具:作者认为,某些领域特定的工具可能在特定领域内超越SAM的性能

笔者用一张有五个女性搞怪的图片(韩国女团lesserafim)进行了分割,结果如下,确实在边界分割上可能不够准确。

网站:Segment Anything | Meta AI (segment-anything.com)

  • 17
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于 Ianvs 和 Sedna 终身学习的复现分割任意物体的模型需要一定的技术和资源支持。Ianvs 是一个自适应学习方法,而 Sedna 是一个基于强化学习的终身学习框架。 要复现分割任意物体的模型,你可以考虑以下步骤: 1. 数据准备:收集包含任意物体分割任务的数据集。可以使用已有的数据集,如 COCO、PASCAL VOC 或 Cityscapes,或者自行标注数据集。 2. 模型选择:选择一个适合的分割模型作为基础网络。常用的模型包括 U-Net、Mask R-CNN、DeepLab 等。根据具体任务和资源情况选择合适的模型。 3. 强化学习框架:将 Sedna 终身学习框架应用于模型训练过程中。Sedna 可以帮助模型在不断接收新任务时进行知识迁移和持续学习。 4. 自适应学习方法:结合 Ianvs 的自适应学习方法来进一步提升模型的性能。Ianvs 可以帮助模型快速适应新任务,并在训练过程中动态调整网络结构。 5. 训练和优化:使用准备好的数据集对模型进行训练,并优化模型性能。可以使用常见的优化方法,如梯度下降和学习率调整。 6. 模型评估:使用测试集评估模型的性能,包括分割精度、速度等指标。根据评估结果进行模型调整和改进。 请注意,复现这样的模型是一个复杂的任务,需要深入了解相关的深度学习、强化学习和终身学习技术,并具备相应的计算资源和数据集。建议参考相关文献或代码库,如论文《Sedna: A Framework for Adapting Object Detectors to New Domains》和相关的开源项目,以获得更详细的指导和实现方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值