jjzjj

Nikolaj Buhl : Segment Anything 模型 (SAM) 解释

踏实钻研 2023-11-16 原文

文章目录


本文转译于 Nikolaj Buhl博士Blog

Meta 的人工智能和计算机视觉简史

作为人工智能 (AI) 领域的领先公司之一,Meta 一直在突破机器学习模型的极限。从最近发布的LLaMA等开源模型到开发最常用的 ML 和 AI Python 库PyTorch。

以下部分深入探讨了计算机视觉的进步和基础模型的发展。

计算机视觉的进展

计算机视觉也经历了相当大的进步,像CLIP这样的模型弥合了文本和图像理解之间的鸿沟。

这些模型使用对比学习来映射文本和图像数据。这使他们能够通过及时的工程推广到新的视觉概念和数据分布。

FAIR 的 Segment Anything Model (SAM) 是该领域的最新突破。他们的目标是为图像分割创建一个基础模型,该模型可以使用提示工程适应各种下游任务。

让我们简要探讨一下计算机视觉领域的一些关键发展,这些发展对 Meta 等 AI 系统的发展做出了贡献。

卷积神经网络 (CNN)

CNN于 1989 年由Yann LeCun (现任 Meta 副总裁兼首席 AI 科学家)首次引入,现已成为现代计算机视觉系统的支柱,使机器能够自动学习和识别图像中的复杂模式。

通过使用卷积层,CNN 可以捕获图像中的局部和全局特征,从而使它们能够有效地识别物体、场景和动作。这导致图像分类、对象检测和语义分割等任务的显着改进。

生成对抗网络 (GAN)

GAN是 Ian Goodfellow 和他的团队在 2014 年提出的一种深度学习模型。它们由两个相互竞争的神经网络(生成器和鉴别器)组成。

生成器旨在创建逼真的输出,而鉴别器则试图区分真实输出和生成的输出。这些网络之间的竞争导致了越来越逼真的合成图像的创建,并导致了图像合成、数据增强和风格转换等任务的进步。

迁移学习和预训练模型

与 NLP 类似,计算机视觉受益于预训练模型的开发,这些模型可以针对特定任务进行微调。ResNetVGGEfficientNet等模型已经在大规模图像数据集上进行了训练,允许研究人员将这些模型用作他们自己项目的起点。

基础模型的成长

近年来,自然语言处理 (NLP) 中的基础模型取得了重大进展,Meta 自己的LLaMa或 OpenAI 的GPT-4等模型在零样本和少样本学习方面展示了卓越的能力。

这些模型在大量数据上进行了预训练,并且能够通过使用提示工程来泛化到新任务和数据分布。Meta AI 在推进这一领域、促进研究和开发具有广泛应用的大规模 NLP 模型方面发挥了重要作用。

在这里,我们探讨了促进基础模型增长的因素。

大规模语言模型

像 GPT-4 这样的大规模语言模型的出现一直是 NLP 基础模型发展的推动力。这些模型采用具有数十亿参数的深度学习架构,使它们能够捕获训练数据中的复杂模式和结构。

迁移学习

NLP 中基础模型的一个关键特征是它们的迁移学习能力。一旦在大型数据集上进行了训练,它们就可以在较小的、特定于任务的数据集上进行微调,以在各种任务中实现最先进的性能。

零样本和少样本学习

基础模型在零样本和少样本学习中也显示出前景,它们可以在没有任何微调或最少任务特定训练数据的情况下执行任务。这种能力在很大程度上归功于模型能够根据提示提供的上下文理解和生成类似人类的响应。

多模态学习

另一个日益增长的兴趣领域是多模式学习,其中训练基础模型以理解和生成跨不同模式的内容,例如文本和图像。

CLIP和ALIGN这样的模型展示了如何将 NLP 和计算机视觉一起使用来制作可以将动作从一个域转换到另一个域的多模态模型。

道德考量和安全

NLP 中基础模型的增长也引发了对其伦理影响和安全性的担忧。研究人员正在积极探索减轻潜在偏见、解决内容生成问题以及开发安全可控的人工智能系统的方法。证明这一点的是最近要求停止所有尖端模型开发六个月的呼吁。

将 Segment Anything 模型与以前的模型进行比较

SAM 是 AI 向前迈出的一大步,因为它建立在早期模型奠定的基础之上。SAM 可以从其他系统获取输入提示,例如,在未来,从 AR/VR 耳机获取用户的目光来选择对象,使用输出掩码进行视频编辑,将 2D 对象抽象为 3D 模型,甚至流行的谷歌照片任务,如创建拼贴画。

它可以通过在提示不清楚的情况下生成多个有效掩码来处理棘手的情况。以用户提示寻找 Waldo 为例:


source
SAM 的结果具有开创性的原因之一是分割掩码与ViTDet等其他技术相比有多好。下图显示了两种技术的比较:

研究论文更详细地比较了这两种技术的结果

深入了解 SAM 的网络架构和设计

SAM 的设计取决于三个主要组件:

1. 可提示的分割 任务可实现零样本泛化。
2. 模型架构。
3. 为任务和模型提供支持的数据集。

任务

SAM 接受了数百万张图像和超过十亿个掩码的训练,可为任何提示返回有效的分割掩码。在这种情况下,提示是分割任务,可以是前景/背景点、粗框或遮罩、点击、文本,或者一般来说,指示图像中要分割的内容的任何信息。该任务也用作模型的预训练目标。

模型

SAM 的架构包含三个组件,它们协同工作以返回有效的分割掩码:

  • 一种图像编码器,用于生成一次性图像嵌入。
  • 嵌入提示的提示编码器
  • 结合了提示和图像编码器的嵌入的轻量级掩码解码器


