计算机视觉:比SAM快50倍的分割一切视觉模型FastSAM
目录
引言
1 FastSAM介绍
1.1 FastSAM诞生
1.2 模型算法
1.3 实验结果
2 FastSAM运行环境构建
2.1 conda环境构建
2.2 运行环境安装
2.3 模型下载
3 FastSAM运行
3.1 命令行运行
3.1.1 Everything mode
3.1.2 Text prompt
3.1.3 Box prompt (xywh)
3.1.4 Points prompt
3.2 通过代码调用
4 总结
引言
MetaAI提出的能够“分割一切”的视觉基础大模型SAM提供了很好的分割效果,为探索视觉大模型提供了一个新的方向。虽然sam的效果很好,但由于SAM的backbone使用了vit,导致推理时显存的占用较多,推理速度偏慢,对硬件的要求较高,在项目应用上有很大的限制。
SAM的详细讲解:https://blog.csdn.net/lsb2002/article/details/131421165
一些研究在尝试解决这个问题,其中一个是清华团队的Expedit-SAM,对模型进行加速,论文结果最多可以提速1.5倍。主要思路是用2个不需要参数的操作:token clustering layer和token reconstruction layer。token clustering layer通过聚类将高分辨率特征转到低分辨率,推理时用低分辨率的进行卷积等操作,这样可以加速推理时间;token reconstruction layer是将低分辨率特征重新转回高分辨率。个人测试好像没有明显提升,不过已经打开了sam推理加速的思路。
1 FastSAM介绍
1.1 FastSAM诞生
最近发布的FastSAM(Fast Segment Anything),论文结果最快提升50倍,参数更少,显存占用减少,适合应用部署。
FastSAM是基于YOLOv8-seg的,这是一个配备了实例分割分支的对象检测器,它利用了YOLACT 方法。作者还采用了由SAM发布的广泛的SA-1B数据集。通过直接在仅2%(1/50)的SA-1B数据集上训练这个CNN检测器,它实现了与SAM相当的性能,但大大减少了计算和资源需求,从而实现了实时应用。作者还将其应用于多个下游分割任务,以显示其泛化性能。在MS COCO的对象检测任务上,在AR1000上实现了63.7,比32×32点提示输入的SAM高1.2分,在NVIDIA RTX 3090上运行速度快50倍。
实时SMA对工业应用都是有价值的。它可以应用于许多场景。所提出的方法不仅为大量的视觉任务提供了一种新的、实用的解决方案,而且它的速度非常高,比目前的方法快数十或数百倍。它还为一般视觉任务的大型模型架构提供了新的用途。作者认为,对于专业的任务,专业的模型具备更好的效率和准确性的权衡。然后,在模型压缩的意义上,FastSAM的方法证明了一个路径的可行性,通过引入一个人工的结构,可以显著减少计算工作量。


论文地址:https://arxiv.org/pdf/2306.12156.pdf
代码地址:https://github.com/CASIA-IVA-Lab/FastSAM
web demo:https://huggingface.co/spaces/An-619/FastSAM
1.2 模型算法
以yolov8-seg的instance segmentation为基础,检测时集成instance segmentation分支。

