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

news2024/11/16 17:27:55

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.coloradmin.cn/o/1423707.html

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

相关文章

笔记---中国剩余定理

全程学自y总 AcWing.204.表达整数的奇怪方式 给定 2 n 2n 2n 个整数 a a a1, a a a2,…, a a an 和 m m m1, m m m2,…, m m mn,求一个最小的非负整数 x x x,满足 ∀ i ∈ [ 1 , n ] , x ≡ m ∀i∈[1,n],x≡m ∀i∈[1,n],x≡mi ( m o d a (mod a (…

AI-数学-高中-14-函数零点存在定理和运用

原作者视频:【函数综合】【考点精华】1零点存在性定理的运用(基础)_哔哩哔哩_bilibili 1.定义: 2.零点存在定义: 2.函数零点与图像焦点的转化 零点如果不好求,将函数化成两个函数再画图,看函数…

Elasticsearch:构建自定义分析器指南

在本博客中,我们将介绍不同的内置字符过滤器、分词器和分词过滤器,以及如何创建适合我们需求的自定义分析器。更多关于分析器的知识,请详细阅读文章: 开始使用 Elasticsearch (3) Elasticsearch: analyzer…

uni-app在hbuilderx打开微信开发工具运行

一、运行设置配置微信开发者工具路径 运行-运行到小程序模拟器-运行设置 配置微信开发工具的安装路径(可浏览文件位置选择);web服务器端口号在第二步骤获得; 二、打开微信开发者工具设置-安全设置 打开服务端口开关&#xff0…

C# webbrowser控件设置代理IP访问网站

目录 前言 一、WebBrowser控件简介 二、代理IP简介 三、设置WebBrowser控件的代理IP 1. 引入相关命名空间 2. 定义修改代理IP的函数 3. 修改代理IP 4. 取消代理IP设置 四、使用WebBrowser控件访问代理IP 五、完整示例代码 总结 前言 C# WebBrowser控件是一个非常常…

Linux+服务器后台运行程序

在Linux服务器直接运行程序,程序运行的时间较长,程序经常会因为网络连接问题异常终止,一直盯着程序运行又费时费力,这时后台运行程序是更好的解决方式。But,如果服务器重启了,那所有进程都断掉了&#xff0…

ArrayList集合初始化长度是多少,初始化的时候分配内存空间吗

ArrayList一旦初始化,在内存中就会分配空间吗 是的,当ArrayList在Java中初始化时,即使它没有添加任何元素,也会立即分配内存空间。具体来说,对于默认构造函数创建的ArrayList(即不指定初始容量&#xff09…

Python代码覆盖率工具

Coverage.py是一个用于测量Python程序代码覆盖率的工具。它监视您的程序,注意代码的哪些部分已经执行,然后分析源代码,以确定哪些代码本可以执行,但没有执行。 覆盖率测量通常用于衡量测试的有效性。它可以显示代码的哪些部分正在…

Yolo v8 入门学习之采用 coco128 数据集进行图片检测测试

示例入门代码 from ultralytics import YOLO import cv2 import matplotlib.pyplot as plt import matplotlib.image as mpimgdef test():# Create a new YOLO model from scratchmodel YOLO(yolov8n.yaml)# Load a pretrained YOLO model (recommended for training)model …

【Cookie反爬虫】某采购网站动态Cookie加点选验证码校验分析与实战

文章目录 1. 写在前面2. 请求分析3. JS反混淆4. 深度分析 【作者主页】:吴秋霖 【作者介绍】:Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作! 【作者推荐】:对JS逆向感兴趣的朋…

CentOS7中安装ElasticSearch

文章目录 检测是否安装了Elasticsearch安装JDK下载java配置 下载Elasticsearch解压安装Elasticsearch修改配置文件启动Elasticsearch常见问题 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasti…

Kotlin 协程1:深入理解withContext

Kotlin 协程1:深入理解withContext 引言 在现代编程中,异步编程已经变得非常重要。在 Kotlin 中,协程提供了一种优雅和高效的方式来处理异步编程和并发。在这篇文章中,我们将深入探讨 Kotlin 协程中的一个重要函数:wi…

SpringMVC实现对网页的访问,在请求控制器中创建处理请求的方法

目录 测试HelloWorld RequestMapping注解 RequestMapping注解的位置 RequestMapping注解的value属性 RequestMapping注解的method属性 SpringMVC支持路径中的占位符(重点) SpringMVC获取请求参数 1、通过ServletAPI获取 2、通过控制器方法的形参…

华为VRP系统简介

因为现在国内主流是华为、华三、锐捷的设备趋势,然后考的证书也是相关的,对于华为设备的一个了解也是需要的。 一、VRP概述 华为的VRP(通用路由平台)是华为公司数据通信产品的通用操作系统平台,作为华为公司从低端到核心的全系列路由器、以太…

Narak靶机渗透

靶场下载地址:https://download.vulnhub.com/ha/narak.ova 一、靶机配置 导入靶机 攻击机kali的IP为192.168.245.131,靶机的IP设置成NAT模式。 二、信息搜集 用攻击机对存活主机进行扫描及端口探测 对发现的存活主机进行全端口扫描,还是只开…

Mac删除自带的ABC输入法,简单快捷

一、下载PlistEdit Pro软件 二、终端执行 sudo open ~/Library/Preferences/com.apple.HIToolbox.plist 三、其中有一个数字下面的KeyboardLayout Name的value为“ABC”,这就是ABC输入法,点击上面的Delete按钮,删除整项ABC内容&#xff0c…

设置frp在ubuntu开机自启

要在 Ubuntu 上启动 FRP,您可以按照以下步骤进行操作: 下载适用于 Ubuntu 的 FRP。您可以从官方网站下载最新版本的 FRP:https://github.com/fatedier/frp/releases 解压下载的 FRP 文件。您可以使用以下命令从终端解压文件: t…

面试篇-SpringBoot自动配置原理

在Spring Boot中,自动装配是一种强大的功能,它允许开发者快速、简单地配置和管理应用程序的组件。以下是对Spring Boot自动装配原理的详细解释: Spring BootApplication注解源码: SpringBootApplication注解是一个复合注解&#x…

91 C++对象模型探索。RTTI运行时类型识别回顾 与 存储位置介绍

一,RTTI 运行时类型识别,简单回顾 C运行时类型识别RTTI,要求父类这种必须 至少有一个虚函数,如果父类中没有虚函数,那么得到的RTTI就不准确; RTTI就可以在执行期间查询一个多态指针,或者多态应…