草庐IT

一次性分割一切,比SAM更强,华人团队的通用分割模型SEEM来了

机器之心 2023-12-10 原文

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

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

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

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

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

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

先来看一下分割效果:

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

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

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 模型与 SOTA 交互式分割模型进行了实验比较,结果如下表 1 所示。

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

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

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

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

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

该项目已经可以线上试玩,感兴趣的读者快去试试吧。

有关一次性分割一切,比SAM更强,华人团队的通用分割模型SEEM来了的更多相关文章

  1. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  2. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  3. ruby-on-rails - Rake 任务仅调用一次时执行两次 - 2

    我写了一个非常简单的rake任务来尝试找到这个问题的根源。namespace:foodotaskbar::environmentdoputs'RUNNING'endend当在控制台中执行rakefoo:bar时,输出为:RUNNINGRUNNING当我执行任何rake任务时会发生这种情况。有没有人遇到过这样的事情?编辑上面的rake任务就是写在那个.rake文件中的所有内容。这是当前正在使用的Rakefile。requireFile.expand_path('../config/application',__FILE__)OurApp::Application.load_tasks这里

  4. ruby - 我怎样才能只写一次 "Text"并同时检查 path_info 是否包含 'A' ? - 2

    -if!request.path_info.include?'A'%{:id=>'A'}"Text"-else"Text"“文本”写了两次。我怎样才能只写一次并同时检查path_info是否包含“A”? 最佳答案 有两种方法可以做到这一点。使用部分,或使用content_forblock:如果“文本”较长,或者是一个重要的子树,您可以将其提取到一个部分。这会使您的代码变干一点。在给出的示例中,这似乎有点矫枉过正。在这种情况下更好的方法是使用content_forblock,如下所示:-if!request.path_info.inc

  5. ruby-on-rails - 使用 Ruby 正确处理 Stripe 错误和异常以实现一次性收费 - 2

    我查看了Stripedocumentationonerrors,但我仍然无法正确处理/重定向这些错误。基本上无论发生什么,我都希望他们返回到edit操作(通过edit_profile_path)并向他们显示一条消息(无论成功与否)。我在edit操作上有一个表单,它可以POST到update操作。使用有效的信用卡可以正常工作(费用在Stripe仪表板中)。我正在使用Stripe.js。classExtrasController5000,#amountincents:currency=>"usd",:card=>token,:description=>current_user.email)

  6. ruby - 为什么在 Ruby 中一切都是 Class 的实例? - 2

    这个问题在这里已经有了答案:Rubymetaclassconfusion(4个答案)关闭7年前。我对Ruby对象模型不太了解。首先,Ruby中的一切都是Class的实例吗??这些都产生true:pObject.instance_of?(Class)pClass.instance_of?(Class)pModule.instance_of?(Class)pBasicObject.instance_of?(Class)classHello;endpHello.instance_of?(Class)我不太明白这怎么可能,如果Object是Class的父类(superclass),它怎么可能都

  7. ruby - 如何在 Ruby 中只执行一次方法?有静态变量吗? - 2

    我写了一个脚本,其中包含一些方法定义,没有类和一些公共(public)代码。其中一些方法执行一些非常耗时的shell程序。然而,这些shell程序只需要在第一次调用该方法时执行。现在在C中,我会在每个方法中声明一个静态变量,以确保这些程序只执行一次。我怎么能在Ruby中做到这一点? 最佳答案 ruby中有一个成语:x||=y。defsomething@something||=calculate_somethingendprivatedefcalculate_something#somelongprocessend但是如果您的“长时间

  8. ruby - 格式化数字以每隔三位数拆分一次 - 2

    我想在格式化数字时每隔三个字符放置一个空格。根据这个规范:it"shouldformatanamount"dospaces_on(1202003).should=="1202003"end我想出了这段代码来完成这项工作defspaces_onamountthousands=amount/1000remainder=amount%1000ifthousands==0"#{remainder}"elsezero_padded_remainder='%03.f'%remainder"#{spaces_onthousands}#{zero_padded_remainder}"endend所以我

  9. ruby-on-rails - 你如何编写一个只为测试文件执行一次的设置方法? - 2

    我希望有一种方法可以针对每个文件运行一次,而不是针对每个测试运行一次。我已经看到一些对“之前”方法的引用,但似乎不适用于MiniTest。理想情况下,像这样:classMyTest 最佳答案 Before用于minitest使用specdsl时,相当于setup。您可以使用setup,如果您在test_helper.rb文件中使用setup,它将在所有测试之前执行一次。设置也可以在测试类中声明。使用设置,放置一个标志并在第一次更新标志。x=0setupdoifx==0x=x+1puts"Incrementedinx=#{x}"end

  10. ruby - 如何让 Ruby 每 10 分钟运行一次任务? - 2

    我想每10分钟执行一次cron作业,但我的系统只执行1小时。所以我正在寻找一种方法来做到这一点。我看过Timer和sleep但我不确定如何执行此操作,甚至不知道如何实现此操作。 最佳答案 看看http://rufus.rubyforge.org/rufus-scheduler/rufus-scheduler是一个用于调度代码片段(作业)的Rubygem。它了解在特定时间、在特定时间、每x次或仅通过CRON语句运行作业。rufus-scheduler不能替代cron/at,因为它在Ruby内部运行。

随机推荐