FastSAM主要分成2步:全实例分割(all instance Segmentation)和基于prompt的mask输出(Prompt-guided Selection)。
全实例分割(all instance Segmentation)
- 模型:基于yolov8-seg的模型.
- 实例分割:yolov8-seg实现了实例分割,结果包含了检测和分割分支。检测分支输出box和类别cls,检测分支输出k(默认为32)个mask分数,检测和分割分支是并行的。看推理代码的模型,这块其实就是yolov8的segment网络,具体可以看yolov8的segment训练代码。
Prompt-guided Selection
利用prompt挑选出感兴趣的特点目标,类似sam,支持point/box/text。
- point prompt:点prompt用点和实例分割输出的mask进行匹配。和sam一样,利用前景点/背景点作为prompt。如果一个前景点落在多个mask中,可以通过背景点进行过滤。通过使用一组前景/背景点,能够在感兴趣的区域内选择多个mask,然后将这些mask合并为一个mask,用于完整的标记感兴趣的对象。此外,利用形态学操作来提高掩模合并的性能。
- box prompt:与实例分割输出的mask的box和输入的box进行iou计算,利用iou得分过滤mask。
- text prompt:利用clip模型,利用图像编码和文本编码直接的相似性,提取分数较高的mask。因为引入clip模型,text prompt的运行速度比较慢。
1.3 实验结果
FastSAM利用yolov8-x模型;取SA-1B数据集的2%进行监督训练;为了检测更大的instance,将yolov8的reg_max参数从16改成26;输入图像的size为1024。在4种级别的任务上与SAM的zero-shot对比:边缘检测、目标Proposal、实例分割、提示输入分割。
- 边缘检测:将模型的全景实例分割结果用sobel算子得到边缘,FastSAM与SAM性能相近,都倾向于预测更多的边(数据集中没有标注的边)
- 目标Proposal:在coco上对比了SAM、ViTDet、OLN和FastSAM,FastSAM与SAM略差,但其是zero-shot transfer,而OLN在voc上进行预训练
- 实例分割:使用ViTDet [23]生成的边界框(bbox)作为提示符来完成实例分割任务,FastSAM比SAM差一些。
- 提示输入分割:与SAM性能类似,但是运行效率有些低下(这主要是受CLIP模型的影响)




2 FastSAM运行环境构建
2.1 conda环境构建
conda环境准备详见:annoconda
2.2 运行环境安装
conda create -n fastsam python=3.9
conda activate fastsamgit clone https://ghproxy.com/https://github.com/CASIA-IVA-Lab/FastSAM.git
cd FastSAMpip install -r requirements.txt
pip install git+https://ghproxy.com/https://github.com/openai/CLIP.git
2.3 模型下载
创建模型保存模型的目录weights
mkdir weights
模型下载地址:模型
模型下载后,存储到weights目录下
(fastsam) [root@localhost FastSAM]# ll weights/
总用量 141548
-rw-r--r-- 1 root root 144943063 8月 21 16:28 FastSAM_X.pt
3 FastSAM运行
原始图片如下,通过FastSAM对这张图片进行处理

3.1 命令行运行
3.1.1 Everything mode
python Inference.py --model_path ./weights/FastSAM_X.pt --img_path ./images/dogs.jpg

3.1.2 Text prompt
python Inference.py --model_path ./weights/FastSAM_X.pt --img_path ./images/dogs.jpg --text_prompt "the yellow dog"

3.1.3 Box prompt (xywh)
python Inference.py --model_path ./weights/FastSAM_X.pt --img_path ./images/dogs.jpg --box_prompt "[[570,200,230,400]]"

3.1.4 Points prompt
python Inference.py --model_path ./weights/FastSAM_X.pt --img_path ./images/dogs.jpg --point_prompt "[[520,360],[620,300]]" --point_label "[1,0]"

3.2 通过代码调用
vi test.py
from fastsam import FastSAM, FastSAMPromptmodel = FastSAM('./weights/FastSAM_X.pt')
IMAGE_PATH = './images/dogs.jpg'
DEVICE = 'cpu'
everything_results = model(IMAGE_PATH, device=DEVICE, retina_masks=True, imgsz=1024, conf=0.4, iou=0.9,)
prompt_process = FastSAMPrompt(IMAGE_PATH, everything_results, device=DEVICE)# everything prompt
ann = prompt_process.everything_prompt()# bbox default shape [0,0,0,0] -> [x1,y1,x2,y2]
ann = prompt_process.box_prompt(bbox=[200, 200, 300, 300])# text prompt
ann = prompt_process.text_prompt(text='a photo of a dog')# point prompt
# points default [[0,0]] [[x1,y1],[x2,y2]]
# point_label default [0] [1,0] 0:background, 1:foreground
ann = prompt_process.point_prompt(points=[[620, 360]], pointlabel=[1])prompt_process.plot(annotations=ann,output_path='./output/dog.jpg',)
python test.py

