SAM:基于 prompt 的通用图像分割模型

Paper: Kirillov A, Mintun E, Ravi N, et al. Segment anything[J]. arXiv preprint arXiv:2304.02643, 2023.
Introduction: https://segment-anything.com/
Code: https://github.com/facebookresearch/segment-anything

SAM 是 Meta AI 开发的一款基于 prompt 的通用视觉大模型,能够 zero-shot 识别并分割给定图像中任意类型的目标,并且能够迁移到其他任务中。SAM 的动机是为了建立一个通用的图像分割基础模型,类似于 NLP 领域的 GPT-3,可以在不需要额外训练的情况下,适应各种下游任务和数据集。

在这里插入图片描述

本文不再按照论文解读的方式逐段记录,只专注于介绍 SAM 技术本身,参考 五分钟看明白分割一切模型 SAM。

目录

  • 一. 背景
  • 二. SAM 模型
  • 三. 训练方法
  • 四. 总结
  • 五. 复现

一. 背景

SAM 模型的目标是实现图像的交互式分割,即根据用户提供的 prompt 来划分图像中的不同对象或区域。但想要根据用户 prompt 分割图像是一个复杂的问题,因为 prompt 可能不完整、不清晰、甚至不准确,图像中的对象或区域也可能是多样、复杂、模糊或重叠的。

为了能够理解图像内容和用户意图,SAM 使用基于 transformer 的视觉模型,可以在不需要任何标注的情况下,对任意图像进行分割。它的输入包括一个图像和 prompt,prompt 可以是点、框、文本或者掩码,用来指示要分割的目标;输出是一个分割掩码,表示图像中每个像素属于前景或背景的概率。
在这里插入图片描述

二. SAM 模型

SAM 模型基于 Transformer 架构,主体包含以下三个部分:

  • 图像编码器 (image encoder):使用 ViT 将图像编码为特征向量;
  • 提示编码器 (prompt encoder):使用 MLP 将用户提供的 prompt(点、框、文本等)编码为 prompt 向量;
  • 掩码解码器 (mask decoder):使用另一个 MLP 将图像特征向量和 prompt 向量结合起来,生成每个像素的掩码概率;

在这里插入图片描述

Pipeline 如下图所示,图像编码器将图像编码为特征向量,提示编码器将 prompt 映射到同样的特征空间,掩码解码器将两个特征融合并解码出最终的分割掩码。如果 prompt 较为模糊,对应多个对象,SAM 还可以输出多个有效的掩码和相关的置信度:
在这里插入图片描述

为了将 Transformer 应用到图像上,图像编码器 首先将图像划分为多个小块,每个小块对应一个像素块,然后将每个像素块的颜色值转化成一个向量,作为 Transformer 的输入序列。这样,每个像素块就相当于 Transformer 中的一个词,而图像就相当于 Transformer 中的一个句子。

为了将用户 prompt 作为 Transformer 的输入,提示编码器 将不同类型的提示转换为统一的向量表示,然后与图像特征向量拼接在一起,作为 Transformer 的输入序列。这样,每个提示就相当于 Transformer 中的一个词,而图像和提示的组合就相当于 Transformer 中的一个句子。

通过 Transformer 的 self-attention 机制,掩码解码器 可以计算图像中每个像素块与其他像素块以及用户的提示之间的相关性,从而学习图像的结构和语义信息,以及用户的意图信息。然后,SAM 模型使用一个线性层,将 Transformer 的输出序列映射为一个分割掩码,表示每个像素块的标签:
在这里插入图片描述

三. 训练方法

SAM 强大的分割能力源于它庞大的数据集 SA-1B —— 一个包含超过 10 亿 mask 的大规模视觉数据集,覆盖了各种物体、场景和类别。这使得它具有强大的 视觉表示能力零样本泛化能力,可以直接使用预训练的模型通过简单的提示来分割未见过的目标,而不需要像以往的分割模型那样为每个任务进行专门的训练或微调,从而节省了大量的时间和资源。
在这里插入图片描述

为了实现强大的泛化能力,SAM 需要在大规模和多样化的 mask 上进行训练。但现有 mask 的训练数据较少,不能够满足 SAM 的需求。因此,SAM 提出了 数据引擎 (data engine) 策略,即收集数据与模型训练协同进行,包含以下三个阶段:

  • 协助手动 (assisted-manual) 阶段:SAM 协作标注员手动标注 mask;
  • 半自动 (semi-automatic) 阶段:SAM 提示对象可能的位置并自动生成部分 mask,标注员专注于标注 SAM 未能自动生成的其他物体的 mask;
  • 全自动 (fully automatic) 阶段:SAM 接收对象的 foreground points,从而在每张图像上生成多个高质量 mask。

