Segment Anything学习小结

news2024/11/23 21:40:58

论文地址:Segment Anything

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

在线Demo: https://segment-anything.com/demo

前言

近日,MetaAI团队开源了一个用于分割的10亿个masks,1100w张图片数据集SA-1B。并开开源了基于此数据集训练的模型。这应该是目前CV分割领域最强的基础模型。

回答3个问题就能搞懂SAM

segment anything model(SAM)能根据用户给定的prompt,分割出该prompt对应的mask。它的工作pipeline如下图所示,主要包含3个步骤:

  • 通过image encode提取图片的embedding。这个过程很耗时,不过对每一张图片只需计算一次。
  • 通过prompt encode对用户传入的prompt进行编码
  • 通过mask decoder对image embedding与prompt emnbedding进行解码,提取所用感兴趣的分割。

SAM它能够实现与用户交互的实时性。这是因为最耗时的image enbedding会在用户上传图片的时候计算好,交互时只需推理prompt encode与mask decode这两个轻量的模块。下面我们来看它是怎么做的。
在这里插入图片描述

image encode工作机制

采用的是基于MAE1预训练的ViT模型,在最后接了2层卷积层进行降维。模型的输出是图片 X i n ∈ R 3 × 1024 × 1024 X_{in} \in \mathbb{R}^{3 \times 1024 \times 1024} XinR3×1024×1024,模型的输出 X o u t ∈ R 256 × 64 × 64 X_{out} \in \mathbb{R}^{256 \times 64 \times 64} XoutR256×64×64,下采样了16倍。

Prompt encode的工作机制

两类prompt,离散型(point、boxes、text),稠密型(mask)

  • Points prompt 采用了文献2的位置编码方式,给定点的坐标与前景点/背景点的标签,返回 R B × 2 × 256 \mathbb{R}^{B \times 2 \times 256} RB×2×256的point embedding。只有一个点为什么是 2 × 256 2 \times 256 2×256这是为了和box promot处理方式保持一致,对point进行了padding操作。

  • box prompt。box可以视为2个点组成,故可采用point promot的位置编码操作,其返回也是 R B × 2 × 256 \mathbb{R}^{B \times 2 \times 256} RB×2×256

  • text prompt。论文中提出一个概念性的验证(proof-of-concept),可以用CLIP的text encode,最后在其维度进行处理。

mask decode如何融入根据image embedding与prompt embedding来预测mask

Mask decode的主要工作流程如下图所示。其输入包含两部分:image embedding与prompt embedding。其输出也包含两部分:预测的masks与每个mask对应的IoU分数。

在这里插入图片描述

2个值得注意的细节:

如何处理模糊感知

什么是模糊感知呢(ambiguity-aware)。举个🌰,假设一张图片有一个人身穿印有小汽车的T恤,当用户给了一个T恤上小汽车位置prompt,模型该输出什么mask呢? 是小汽车还是T恤还是人?

Meta的解决方案是,一个prompt对应多个输出,以上面的case为例,此时模型输出3个mask,分别是小汽车(sub-part)、T恤(part)和人(object)。在训练阶段,只反向传播着三个mask误差最低的mask。在推理时返回置信度最高的mask作为输出。

下图为论文中给的示例

在这里插入图片描述

如何构model-in-loop dataset (three stage)

assisted-manual

先用开源数据集进行训练SAM,再结合交互式的标注方法进行人工标注。随后再仅用标注的数据进行retrain。这个过程进行了6轮,通过模型的迭代,标注人员的标注时间从34s/mask降低到14s/mask(一张图片8-9分钟左右),并且分割的粒度不断细化,从20masks/image提升到44masks/image(说明模型效果不断提升)。这个阶段总计获得120k标注图片,总计4.3M masks。

值得注意的时,标注时标注人员也会打语义标签,它的标签是灵活的,不局限于给定的几类。

semi-automatic

这个阶段的主要目的是提升mask的多样性,核心目的是让模型能够segment anything。首先会通过预训练的模型检测出显著性较高的mask,随后让标注人员完善显著性不高的物体的标注。retrain过程重复了5次。由于标注的粒度更细,且更不显著,标注速率回升到34s/mask。在这个阶段总计标注了180k的图片得到5.9M的mask。每张图片的平均mask从44提升至72。通过上述两个阶段总计获得10.2M的mask,300k图片。

值得注意的是,为了获得显著性的mask,meta基于第一阶段的mask构建bounding box训练了一个检测模型。将被检测到的mask作为显著性mask。

Fully automatic

在全自动阶段,模型会默认给定32*32的点阵作为prompt(总计1024个点)。根据感知模糊规则,每个点有3个mask,部分(part)、子部分(sub-part)、整体(object)的mask (总计3072mask)。再根据模型的IOU预测模块给这个点的mask进行打分,并返回稳定的mask。最后再根据非极大抑制来过滤重复的mask。为了进一步提升小mask的质量,meta还对这部分区域进行了重叠crop再预测,再合并多个crop image的分割结果。通过这个全自动的样本制造过程,总计得到11M的图片(图片平均分辨率3300x4950),1.1B高质量的mask。

