计算机视觉:比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仍有几个弱点可以加以改进,比如评分机制和实例面具生成范式。这些问题都留待进一步研究。

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

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

相关文章

springMVC Unix 文件参数变更漏洞修复

错误信息如下: 解决方案: 原因:未对用户输入正确执行危险字符清理 未检查用户输入中是否包含“…”(两个点)字符串,比如 url 为 /login?action…/webapps/RTJEKSWTN26635&typerandomCode cookie为Coo…

opencv 进阶16-基于FAST特征和BRIEF描述符的ORB(图像匹配)

在计算机视觉领域,从图像中提取和匹配特征的能力对于对象识别、图像拼接和相机定位等任务至关重要。实现这一目标的一种流行方法是 ORB(Oriented FAST and Rotated Brief)特征检测器和描述符。ORB 由 Ethan Rublee 等人开发,结合了…

校企合作 | 大势智慧受邀参与北斗共同体建设

8月16日,长江工业职业学院(后简称“长江工院”)副校长刘文胜,质管处处长黄世涛,测绘信息工程系党总支书记刘飞、系副主任陈志兰、系教师陈文玲一行莅临武汉大势智慧科技有限公司(后简称“大势智慧”&#x…

【Git Bash】简明从零教学

目录 Git 的作用官网介绍简明概要 Git 下载链接Git 的初始配置配置用户初始化本地库 Git 状态查询Git 工作机制本地工作机制远端工作机制 Git 的本地管理操作add 将修改添加至暂存区commit 将暂存区提交至本地仓库日志查询版本穿梭 Git 分支查看分支创建与切换分支跨分支修改与…

iPhone开启“轻点唤醒”功能但点击屏幕无反应怎么解决?

iPhone的“轻点唤醒”功能启用时,用户只需手指轻触或点击手机屏幕即可快速唤醒设备,无需按压任何按钮。然而,有些用户在使用“轻点唤醒”功能唤醒屏幕时,遇到该功能失灵,无法正常唤醒屏幕的情况,这是怎么回…

Linux系统安全——NAT(SNAT、DNAT)

目录 NAT SNAT SNAT实际操作 DNAT DNAT实际操作 NAT NAT: network address translation,支持PREROUTING,INPUT,OUTPUT,POSTROUTING四个链 请求报文:修改源/目标IP, 响应报文:修改源/目标…

Yalmip入门教程(5)-约束条件操作的相关函数

博客中所有内容均来源于自己学习过程中积累的经验以及对yalmip官方文档的翻译:https://yalmip.github.io/tutorials/ 这篇博客将详细介绍yalmip工具箱中约束条件操作相关函数的用法。 1.约束条件操作的相关函数 1.1 boundingbox函数 boundingbox函数用于求出一组约…

以软件定义存储实现存力与算力的协同,应对 AI 时代数据挑战

本文根据 XSKY 星辰天合高级副总裁张旭明在“算力与前沿技术创新发展论坛”上的演讲内容整理,略有删节。 算力与前沿技术创新发展论坛以“算力创新跃迁 赋能数字经济”为主题,8 月 17 日在汕头召开,该论坛由工业和信息化部、广东省人民政府主…

SpringBoot 2.7 集成 Netty 4 模拟服务端与客户端通讯入门教程

文章目录 1 摘要2 核心 Maven 依赖3 核心代码3.1 服务端事务处理器 (DemoNettyServerHandler)3.2 服务端连接类(InitNettyServer)3.3 客户端事务处理器(DemoNettyClientHandler)3.4 客户端连接类(DemoNettyClient) 4 测试4.1 测试流程4.2 测试结果4.3 测试结论 5 推荐参考资料6…

通过安全日志读取WFP防火墙放行日志

前言 之前的文档中,描写了如何对WFP防火墙进行操作以及如何在防火墙日志中读取被防火墙拦截网络通讯的日志。这边文档,着重描述如何读取操作系统中所有被放行的网络通信行为。 读取系统中放行的网络通信行为日志,在win10之后的操作系统上&am…

继承(C++)

继承 一、初识继承概念“登场”语法格式 继承方式九种继承方式组合小结(对九种组合解释) 二、继承的特性赋值转换 一一 切片 / 切割作用域 一一 隐藏 / 重定义 三、派生类的默认成员函数派生类的默认成员函数1. 构造函数2. 拷贝构造3. 赋值运算符重载4. …

【编织时空三:探究顺序表与链表的数据之旅】

本章重点 链表OJ题 1. 删除链表中等于给定值 val 的所有结点。 OJ链接 思路一:删除头结点时另做考虑(由于头结点没有前一个结点) struct ListNode* removeElements(struct ListNode* head, int val) {assert(head);struct ListNode* cur h…

Go:测试框架GoConvey 简介

快速开始 GoConvey是一个完全兼容官方Go Test的测试框架,一般来说这种第三方库都比官方的功能要强大、更加易于使用、开发效率更高,闲话少说,先看一个example: package utils import (. "github.com/smartystreets/goconvey…

【JVM】运行时数据区域

文章目录 说明程序计数器虚拟机栈本地方法栈Java堆方法区运行时常量池直接内存 说明 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁的时间,有的区域随着虚拟机进程的启动而一直…

【广州华锐互动】牲畜养殖VR模拟实操系统为传统教育注入新的生命力

随着科技的不断发展,虚拟现实(VR)技术已经逐渐走进我们的生活。在农业领域,VR技术的应用也日益广泛,为现代农业人才培养提供了新的途径。 由广州华锐互动开发的“牲畜养殖VR模拟实操系统”引起了广泛关注,系统包含了鸡、猪、牛、马…

产品流程图是什么?怎么做?

产品流程图是什么? 产品流程图是一种图形化的表达方式,用于描述产品开发、制造、销售、使用等各个阶段中涉及的流程、步骤和关系。它通过图形符号、箭头、文本等元素,展示了产品的各个环节之间的关联和顺序,通常被用于可视化产…

STM32 F103C8T6学习笔记12:红外遥控—红外解码-位带操作

今日学习一下红外遥控的解码使用,红外遥控在日常生活必不可少,它的解码与使用也是学习单片机的一个小过程,我们将通过实践来实现它。 文章提供源码、测试工程下载、测试效果图。 目录 红外遥控原理: 红外遥控特点: …

Qt+C++串口调试接收发送数据曲线图

程序示例精选 QtC串口调试接收发送数据曲线图 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对<<QtC串口调试接收发送数据曲线图>>编写代码&#xff0c;代码整洁&#xff0c;规则&…

探索GreatADM:图形化部署MGR的全新体验

摘要&#xff1a; 在DBA的日常工作中&#xff0c;快速部署数据库高可用架构&#xff0c;且标准化地入网部署数据库是一项重要的基础任务。本文将介绍常见的部署MGR的方式&#xff0c;并重点介绍万里数据库的GreatADM数据库管理平台进行图形化、可视化、标准化的部署过程&#x…

vue 学习笔记 简单实验

1.代码(html) <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"counter">Counter: {{ counter }} </div> <script> const Counter {data() {return {counter: 5}} } Vue.cr…