四. 总结

SAM 是一个通用的基于 prompt 的图像分割大模型,可以分割给定图像中的任何目标。其优势在于它可以处理多种类型的 prompt,甚至是多个 prompt 的组合,还可以处理未见过的对象或场景,而不需要额外的训练。这些优势使得 SAM 模型具有强大的泛化能力和灵活性,可以应对各种复杂的图像分割任务。

在这里插入图片描述

自从 SAM 发布以来,基于 SAM 的二次应用和衍生项目越来越多,如:

  • 图像修复:利用 SAM 的 mask 生成能力,可以实现对图像中的缺失或损坏区域的修复,例如去除水印、恢复老照片等;
  • 图像编辑:利用 SAM 的分割能力,可以实现对图像中的对象的编辑,例如更换背景、调整颜色、添加滤镜等;
  • 目标检测:利用 SAM 的边界框提示,可以实现对图像中的对象的检测,例如识别人脸、车辆、动物等;
  • 图像标注:利用 SAM 的文本提示,可以实现对图像中的对象的标注,例如生成图像描述、图像标题、图像问答等;
  • 视频跟踪:利用 SAM 的视频输入,可以实现对视频中的对象的跟踪,例如跟踪运动员、行人、车辆等;
  • 3D 检测:利用 SAM 的点云输入,可以实现对 3D 场景中的对象的检测,例如检测房屋、树木、人群等。

五. 复现

Meta AI 开源了 SAM 的代码,也提供了 在线 demo,支持 point、box、everything三种方式。由于 text prompt 效果不太稳定,因此 demo 和代码中都没有该部分。

以 Demo 为例,鼠标悬停即可显示该位置的分割结果:
在这里插入图片描述

  1. Hover & Click:Add Mask 可以增加 point 以选中目标区域,Remove Area 可以删除 point 以删除不必要的部分;
    在这里插入图片描述
    在这里插入图片描述

  2. Box:Add Mask 可以增加 point 以选中目标区域,Remove Area 可以删除 point 以删除不必要的部分;
    在这里插入图片描述
    在这里插入图片描述

  3. Everything:可以将图片中所有物体的分割 mask 都展示出来;
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/661449.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

100%涨点!2024最新卷积块创新方案盘点(附模块和代码)

在写论文时,设计高效、创新的卷积块可以显著提升模型的性能,保障工作的有效性和先进性。另外,合理利用卷积块还可以帮助我们提升实验结果、拓展研究的视野和应用场景,增加论文的创新点。因此,对于论文er来说&#xff0…

BSV区块链将凭借Teranode的创新在2024年大放异彩

​​发表时间:2024年1月15日 2024年1月15日,瑞士楚格 – BSV区块链协会研发团队今日官宣了Teranode的突破性功能,这些功能将显著提升BSV区块链网络的效率和速度。在不久的将来,BSV区块链的交易处理能力将达到每秒100万笔交易。 T…

粒子群优化算法

PSO算法 粒子群算法(Particle,Swarm Optimization,PSO)由Kennedy和Eberhart于1995年提出,算法模仿鸟群觅食行为对优化问题进行求解。 粒子群算法中每个粒子包含位置和速度两个属性,其中,位置代表了待求问题的一个候选…

安装GPU版本Pytorch(全网最详细过程)

目录 一、前言 二、安装CUDA 三、安装cuDNN 四、安装Anacanda 五、安装pytorch 六、总结 一、前言 最近因为需要安装GPU版本的Pytorch,所以自己在安装过程中也是想着写一篇博客,把整个过程记录下来,在整个过程中也遇到了不少的问题&a…

【开源】基于JAVA+Vue+SpringBoot的用户画像活动推荐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 兴趣标签模块2.3 活动档案模块2.4 活动报名模块2.5 活动留言模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 数据流程设计3.4 E-R图设计 四、系统展示五、核心代码5.1 查询兴趣标签5.2 查询活动推荐…

状态压缩 笔记

棋盘式的f[i][j]中表示状态的j可以是状态本身也可以是在合法状态state中的下标 用状态本身比较方便,用下标比较省空间 用下标的话可以开id[M]数组记录一下 蒙德里安的梦想 求把 NM的棋盘分割成若干个 12的长方形,有多少种方案。 例如当 N2&#xff0…

【Redis】一文搞懂redis的所有知识点

目录 1. 什么是Redis?它主要用来什么的? 2.说说Redis的基本数据结构类型 2.1 Redis 的五种基本数据类型​编辑 2.2 Redis 的三种特殊数据类型 3. Redis为什么这么快?​编辑 3.1 基于内存存储实现 3.2 高效的数据结构 3.3 合理的数据编…

