jjzjj

CV大一统模型的第一步!Segment Anything Model 最全解读!

Datawhale 2023-07-08 原文

 Datawhale干货 

作者:崔腾松,Datawhale成员

前言

Meta 开源万物可分割 AI 模型:segment anything model (SAM)。

本文列举了一些资料,并从SAM的功能介绍、数据集、数据标注、图像分割方法介绍,研发思路以及对未来的展望来展开详细介绍。并综合了一些评价谈论,放眼当下和展望未来,给出了一些个人的想法和看法。

资料

  • 论文地址1:https://arxiv.org/abs/2304.02643

  • 论文地址2:https://ai.facebook.com/research/publications/segment-anything/

  • 项目地址:https://github.com/facebookresearch/segment-anything

  • Demo 地址:https://segment-anything.com/

  • SA-1B数据集:https://ai.facebook.com/datasets/segment-anything/

  • 参考链接:https://ai.facebook.com/blog/segment-anything-foundation-model-image-segmentation/

  • 论文翻译:https://emoumcwvfx.feishu.cn/docx/D971dWcuMoyMJUxE1Mfc1fwPn7c

浅谈 segment-anything

展望未来

  • Meta 在论文中发布的新模型名叫 Segment Anything Model (SAM) 。

  • 如标题所述,这篇论文只做了一件事情:(零样本)分割一切。类似 GPT-4 已经做到的「回答一切」。

  • 将 NLP 的 prompt 范式引入了 CV 领域,进而为 CV 基础模型提供更广泛的支持与深度研究。

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

  • 可以预想,今年这类范式在学术界将迎来一次爆发。其肯定会对CV的研究带来巨大的变革,很多任务会被统一处理,可能再过不久,检测、分割和追踪也会被all in one了。

  • 新数据集+新范式+超强零样本泛化能力。

放眼当下

  • 虽然作者们声称要“segment everything”,但距离这个目标还有很长的路要走。CV最大的困难之一,就是图像语义可以无限细分,且逻辑关系非常复杂。势必会遇到识别的粒度和确定性之间的冲突。至少到目前为止,没有任何方法可以解决这个问题,也就没法做到真正的万物分割。

  • 不过这个工作确实把 engineering 做到了极致,而且上手即用,非常方便。

  • SAM其实缩小了大厂和小厂的差距,使得大部分没有资源和数据训练视觉 foundation model 的人,都可以使用SAM的特征做各种下游任务。

  • 下游任务所面临的困难或许比预训练还要更多!但是不管怎么说,我看好SAM作为 foundation model 的潜力,它很可能拥有与CLIP比肩的影响力,未来将为大量的视觉任务提供基础能力。

  • 最后还是强调:CV还有很长的路要走,不要散布恐慌,自己吓自己。

评价谈论

  • 英伟达人工智能科学家 Jim Fan 表示:「对于 Meta 的这项研究,我认为是计算机视觉领域的 GPT-3 时刻之一。它已经了解了物体的一般概念,即使对于未知对象、不熟悉的场景(例如水下图像)和模棱两可的情况下也能进行很好的图像分割。最重要的是,模型和数据都是开源的。恕我直言,Segment-Anything 已经把所有事情(分割)都做得很好了。」

  • 网友表示,NLP 领域的 Prompt 范式,已经开始延展到 CV 领域了,可以预想,今年这类范式在学术界将迎来一次爆发。

  • 更是有网友表示蚌不住了,SAM 一出,CV 是真的不存在了。投稿 ICCV 的要小心了。

  • 也有人表示,该模型在生产环境下的测试并不理想。或许,这个老大难问题的解决仍需时日?

  • 总而言之,未来已来,CV的LM时代将彻底开启,至少标注是肯定不存在了

SAM功能介绍

  • 通用涵盖广泛的用例(学会了关于物体的一般概念)。

  • 零样本迁移(可以在新的图像领域上即开即用,无需额外的训练)。

  • SAM 能很好地自动分割图像中的所有内容。

  • SAM 能根据提示词进行图像分割。

  • SAM 能用交互式点和框的方式进行提示。

  • SAM 能为不明确的提示生成多个有效掩码。可以为任何图像或视频中的任何物体(包括训练中没有的)生成 mask。

SA-1B数据集

  • 图像注释数据集 Segment Anything 1-Billion (SA-1B)

  • 有史以来最大的分割数据集,超过 11 亿个分割掩码,掩码具有高质量和多样性。

  • SAM 在不同群体中的表现类似,在拥有更多图像的同时对所有地区的总体代表性也更好。

  • SA-1B 可用于研究目的,开放许可Apache 2.0。可以帮助其他研究人员训练图像分割的基础模型。

Meta数据标注:Data Is All You Need!

Meta或许在憋大招,正所谓兵马未动粮草先行,为了攒数据而开发了这么一个副产物,顺便放了出来。

注释员使用 SAM 交互式地注释图像,然后新注释的数据反过来用于更新 SAM,彼此相互作用,重复执行此循环来改善模型和数据集。

  1. 先用开源数据集训练一个小模型

  2. 标注员用训好的模型辅助标注,优先标好标的。如果图中一个instance开始花费超过30s就可以跳下一张图了

  3. 用新增的label在大模型上重新训练,并重复第2步。随着模型能力的增强,之前难标的会逐渐变成好标的

  4. 第3步迭代6次后,开始攻克剩余所有困难的instance。先用模型把容易的instance都mask掉,剩下的就得拿去标了。