值得注意的是,稳定mask的判别条件:如果将mask 的semantic map分别按照阈值 0.5 + δ , 0.5 − δ 0.5 + \delta, 0.5-\delta 0.5+δ,0.5δ进行二值化得到的mask一致,则认为是稳定的mask。

如何用segment anything进行zero-shot迁移

下面主要概述下如何用sam做edge detection,即如何基于text生成mask。

如何用sam进行edge detection

类似创建dataset的Fully automatic方案。这里会预先给定16 * 16的点阵作为point prompt。这样总计可以得到768个mask。随后通过非极大抑制过滤重复mask,再对每个mask用Sobel算子提取边缘,最后再对提取的边缘用非极大抑制进行细化。

(真的是强行zero-shot,上面的pipeline计算成本非常非常高)

如何用sam进行instance segmentation

先通过一个检测模型检测出object的bounding box,随后在用bounding box作为box prompt获得实例分割图。

如何用sam实现text-to-mask

这个任务根据输入的文本分割出图中所有符合的实例。meta还没有填这个坑只是提出了一个概念性的验证(proof-of-concept)。在训练过程中,将mask区域大小大于 10 0 2 100^2 1002的mask对应图片区域的CLIP image embedding作为prompt的输入。由于CLIP的image embedding和text embedding做了对齐,因此在推理阶段可以将文本的embedding作为prompt来检测相关的segment。

总结

SAM从算法层面来看,基本都是已有的算法。他的亮点主要在于model-in-loop创建数据集的pipeline和二阶段推理交互逻辑(先提取图片特征,在用一个轻量模型配合用户做交互)。之所以能够达到这么惊艳的效果,主要还是取决于训练的样本足够大、质量足够高。他让我们看到了现有模型的上界。

基于SAM 二次开发的工作

项目名称description相关信息
Track-Anything视频目标跟踪与分割https://github.com/gaomingqi/Track-Anything
Segment-Everything-Everywhere-All-At-Once基于多模态prompt分割 (point、box、mask、audio、text)https://github.com/UX-Decoder/Segment-Everything-Everywhere-All-At-Once
caption anything生成sam分割实体的描述。底层架构:SAM, BLIP2, ChatGPThttps://github.com/ttengwang/Caption-Anything
edit anything将sam集成到stable-diffusion中。简化inpaint gnerate过程。底层架构:SAM, StableDIffusion,ContorlNet, BLIP2https://github.com/sail-sg/EditAnything
Semantic Segment Anything (SSA)给sam开源的SA-1B的mask打上语义标签。获得一个新的数据集SSA-1Bhttps://github.com/fudan-zvg/Semantic-Segment-Anything
salt基于pypq5和SAM开发的segment标注工具https://github.com/anuragxel/salt
grounded-segment-anything集成SAM,whisper,ChatGPT,diffusion model,BLIP等来解决一些复杂的cv问题,如inpaint 生成、control生成、基于whisper生成,实例分割,目标追踪等
Segment Anything for Stable Diffusion WebUI将SAM集成到stable-diffusion-webUI中https://github.com/continue-revolution/sd-webui-segment-anything

