SAM:segment anything model——一个通用的图像分割基础模型

news2024/11/19 5:57:46

文章目录

  • 一、Segment Anything Task
  • 二、SAM模型的架构
    • (一)图像编码器image encoder
    • (二)prompt encoder
    • (三)mask decoder
  • 三、SAM 模型的思想
    • (一)Transformer的自注意力机制
    • (二)用户提示的融入
  • 四、Segment Anything Data Engine


Segment Anything(SA)项目:一个用于图像分割的新任务、新模型和新数据集
在这里插入图片描述
通过FM(基础模型)+prompt解决了CV中难度较大的分割任务,给计算机视觉实现基础模型+提示学习+指令学习提供了一种思路
关键:加大模型容量(构造海量的训练数据,或者构造合适的自监督任务来预训练)

一、Segment Anything Task

  1. 目标:创建一个类似NLP领域的foundation model(例如GPT),它是一种使用prompt engineering机制的预训练模型并可以灵活地解决下游任务;
  2. SAM 模型是一个提示型模型,可以在不需要任何标注的情况下,对任意图像进行分割:
    • 输入包括一个图像和一个提示,提示可以是点、框、文本或者掩码,用来指示要分割的目标;
    • 输出是一个分割掩码,表示图像中每个像素属于前景或背景的概率;
  3. 与以往的分割模型相比,SAM 的本质区别在于它不需要为每个任务或数据集进行专门的训练或微调,而是可以直接使用预训练的模型来完成分割任务,从而节省了大量的时间和资源。

二、SAM模型的架构

SAM(segment anything model)模型总体上分为3大块:

  • 绿色的image encoder,将图像编码为向量;
  • 紫色prompt encoder,将支持的prompt 内容编码为向量;
  • 橙色的mask解码器,将两个特征融合并解码出最终的分割掩码(使用产生的text embedding和image embedding 在mask decoder模块进行对齐)。
    在这里插入图片描述

(一)图像编码器image encoder

SAM中的图像编码器使用 MAE预训练的Vision Transformer (ViT) 作为图像编码器,可以适应高分辨率输入。具体的图像编码器支持vit-h,vit-l,vit-b,vit经过了MAE方式的预训练,MAE属于图像中自监督学习的一种,如下图:
在这里插入图片描述

  • 在MAE中原始图像如vit切割成不重叠的patch
  • 保留部分patch进入vit架构的encoder进行学习patch的表示,学习到的patch表示和mask(灰色)的表示
  • 按照原始的patch顺序输入到vit架构的decoder,得到复原图像。

训练完成后我们只使用encoder来提取图像特征。从原始模型可以看出,图像的表征embedding是不变的,也就可以在已经编码好的图像embedding多次进行不同的prompt输入得到期望的结果,这个对交互式分割的场景是非常有用的。

(二)prompt encoder

基于分割的任务需求,SAM 支持的prompt可以分为稀疏类型和稠密类型两类。

  1. 稀疏类型(sparse prompt):包含 point,bbox,free text。
    对于point和bbox两类标记:采用sincos的位置编码+学习的类别编码
    对于free text标记:采用clip预训练好的text encoder 作为文本编码器

  2. 稠密类型(dense prompt)
    掩码标记:卷积+使用图像编码进行逐像素求和
    (在SAM中使用粗略的分割结果作为稠密的prompt输入,这里通过卷积进行特征提取)

(三)mask decoder

  1. mask decoder的核心:
    用transformer 学习和prompt对齐后的image embedding 以及额外4个token的embedding

4个token embedding:
iou token embedding和3个分割结果 token的embedding,经过transformer 学习得到token 的embedding 会用于最终的任务头,得到目标结果。

在这里插入图片描述

  1. transformer的三个输入:
  • token embedding(将文本中的单词或token映射到连续向量空间的过程);
  • src(image embedding 和dense prompt embedding的求和);
  • pos_src(图像的位置编码)。
  1. 在transformer中每层做以下四件事情:
  • token embedding 做self attention 计算;
  • token embedding 和src 之间做cross attention 计算;
  • src 和token embedding 之间做cross attention 计算;
  • 第2和3之间有前馈mlp网络;cross attention的结果通过残差方式相加并norm。
  1. transform最终输出前,token embedding 还需要和src 做一次cross attention。transform返回的3个mask token的embedding经过3层mlp后,与对齐后的图像embedding点击得到3个最终的分割结果;iou token 经过mlp得到3个分割结果置信度得分。

三、SAM 模型的思想

(一)Transformer的自注意力机制

SAM 模型是一个基于 Transformer 的视觉模型,它可以将图像和用户的提示作为输入,输出一个分割掩码,表示每个像素的标签。SAM 模型的关键是如何利用 Transformer 的自注意力机制,来学习图像和提示之间的关系,以及图像内部的结构和语义信息。