方法介绍

Pre-分割任务

  • 在此之前,分割作为计算机视觉的核心任务,已经得到广泛应用。

  • 为特定任务创建准确的分割模型,通常需要技术专家进行高度专业化的工作

  • 需要大量的领域标注数据,种种因素限制了图像分割的进一步发展。

此前解决分割问题大致有两种方法。

  • 交互式分割,该方法允许分割任何类别的对象,但需要一个人通过迭代细化掩码来指导该方法。

  • 自动分割,允许分割提前定义的特定对象类别(例如,猫或椅子),但需要大量的手动注释对象来训练(例如,数千甚至数万个分割猫的例子)。

Now-SAM

SAM 单一模型,可以轻松地执行交互式分割和自动分割。此任务用于预训练模型并通过提示解决一般的下游分割任务。

  • 灵活方便:SAM 允许用户通过单击、交互式点击或边界框提示来分割对象。提示可以是前景、背景点、粗框或掩码、自由格式文本,或者说能指示图像中要分割内容的任何信息。

  • 有效掩码的要求:即使提示不明确并且可能指代多个对象,还能为为不明确的提示生成多个有效掩码。当面临关于正在分割的对象歧义时,SAM可以输出多个有效掩码,这是解决现实世界中分割问题所必需的重要能力;

  • 可以自动查找并遮罩图像中的所有对象:在预计算图像嵌入后,SAM 可以为任何提示生成实时分割掩码,允许与模型进行实时交互。图像编码器为图像生成一次性嵌入,而轻量级编码器将提示实时转换为嵌入向量。然后将这两个信息源组合在一个预测分割掩码的轻量级解码器中。在计算图像嵌入后,SAM 可以在 50 毫秒内根据网络浏览器中的任何提示生成一个分割。

研发思路

开发一个可提示的模型并使用一项任务在广泛的数据集上进行预训练,以实现强大的泛化。通过这个模型,我们的目标是使用提示工程解决一系列新的数据分布上的下游分割问题。这个计划的成功取决于三个组成部分:任务、模型和数据。

SAM 的研发灵感来自于自然语言和计算机视觉中的 “prompt 工程”,只需对新数据集和任务执行零样本学习和少样本学习即可使其能够基于任何提示返回有效的分割掩模。其中,提示可以是前景/背景点、粗略框或掩模、自由文本或者一般情况下指示图像中需要进行分割的任何信息。有效掩模的要求意味着即使提示不明确并且可能涉及多个对象(例如,在衬衫上的一个点既可能表示衬衫也可能表示穿着它的人),输出应该是其中一个对象合理的掩模。这项任务用于预训练模型,并通过提示解决通用下游分割任务。

未来展望

将来,SAM 可能被用于任何需要在图像中找到和分割任何对象的领域应用程序。

  • 通过研究和数据集共享,进一步加速对图像分割以及更通用图像与视频理解的研究。

  • 可提示的分割模型可以充当更大系统中的一个组件,执行分割任务。

  • 基于 prompt 工程等技术的可组合系统设计将支持更广泛的应用。可以成为 AR、VR、内容创建、科学领域和更通用 AI 系统的强大组件。

    • 对于 AI 研究社区或其他人来说,SAM 可能更普遍理解世界、例如理解网页视觉和文本内容等更大型 AI 系统中组件;

    • 在 AR/VR 领域,SAM 可以根据用户注视选择一个对象,然后将其“提升”到 3D;

    • 对于内容创作者来说,SAM 可以改进诸如提取碎片或视频编辑等创意应用程序;

    • SAM 也可用来辅助科学领域研究,如地球上甚至空间自然现象, 例如通过定位要研究并跟踪视频中的动物或物体。SAM 还有可能在农业领域帮助农民或者协助生物学家进行研究。未来在像素级别的图像理解与更高级别的视觉内容语义理解之间,我们将看到更紧密的耦合,进而解锁更强大的 AI 系统。

先行者试跑demo的感受

模型推理速度挺快的,在单块V100上,对于1200x800这种正常分辨率的图,生成所有的mask需要2-3秒。这种速度,可以为大部分人提供可用的feature extractor了。

  1. 当前版本下,作者们并没有提供标准的text prompt做法,所以输出的mask都没有标签。我有两个猜测:要么效果还不是很好,要么FAIR想单独出个别的paper。按照FAIR的风格,不做这最后一步,有点不能理解,毕竟这能够轻松刷掉一堆分割任务的SOTA。

  2. 我尝试用GitHub的issue#6里的“野路子”,抽取了文本的CLIP特征然后用来做prompt。实验效果比较一般:很多物体的score并不高,比如一个水果摊上放着很多水果的时候,明明能够认出一个个的橙子,但是用orange作为query,score大多数情况下只有0.02左右,很不稳定。结合这个实验,我更倾向于上面的前一种猜测:SAM开放环境下的zero-shot recognition能力还不太稳定。

如果我的判断是对的,那么这里就还有不少相对简单的事情可以做。当然,复杂的事情更多:毕竟SAM没有解决逻辑问题,zero-shot效果也未必好,那么在各种下游任务上,大家就有了各显神通、施展才艺的空间。

一起点赞三连

有关CV大一统模型的第一步!Segment Anything Model 最全解读!的更多相关文章

  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-on-rails - Ruby 中的内存模型 - 2

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

  10. ruby-on-rails - Rails 3.1 中具有相同形式的多个模型? - 2

    我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#

随机推荐