新火种AI|哄哄大模型的火爆,给了普通人AI创业破局的关键

作者:一号 编辑:美美 人们似乎更喜欢把AI当做玩具,而非工具。 近日,一款名为哄哄模拟器的AI原生应用火了,一天之内就吸引了60万用户。 哄哄模拟器设置了多种情侣吵架场景,无论你是男是女,都…

光伏设计系统都具备哪些功能?

随着可再生能源的日益重要,光伏能源已成为我们能源结构中的重要组成部分。而光伏设计系统作为实现光伏能源高效利用的关键,其功能也日益丰富和多样化。本文将探讨光伏设计系统所具备的主要功能。 1.数据分析与模拟 光伏设计系统能够对大量的数据进行分…

【经典项目】Java小游戏 —— 贪吃蛇

一、需求分析 当提到贪吃蛇游戏时,通常是指一款经典的电子游戏,玩家通过操作一个蛇在屏幕上移动,目标是吃掉各种食物并尽量避免碰撞到自己的身体或游戏区域的边界。 贪吃蛇游戏最早出现在20世纪70年代末的个人电脑上,后来在各种游…

使用 Paimon + StarRocks 极速批流一体湖仓分析

摘要:本文整理自阿里云智能高级开发工程师王日宇,在 Flink Forward Asia 2023 流式湖仓(二)专场的分享。本篇内容主要分为以下四部分: StarRocksPaimon 湖仓分析的发展历程使用 StarRocksPaimon 进行湖仓分析主要场景和…

ONLYOFFICE是一站式协作免费开源办公神器

一、前言 众所周知,我们工作都离不开办公软件,一个好的办公软件可以大幅度提高工作效率,就目前市场而言,常见的办公软件有微软的 Microsoft Office 以及国产的 WPS Office,微软的 Microsoft Office是付费的&#xff0…

CANoe实际项目中文件夹的规划

本人,之前设计了一个CANoe工程,由于工程设计之初没有设计好文档的归纳分类,导致文件查找起来非常费劲。 为了避免以后出现文件混乱,不可查找的问题,故特此归纳说明。 建立工程时: 第1步就应该设计好文档…

基于51单片机的加油站计费系统

基于51单片机的加油站计费系统[proteus仿真] 计费检测系统这个题目算是课程设计和毕业设计中常见的题目了,本期是一个108基于51单片机的加油站计费系统 需要的源文件和程序的小伙伴可以关注公众号【阿目分享嵌入式】,赞赏任意文章 2¥&#…

“软件老兵”的新征程:从代码到方案,40岁转身更显智慧锋芒

在快速迭代的软件行业,许多经验丰富的软件工程师,随着年岁的增长,发现自己在纯技术领域的竞争力似乎逐渐不敌那些刚刚踏入职场的00后工程师。 面对这一挑战,一些“软件老兵”选择转换跑道,将目光投向了方案工程师这一新…

Linux同时安装多个版本的JDKlinux多版本JDK切换配置- [Centos 安装JDK]

Linux同时安装多个版本的JDK&linux多版本JDK切换配置- [Centos 安装JDK] 一、查询系统是否已经安装jdk rpm -qa|grep java 或 rpm -qa|grep jdk 或 rpm -qa|grep gcj 二、卸载已安装的jdk Centos7存在已安装的JDK1.7时,可以使用以下方式删除1.7的openJDK rp…

python数据类型-元组

1 元组(tuple)的定义 元组是集合类型,和列表类似,元组中的元组类型可以不同,元素间用逗号隔开,和列表的不同之处在于: 1 元组的元组不可改变,也被称为只读列表 2 且元组用括号()表示,列表用方括…

月入过万比打工强,在家就能做steam搬砖项目真的假的

每天都有粉丝私下跟我聊天,讨论Steam搬砖项目到底是不是真的,到底能不能做。你想让我详细说说。那么今天就和大家详细聊聊这个月入过万元的项目。 简单来说,Steam搬砖项目就是在国外蒸汽上采购游戏道具,在国内网易buff平台上销售…

MySQL 可重复读隔离级别,完全解决幻读了吗?

文章目录 前言一、什么是幻读?二、快照读是如何避免幻读的?三、当前读是如何避免幻读的?四、幻读被完全解决了吗?场景1场景2 总结 前言 MySQL InnoDB 引擎的默认隔离级别虽然是「可重复读」,但是它很大程度上避免幻读…

第 10 章:在C++中使用协程进行系统编程

最后一章专门介绍了一项对系统编程非常有用的功能,但这在C标准中相对较新。协程对象迅速找到了应用,成为了一等公民的状态机对象。它们的强大之处在于隐藏了协程帧后面的逻辑。请注意,这是一个高级主题,且C的协程接口既不简单也不…