Transformer的自注意力机制:
Transformer 的特点是使用自注意力机制,来计算序列中每个元素与其他元素的相关性,从而捕捉序列的全局依赖关系。自注意力机制的公式如下:
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt {d_k}})V Attention(Q,K,V)=softmax(dk QKT)V
其中, Q Q Q K K K V V V分别表示查询(query),键(key),值(value)矩阵, d k d_k dk是键的维度,softmax是归一化函数。

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

  • 为了将用户的提示也作为 Transformer 的输入,SAM 模型使用了一种称为提示编码器(prompt encoder)的模块,它可以将不同类型的提示转换为统一的向量表示,然后与图像的向量表示拼接在一起,作为 Transformer 的输入序列。这样,每个提示就相当于 Transformer 中的一个词,而图像和提示的组合就相当于 Transformer 中的一个句子。

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

(二)用户提示的融入

SAM 模型的重点在于它能够理解图像内容、用户意图以及它们之间的关联。具体来说,SAM 模型是通过一个掩码解码器 (Mask decoder) 来融合图像编码器和提示编码器的输出的。掩码解码器的关键思想在于Transformer 的自注意力机制和交叉注意力机制

四、Segment Anything Data Engine

数据产生的三个阶段:

  1. 辅助人工标注:模型辅助的手动注释阶段
  • 刚开始的SAM是采用公开的分割数据训练;
  • 标注时人工采用点击前景点、背景点作为SAM的prompt输入,对分割的结果进行标注和修正;
  • 随着标注数据的增多,会采用新标注的数据来重训SAM模型,这个阶段模型反复重训了6次。
  1. 人工半监督标注:混合了自动预测掩码和模型辅助注释的半自动阶段
  • 利用第一阶段的数据训练一个faster-rcnn的目标检测模型;
  • 用检测框作为SAM的prompt输入(目标检测难度比分割小的多),输出的分割结果中,人工只需要关注置信度得分低的分割图进行修正,并补充SAM遗漏的结果;
  • 同样在这个阶段,随着标注数据的增多,SAM模型会持续的重训,一共进行5次训练。
  1. 全自动标注:没有注释器输入的情况下生产掩码的全自动阶段
  • 第三个阶段类似我们产生伪标签训练的过程
  • 用前边数据训练好的SAM在海量数据上产生分割的结果,然后再通过规则过滤掉部分可能错误的结果

参考:
五分钟看明白分割一切模型 SAM
Segment Anything论文和源码解读
【模型解读】【代码复现】Segment Anything Model(SAM)

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

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

相关文章

Oracle-数据库性能变慢问题分析

问题背景: 应用运维报障说最近两天业务数据入库和表查询都变得很慢,需要排查一下数据库的性能问题 问题分析: 登录到服务器上,通过TOP命令快速看了一下,服务器整体的CPU使用%usr不算特别高,但%wa IO等待很高&#xff…

数据库与SQL

数据库与SQL 学习链接数据库关系型数据库管理系统(RDBMS) SQLSQL介绍SQL类型SQL 基础语言学习创建表(create table)语法 数据类型SQL最常用的数据类型 学习链接 基础篇:数据库 SQL 入门教程 数据库 用于存储数据 存放…

centos下系统全局检测工具dstat使用

目录 一:没有需要安装 二:dstat命令参数 三、监测界面各参数含义(部分) 四、dstat的高级用法 一:没有需要安装 yum install dstat 二:dstat命令参数 有默认选项,执行dstat命令不加任何参数…

docker完成redis 三主三从

文章目录 关闭防火墙启动docker后台服务新建6个docker容器redis实例创建并运行docker容器实例 进入容器redis-node-1并为6台机器构建集群关系链接进入6381作为切入点,查看集群状态主从容错切换迁移案例容错切换迁移 主从扩容案例为主节点6387分配从节点6388主从缩容…

第二十八周:文献阅读笔记(弱监督学习)+ pytorch学习

第二十八周:文献阅读笔记(弱监督学习) 摘要Abstract1. 弱监督学习1.1. 文献摘要1.2. 引言1.3. 不完全监督1.3.1. 主动学习与半监督学习1.3.2. 通过人工干预1.3.3. 无需人工干预 1.4. 不确切的监督1.5. 不准确的监督1.6. 弱监督学习的创新点 2…

List集合遍历过程中修改元素(有坑)

说来惭愧,学 java 2年了,对 “Java是值传递” 这句话还没有理解它的精髓,以至于编程的时候出现了一些错误,这里记录一下。 一.问题再现 1.1将List集合中的每个字符串更改为其他值 1.2将List集合中的对象更改为其他对象 二.问题分…

Socket编程-IO模型