4 总结
在FastSAM模型中,作者重新考虑了segment of anything task和相应模型结构的选择,并提出了一个比SAM-ViT-H (32×32)运行速度快50倍的替代解决方案。实验结果表明,FastSAM可以很好地解决多个下游任务。尽管如此,FastSAM仍有几个弱点可以加以改进,比如评分机制和实例面具生成范式。这些问题都留待进一步研究。
相关文章:
计算机视觉:比SAM快50倍的分割一切视觉模型FastSAM
目录 引言 1 FastSAM介绍 1.1 FastSAM诞生 1.2 模型算法 1.3 实验结果 2 FastSAM运行环境构建 2.1 conda环境构建 2.2 运行环境安装 2.3 模型下载 3 FastSAM运行 3.1 命令行运行 3.1.1 Everything mode 3.1.2 Text prompt 3.1.3 Box prompt (xywh) 3.1.4 Points p…...
【官方中文文档】Mybatis-Spring #目录
目录 此页面用于在GitHub上呈现索引。 NOTE: 由于链接目标是在使用maven-site-plugin转换为html的假设下指定的,因此在GitHub上的呈现中有一个锚点已损坏。 简介入门SqlSessionFactoryBean事务使用 SqlSession注入映射器Spring Boot使用 MyBatis APISpring Batch示…...
ardupilot开发 --- Lua脚本篇
概述 ArduPilot引入了对Lua脚本的支持; Lua脚本存放在 SD card 中; Copter-4.0 及以上版本才支持Lua脚本; scripting API ? scripting applets ? 飞控条件:2 MB of flash and 70 kB of memory ;…...
python35种绘图函数总结,3D、统计、流场,实用性拉满
文章目录 基础图误差线三维图等高线图场图统计图非结构坐标图 基础图 下面这8种图像一般只有两组坐标,直观容易理解。 函数坐标参数图形类别plotx,y曲线图stackplotx,y散点图stemx,y茎叶图scatterx,y散点图polarx,y极坐标图stepx,y步阶图barx,y条形图barhx,y横向条…...
shell脚本语句(画矩形、三角形、乘法表和小游戏)(#^.^#)
目录 一、语句 一、条件语句 一、以用户为例演示 一、显示当前登录系统的用户信息 二、显示有多少个用户 二、单分支if 一、输入脚本 二、验证结果 三、双分支if 一、输入脚本 二、验证结果 四、多分支if 一、输入脚本 二、验证 二、循环语句 一、shell版本的循环…...
vue3、react组件数据传值对比分析——父组件传递子组件,子组件传递父组件
文章目录 ⭐前言⭐react 组件传值实例💖父组件传值给子组件(props)💖子组件传递事件给父组件props绑定事件💖父组件触发子组件的事件Ref ⭐vue3 组件传值实例💖 父组件传递数据给子组件props💖 …...
2023国赛数学建模C题思路模型代码 高教社杯
本次比赛我们将会全程更新思路模型及代码,大家查看文末名片获取 之前国赛相关的资料和助攻可以查看 2022数学建模国赛C题思路分析_2022国赛c题matlab_UST数模社_的博客-CSDN博客 2022国赛数学建模A题B题C题D题资料思路汇总 高教社杯_2022国赛c题matlab_UST数模社…...
wxPython使用matplotlib绘制动态曲线
1.思路 我们创建了一个继承自wx.Frame的自定义窗口类MyFrame。在MyFrame的构造函数中,我们创建了一个matplotlib的Figure对象和一个FigureCanvas对象,用于在窗口中显示绘图结果。然后,我们使用numpy生成了一个包含100个点的x轴坐标数组self.…...
JVM——类的生命周期
文章目录 类加载过程加载验证准备解析初始化 卸载 一个类的完整生命周期如下: 类加载过程 Class 文件需要加载到虚拟机中之后才能运行和使用,那么虚拟机是如何加载这些 Class 文件呢? 系统加载 Class 类型的文件主要三步:加载->连接->…...
【Docker】docker数据卷(数据挂载)持久化
docker数据卷(数据挂载)持久化 一、docker对于数据的管理二、docker挂载主机目录---指定路径挂载三、docker使用数据卷Volume挂载四、数据共享--数据卷容器五、备份和恢复 docker的镜像是由多个只读的文件系统叠加在一起形成的。当我们在我启动一个容器的…...
Spring Boot实现IP地址解析
一、本地解析 如果使用本地ip解析的话,我们将会借助ip2region,该项目维护了一份较为详细的本地ip地址对应表,如果为了离线环境的使用,需要导入该项目依赖,并指定版本,不同版本的方法可能存在差异。 <d…...
小程序中通过canvas生成并保存图片
1. html <canvas class"canvas" id"photo" type"2d" style"width:200px;height: 300px;"></canvas> <button bindtap"saveImage">保存</button> <!-- 用来展示生成的那张图片 --> <image…...
Error creating bean with name ‘esUtils‘ defined in file
报错异常: 背景: esUtils在common服务中、启动media服务时候、报这个异常、后排查esUtils在启动时候发生异常引起的、在相关bean中加入try{}catch{}即可解决问题 String[] split url.split(","); HttpHost[] httpHosts new HttpHost[split.…...
Java开发面试题 | 2023
Java基础 接口和抽象类的区别?Java动态代理HashMap 底层实现及put元素的具体过程currenthashmap底层实现原理?map可以放null值吗,currenthashmap为什么不能放null值synchronze和reetrantlock区别?怎样停止一个运行中的线程&#…...
Java课题笔记~ 自定义拦截器实现权限验证
实现一个权限验证拦截器。 1、修改web.xml文件中请求路径 2、将所有的页面放入WEB-INF目录下 3、开发登录FirstController 4、开发拦截器 5、配置springmvc.xml文件 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.spri…...
微信小程序使用npm引入三方包详解
目录 1 前言2 微信小程序npm环境搭建2.1 创建package.json文件2.2 修改 project.config.json2.3 修改project.private.config.json配置2.4 构建 npm 包2.5 typescript 支持2.6 安装组件2.7 引入使用组件 1 前言 从小程序基础库版本 2.2.1 或以上、及开发者工具 1.02.1808300 或…...
pytest自动化框架运行全局配置文件pytest.ini
还记得在之前的篇章中有讲到Pytest是目前主要流行的自动化框架之一,他有基础的脚本编码规则以及两种运行方式。 pytest的基础编码规则是可以进行修改,这就是今日文章重点。 看到这大家心中是否提出了两个问题:pytest的基础编码规则在哪可以…...
视频播放实现示例Demo
学习链接 vuespringboot文件分片上传与边放边播实现 同步加载、播放视频的实现 ---- range blob mediaSource 通过调试技术,我理清了 b 站视频播放很快的原理 MSE (Media Source Extensions) 上手指南 浅聊音视频的媒体扩展(Media Source Extension…...
makefile的自动化变量
一、是什么? 自动化变量:makefile依据执行的规则自动变化生成的变量 $(@) 规则的目标文件名 $(^) 所有依赖 依赖列表 $(<)第一个依赖文件名 $(*)规则中目标中%部分名 $(?)所有比目标文件更新的依赖文件列表,空格分隔 二、使用步骤 1.引入库 代码如下(示例): make …...
使用Kind搭建本地k8s集群环境
目录 1.前提条件 2.安装Kind 3.使用Kind创建一个K8s集群 3.1.创建一个双节点集群(一个Master节点,一个Worker节点) 3.2.验证一下新创建的集群信息 3.3.删除刚刚新建的集群 4.安装集群客户端 4.1.安装kubectl 4.1.1.验证kubectl 4.2.安…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