参考文献


  1. [Masked autoencoders are scalable vision learners.]( ↩︎

  2. Fourier features let networks learn high frequency functions in low dimensional domains. ↩︎

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

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

相关文章

测试新手如何晋升为月入过万的软件测试工程师?“我“的测试之路不简单...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 测试工程师这个岗…

记一次binlog恢复Mysql某张表数据的过程

1、备份数据库,非常重要 2、要用户不能操作(如果不能停止,可以新建一个库,所有的binlog执行操作在新库执行)。 3、登录服务器; 4、获取Mysql数据路径 cat /etc/my.cnf.d/mysql-server.cnf5、进入当前目录…

【SpinalHDL快速入门】4.2、基本类型之Bits

文章目录 1.1、描述1.2、声明1.3、运算符1.3.1、逻辑运算(Logic)1.3.2、比较(Comparison)1.3.3、类型转换(Type cast)1.3.4、部分赋值/提取操作符(Bit extraction)1.3.5、杂项&#…

Redis的使用规范小建议

Redis 核心技术与实战 笔记 作者: 蒋德钧 毕竟,高性能和节省内存,是我们的两个目标,只有规范地使用Redis,才能真正实现这两个目标。如果说之前的内容教会了你怎么用,那么今天的内容,就是帮助你用…

ChatGPT的学习过程【分析ChatGPT原理】+如何高效使用GPT

ChatGPT的学习过程【分析ChatGPT原理】如何高效使用GPT 此处借鉴:台湾大学李宏毅老师的讲解 资料:pan.baidu.com/s/1Jk1phne3ArfOERYNTPL12Q?pwd1111 GPTGenerative Pre-trained Transformer生成式预训练转换模型 ChatGPT共有四个学习阶段 学习文字接龙…

Java性能权威指南-总结7

Java性能权威指南-总结7 垃圾收集算法理解Throughput收集器堆大小的自适应调整和静态调整理解CMS收集器 垃圾收集算法 理解Throughput收集器 Throughput收集器有两个基本的操作;其一是回收新生代的垃圾,其二是回收老年代的垃圾。 下图展示了堆在新生代…

Python配置MySQL数据库使用

创建配置文件 config.ini [MySQL] host 172.xxx.xxx.xxx port 3306 user root password ****** db bgp_routing charset utf8创建读取配置文件 readConfig.py import configparser from pathlib import Pathclass ReadConfig():def __init__(self):configDir Path.cwd…

【学习日记2023.6.6】之 Linux环境下部署Java项目

文章目录 5. 项目部署5.1 手动部署项目5.2 基于Shell脚本自动部署5.2.1 介绍5.2.2 推送代码到远程5.2.3 Git操作5.2.4 Maven安装5.2.5 Shell脚本准备5.2.6 Linux权限5.2.7 授权并执行脚本5.2.8 设置静态IP 5. 项目部署 开发的项目绝大部分情况下都需要部署在Linux系统中。下面通…

springboot+vue多维的知识分类管理系统

随着国内市场经济这几十年来的蓬勃发展,突然遇到了从国外传入国内的互联网技术,互联网产业从开始的群众不信任,到现在的离不开,中间经历了很多挫折。本次开发的多维分类的知识管理系统有管理员和用户两个角色。管理员可以管理用户…

Dozzle-解决通过命令方式查看Docker 日志的神器

对于程序员们来说,Docker 一定是不陌生了。Docker 为我们的工作带来的巨大的便利,你可以使用它快速部署和扩展应用程序,并保证隔离性和可移植性,使应用程序在容器内独立运行,而且可以轻松地在不同的主机和操作系统上移…

bpmn是什么?bpmn.js的简单使用

文章目录 一、bpmn.js是什么?二、使用步骤1.引入bpmn2.使用bpmn3.引入bpmn-左侧工具栏4.引入bpmn-左侧工具栏5.引入bpmn数据导出6.数据导出为svg格式7.监听modeler并绑定事件7.监听element点击……8.自定义左侧工具栏图标9.自定义左侧工具栏完整效果 总结 一、bpmn.…

推动体系建设 助推融合发展|2023 开放原子全球开源峰会软件物料清单(SBOM)分论坛即将启幕

软件物料清单对于普通人而言可能很陌生,而对于从业者而言,软件物料清单是以 “开源” 为核心,通过有效识别和记录软件组成成分及相互依赖关系,保障软件全生命周期各环节要素的可控制、可预测、可管理。 由开放原子开源基金会主办…

云原生Docker网络管理和数据卷

Docker网络 Docker 网络实现原理 Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0), Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP, 同时Docker网桥是每个容器的默认网关。 …

案例26:基于Springboot校园社团管理系统开题报告

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

那些你可能遇到的 Linux 命令?什么,你还不知道?赶紧收藏?完善中!

文章目录 一. Linux 进程1. 通过进程名查找进程号1.1 ps aux & ps -ef:diff1.2 ps aux & ps -aux:什么?它们不一样?1.3 grep & awk:取出进程号、取出进程号并 Kill 2. 通过进程号查看进程信息:…

视频理解学习笔记(四)

视频理解学习笔记(四) 3D CNNC3DI3DNon-local算子 (Self-attention替换掉LSTM)R (2 1) DSlowFast Video TransformerTimeSformer 总结Reference 3D CNN 双流的缺点:光流抽取太慢——tvl one算法,0.06s抽取…

什么是浅拷贝和深拷贝

javascript 中有不同的方法来复制对象,那么我们怎样才能正确地复制一个对象呢?,本文来介绍一下浅拷贝和深拷贝。 一、什么是浅拷贝(Shallow Copy) 浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷…

遗传算法在数学建模中的应用及MATLAB实现

2023年9月数学建模国赛期间提供ABCDE题思路加Matlab代码,专栏链接(赛前一个月恢复源码199,欢迎大家订阅):http://t.csdn.cn/Um9Zd 目录 遗传算法基本概念 遗传算法原理 MATLAB实现 1. 使用ga求解遗传算法问题 数学建模案例:旅行商问题(TSP&#xf…

操作系统原理 —— 内存连续分配管理方式(二十)

在之前的章节中,我们到了内存管理,其中有一个很重要的功能,就是对操作系统中的内存进行分配和回收。 那如何对操作系统的内存进行分配呢? 整体上可以分为两种方式:连续分配管理方式、非连续分配管理方式。 这里提到的…

【vue3】08-vue的组件化开发-插槽(Slots)的完全指南

Vue插槽(Slots)的完全指南 插槽的作用插槽的基本使用具名插槽作用域插槽(难点) 插槽的作用 在开发中,我们会经常封装一个个可复用的组件: 前面我们会通过props传递给组件一些数据,让组件来进行展示;但是为…