1、首先IO模型的内容。 感觉可以简单理解为:我们写代码时,在基础的 IO 操作上做了一些其他的策略,根据策略的不同,一般有阻塞IO和非阻塞IO 1、阻塞IO 就是在操作的时候,比如网络通信中,某一线程使用下面这…

【Web】CTFSHOW PHP特性刷题记录(全)

知其然知其所以然,尽量把每种特性都详细讲明白。 目录 web89 web90 web91 web92 web93 web94 web95 web96 web97 web98 web99 web100 web101 web102 web103 web104 web105 web106 web107 web108 web109 web110 web111 web112 web113 web…

【QML COOK】- 007-Item对象、信号和槽

信号(signal)和槽(slot)是Qt的独特的设计,自然在QML中也被支持。 Item是QML所有类型的基类,Item类型不会显示在窗口上,但是可以支持信号和槽。本节就用Item编写一个信号和槽的实例。 1. 创建Q…

【Spring 篇】走进SpringMVC的世界:舞动Web的激情

嗨,亲爱的小白们!欢迎来到这篇关于SpringMVC的博客,让我们一起探索这个舞动Web的框架,感受它带来的激情和便利。在这个世界里,我们将学到SpringMVC的概述、开发步骤以及如何快速入门,一切都是如此的令人兴奋…

数据分析实战丨基于flask+pygal可视化分析sqlite中的数据

文章目录 写在前面实验目标项目框架实验内容1.配置实验环境2.查看sqlite3数据库的数据3.创建项目文件4.编写代码5.运行项目 运行结果写在后面 写在前面 本期内容: 基于FlaskPygal可视化分析Sqlite3中的数据 实验环境: pythonpygalflask 项目下载地址…

Cocos 使用VsCode调试-跨域问题

解决方案: 在添加完debug配置后 在项目文件夹中打开vscode然后找到launch.json 这个runtimeArgs参数在原本的配置中是没有的,给他添加上去 "runtimeArgs": ["--disable-web-security" ] 原理: 禁用浏览器跨域检查(仅用于调试&…

msvcp140.dll丢失的常见问题,msvcp140.dll丢失的几种解决办法分享

在电脑系统中,msvcp140.dll是一个重要的系统文件,其作用是为应用程序提供所需的功能和支持。然而,有时候我们可能会遇到msvcp140.dll文件丢失的情况,导致我们无法正常使用某些程序或游戏。本文将介绍msvcp140.dll丢失的常见问题、…

polar CTF 写shell

一、题目 <?php /*PolarD&N CTF*/highlight_file(__FILE__);file_put_contents($_GET[filename],"<?php exit();".$_POST[content]);?>二、解题 payload ?filenamephp://filter/convert.base64-decode/resourceshell.php #<?eval($_POST[1]);…

openGauss学习笔记-197 openGauss 数据库运维-常见故障定位案例-分析查询语句是否被阻塞

文章目录 openGauss学习笔记-197 openGauss 数据库运维-常见故障定位案例-分析查询语句是否被阻塞197.1 分析查询语句是否被阻塞197.1.1 问题现象197.1.2 原因分析197.1.3 处理办法 openGauss学习笔记-197 openGauss 数据库运维-常见故障定位案例-分析查询语句是否被阻塞 197.…

【LV12 DAY17-18 中断处理】

GPX1_1是外部中断9 EINT9 查询可知其中断ID是57 所以需要进行人为修正lr的地址 sub lr&#xff0c;lr&#xff0c;#4 //iqr异常处理程序 irq_handler: //IRQ异常后LR保存的地址是被IRQ打断指令的下一条再下一条指令的地址&#xff0c;所以我们需要人为进行修正一下sub LR,L…

Linux下如何快速调试I2C设备

Linux下如何快速调试I2C设备 目录 1 什么场景下需要快速调试I2C设备 2 如何快速调试I2C设备 3 如何获取I2C Tools工具集 3.1 获取I2C Tools工具集源码 3.2 编译I2C Tools工具集源码 3.3 为设备添加I2C Tools工具集 4 如何使用I2C Tools工具集 5 小结 1 什么场景下需要快…

vue2配置教程

5.12.3 Vue Cli 文档地址: https://cli.vuejs.org/zh/ IDEA 打开项目&#xff0c;运行项目

堆排序——高效解决TOP-K问题

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 引言什么是堆&#xff1f;建堆堆排序&#xff1a;排序的最终结果 堆排序实现函数声明交换函数 Swap下沉调整 DnAdd堆排序函数 HeapSort主函数 文件中找…

day-09 删除排序链表中的重复元素

思路 从前往后遍历链表&#xff0c;当当前节点的值与下一个节点值相等时&#xff0c;删除下一节点&#xff1b;否则向后移动一个节点&#xff0c;继续遍历 解题方法 while(p!null&&p.next!null){ if(p.next.valp.val)p.nextp.next.next;//当前节点的值与下一个节点值相…