我们将在下一节中更深入地研究架构,但现在,让我们看一下数据集。

数据引擎(data engine)和数据集

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

  • Assisted-manual,其中 SAM 协助注释者注释掩码,类似于经典的交互式分割设置。
  • 半自动,其中 SAM 可以通过提示可能的对象位置来自动为对象子集生成掩码,并且注释器专注于注释其余对象,从而有助于增加掩码多样性。
  • 全自动,人工注释者用前景点的规则网格提示 SAM,每张图像平均产生 100 个高质量掩码。

数据引擎构建大段任何 10 亿掩码数据集 Meta AI 发布

SAM

图像编码器

在最高级别上,图像编码器(掩盖的自动编码器,MAE,预训练的视觉变压器,VIT)会生成一次性的图像嵌入,并且可以在提示模型之前应用。

提示编码器

提示编码器将背景点、遮罩、边界框或文本实时编码到嵌入向量中。该研究考虑了两组提示:稀疏(点、框、文本)和密集(掩码)。

点和框由位置编码表示,并为每种提示类型添加学习嵌入。自由格式的文本提示由来自CLIP 的现成文本编码器表示。Dense prompts,如masks,嵌入卷积并与图像嵌入逐元素求和.

掩码解码器

轻量级掩码解码器根据来自图像和提示编码器的嵌入预测分割掩码。它将图像嵌入、提示嵌入和输出标记映射到掩码。所有嵌入都由解码器块更新,解码器块在两个方向(从提示到图像嵌入和返回)使用提示自我注意交叉注意

掩码被注释并用于更新模型权重。这种布局增强了数据集,并允许模型随着时间的推移学习和改进,使其高效灵活。

分割任何 10 亿掩码数据集

Segment Anything 10 亿掩码(SA-1B) 数据集是迄今为止最大的标记分割数据集。它专为高级分割模型的开发和评估而设计。

我们认为数据集将成为训练和微调未来通用模型的重要组成部分。这将使他们能够在不同的分割任务中取得卓越的表现。目前,该数据集仅在研究许可下可用。

SA -1B 数据集的独特之处在于:

多样性

数据集经过精心策划,涵盖广泛的领域、对象和场景,确保模型可以很好地泛化到不同的任务。它包括来自各种来源的图像,例如自然场景、城市环境、医学图像、卫星图像等。

这种多样性有助于模型学习分割具有不同复杂性、规模和上下文的对象和场景。

大小

SA-1B 数据集包含超过 10 亿张高质量注释图像,为模型提供了充足的训练数据。庞大的数据量有助于模型学习复杂的模式和表示,使其能够在不同的分割任务上实现最先进的性能。

高质量注释

数据集已经用高质量的掩码仔细注释,导致更准确和详细的分割结果。在SA-1B 数据集的Responsible AI (RAI) 分析中,调查了地理和收入分配中潜在的公平问题和偏见。

研究论文表明,与其他开源数据集相比,SA-1B 中来自欧洲、亚洲和大洋洲以及中等收入国家的图像比例要高得多。值得注意的是,SA-1B 数据集包含至少 2800 万个所有地区的口罩,包括非洲。这是之前任何数据集中掩码总数的 10 倍。

Segment Anything 模型开源吗?

简短的回答是肯定的!SA-1B 数据集已作为研究目的开源发布https://github.com/facebookresearch/segment-anything. 此外,根据 FAIR 对开放研究的承诺,Meta AI 在 Apache 2.0(一种许可许可)下发布了预训练模型(大小约为 2.4 GB)和代码。它可以在 GitHub 上免费访问。还提供了训练数据集以及交互式演示 Web UI

有关Nikolaj Buhl : Segment Anything 模型 (SAM) 解释的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  3. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  4. ruby-on-rails - 如何验证非模型(甚至非对象)字段 - 2

    我有一个表单,其中有很多字段取自数组(而不是模型或对象)。我如何验证这些字段的存在?solve_problem_pathdo|f|%>... 最佳答案 创建一个简单的类来包装请求参数并使用ActiveModel::Validations。#definedsomewhere,atthesimplest:require'ostruct'classSolvetrue#youcouldevencheckthesolutionwithavalidatorvalidatedoerrors.add(:base,"WRONG!!!")unlesss

  5. ruby-on-rails - form_for 中不在模型中的自定义字段 - 2

    我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢

  6. ruby-on-rails - 如何将验证与模型分开 - 2

    我有一些非常大的模型,我必须将它们迁移到最新版本的Rails。这些模型有相当多的验证(User有大约50个验证)。是否可以将所有这些验证移动到另一个文件中?说app/models/validations/user_validations.rb。如果可以,有人可以提供示例吗? 最佳答案 您可以为此使用关注点:#app/models/validations/user_validations.rbrequire'active_support/concern'moduleUserValidationsextendActiveSupport:

  7. ruby-on-rails - Rails 模型——非持久类成员或属性? - 2

    对于Rails模型,是否可以/建议让一个类的成员不持久保存到数据库中?我想将用户最后选择的类型存储在session变量中。由于我无法从我的模型中设置session变量,我想将值存储在一个“虚拟”类成员中,该成员只是将值传递回Controller。你能有这样的类(class)成员吗? 最佳答案 将非持久属性添加到Rails模型就像任何其他Ruby类一样:classUser扩展解释:在Ruby中,所有实例变量都是私有(private)的,不需要在赋值前定义。attr_accessor创建一个setter和getter方法:classUs

  8. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

  9. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

  10. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

随机推荐