中国提出FastSAM:在RTX3090上提升了ViT-H E(32×32) 50倍速度

news2025/4/9 10:41:32

文章目录

  • 1. Abstract
  • 2. 背景介绍
  • 3. 框架详情 (Methodology)
    • 3.1 Overview
    • 3.2 All-instance Segmentation
    • 3.3 Prompt-guided Selection
  • 4. Experiments
    • 4.1 Run-time Efficiency Evaluation
    • 4.2 Zero-Shot Edge Detection
      • 4.2.1 BSDS500
      • 4.2.2 Sobel filtering
      • 4.2.3 NMS
    • 4.3 Zero-Shot Object Proposal Generation
    • 4.4 Zero-Shot Instance Segmentation
    • 4.5 Zero-Shot Object Localization with Text Prompts
  • 5. Real-world Applications
  • 6. Discussion
  • 7. model.py: FastSAM
  • 8. prompt.py: FastSAMPrompt
  • Reference

在这里插入图片描述

1. Abstract

SAM正在成为许多高级任务的基础步骤,如图像分割、图像字幕和图像编辑。然而,其巨大的计算成本使其无法在行业场景中得到更广泛的应用。计算主要来自高分辨率输入的Transformer架构。

在这里插入图片描述

研究者为这项基本任务提出了一种性能相当的加速替代方法。通过将任务重新表述为片段生成提示,我们发现具有实例分割分支的常规CNN检测器也可以很好地完成该任务。具体而言,我们将该任务转换为研究充分的实例分割任务,并仅使用SAM作者发布的SA-1B数据集的1/50直接训练现有的实例分割方法。使用我们的方法,我们在50倍的运行时速度下实现了与SAM方法相当的性能。我们给出了足够的实验结果来证明它的有效性。

在这里插入图片描述
在这里插入图片描述

2. 背景介绍

SAM被视为一个里程碑式的愿景基础模型。它可以在各种可能的用户交互提示的引导下分割图像中的任何对象。SAM利用了在广泛的SA-1B数据集上训练的Transformer模型,这使其能够熟练地处理各种场景和对象。SAM为一项激动人心的新任务打开了大门,该任务被称为Segment Anything。这项任务,由于其可推广性和潜力,具有成为未来广泛愿景任务基石的所有条件。

然而,尽管SAM和后续模型在处理细分市场任何任务方面取得了这些进步和有希望的结果,但其实际应用仍然具有挑战性。突出的问题是与SAM架构的主要部分Transformer(ViT)模型相关的大量计算资源需求。与卷积技术相比,ViT因其繁重的计算资源需求而脱颖而出,这给其实际部署带来了障碍,尤其是在实时应用中。因此,这种限制阻碍了SA任务的进展和潜力。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

针对工业上对SAM实时分割的需求,本文设计了一个SA任务的实时解决方案FastSAM。我们将SA任务解耦为两个连续的阶段,即全实例分割(all-instance segmentation)和提示引导选择(prompt-guided selection)。第一阶段是基于卷积神经网络(CNN)检测器的实现。它生成图像中所有实例的分割掩码。然后在第二阶段,输出与提示符相对应的感兴趣区域。通过利用cnn的计算效率,我们证明了在不影响性能质量的情况下,任何模型的实时分段都是可以实现的。我们希望所提出的方法将促进分割任何东西的基本任务的工业应用。

我们提出的FastSAM基于YOLOv8-seg [16], YOLOv8-seg是一种配备实例分割分支的目标检测器,它利用了YOLACT[4]方法。我们还采用了SAM发布的广泛的SA-1B数据集。通过仅在SA-1B数据集的2%(1/50)上直接训练该CNN检测器,它实现了与SAM相当的性能,但大大减少了计算和资源需求,从而实现了实时应用。我们还将其应用于多个下游分割任务,以展示其泛化性能。在MS COCO上的目标提议任务[13]上,我们在AR1000下实现了63.7,比在32× 32点提示输入下的SAM高1.2分,但在单个NVIDIA RTX 3090上运行速度快50倍。

实时分段模型对工业应用很有价值。它可以应用于许多场景。所提出的方法不仅为大量的视觉任务提供了一种新的、实用的解决方案,而且速度非常快,比crre快几十倍或几百倍。它还为一般视觉任务的大型模型体系结构提供了新的视图。我们认为,对于特定的任务,特定的模型仍然可以获得更好的效率和准确性权衡。然后,在模型压缩的意义上,我们的方法证明了一条路径的可行性,该路径可以通过在结构之前引入人工先验来显着减少计算量。我们的贡献可以概括如下:

  • 介绍了一种新颖的、基于cnn的实时分段任意任务解决方案,该解决方案在保持竞争性性能的同时显著降低了计算需求。
  • 这项工作提出了将CNN检测器应用于任何任务的第一个研究,为轻量级CNN模型在复杂视觉任务中的潜力提供了见解。
  • 在多个基准上对所提出的方法和SAM进行比较评估,可以深入了解该方法在分段任何领域中的优缺点。

3. 框架详情 (Methodology)

3.1 Overview

下图给出了所提出的Fast-SAM方法的概述。该方法由两个阶段组成,即所有实例分割和提示引导选择。前一阶段是基础,第二阶段本质上是面向任务的后处理。与端到端变换器不同,整体方法引入了许多与视觉分割任务相匹配的人类先验,如卷积的局部连接和感受野相关的对象分配策略。这使得它能够针对视觉分割任务进行定制,并且可以在较小数量的参数上更快地收敛。
在这里插入图片描述

检测分支输出类别和边界框,而分割分支输出k个原型(在FastSAM中默认为32)以及k个掩码系数。分割和检测任务是并行计算的。分割分支输入高分辨率特征图,保留空间细节,还包含语义信息。该映射通过卷积层进行处理,放大,然后通过另外两个卷积层输出掩码。掩码系数,类似于探测头的分类分支,范围在-1和1之间。实例分割结果是通过将掩模系数与原型相乘,然后将其相加而获得的。

from fastsam import FastSAM, FastSAMPrompt

model = FastSAM('./weights/FastSAM.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',)

3.2 All-instance Segmentation

在这里插入图片描述

3.3 Prompt-guided Selection

在使用YOLOv8成功分割图像中的所有对象或区域之后,分割任何对象任务的第二阶段是使用各种提示来识别感兴趣的特定对象。它主要涉及点提示、框提示和文本提示的使用。

Point prompt 包括将选定的点与从第一阶段获得的各种遮罩进行匹配。目标是确定点所在的遮罩。与SAM类似,我们在方法中使用前地面/背景点作为提示。在前景点位于多个遮罩中的情况下,可以利用背景点来过滤出与手头任务无关的遮罩。通过使用一组前景/背景点,我们能够在感兴趣的区域内选择多个遮罩。这些遮罩将合并为一个遮罩,以完全标记感兴趣的对象。此外,我们还利用形态学运算来提高掩模合并的性能。

Box prompt 长方体提示涉及在选定长方体和与第一阶段中的各种遮罩相对应的边界框之间执行并集交集(IoU)匹配。其目的是用所选框识别具有最高IoU分数的掩码,从而选择感兴趣的对象。

Text prompt 在文本提示的情况下,使用CLIP模型提取文本的相应文本嵌入。然后确定相应的图像嵌入,并使用相似性度量将其与每个掩模的内在特征相匹配。然后选择与文本提示的图像嵌入具有最高相似性得分的掩码。

通过仔细实施这些提示引导选择技术,FastSAM可以从分割图像中可靠地选择感兴趣的特定对象。上述方法提供了一种实时完成任何分割任务的有效方法,从而大大提高了YOLOv8模型在复杂图像分割任务中的实用性。一种更有效的即时引导选择技术留给了未来的探索。

4. Experiments

4.1 Run-time Efficiency Evaluation

在这里插入图片描述
Segmentation Results of FastSAM

在这里插入图片描述
在表1中,我们报告了SAM和FastSAM在单个NVIDIA GeForce RTX 3090 GPU上的运行速度。可以看出,FastSAM在所有提示数上都超过SAM。此外,FastSAM的运行速度不会随着提示符的变化而变化,这使它成为Everything模式的更好选择。

4.2 Zero-Shot Edge Detection

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
SAM和Fast-SAM比较

在这里插入图片描述

4.2.1 BSDS500

FastSAM is assessed on the basic low-level task of edge detection using BSDS500.

Pablo Arbelaez, Michael Maire, Charless Fowlkes, and Jitendra Malik. Contour detection and hierarchical image segmentation.

IEEE transactions on pattern analysis and machine intelligence, 33(5):898–916, 2010.

在这里插入图片描述
在这里插入图片描述

4.2.2 Sobel filtering

Irwin Sobel, Gary Feldman, et al. A 3x3 isotropic gradient operator for image processing. a talk at the Stanford Artificial Project in, pages 271–272, 1968.

4.2.3 NMS

edge NMS step

John Canny. A computational approach to edge detection.
IEEE Transactions on pattern analysis and machine intelligence, (6):679-698, 1986

4.3 Zero-Shot Object Proposal Generation

4.4 Zero-Shot Instance Segmentation

在这里插入图片描述

与SAM方法类似,我们利用ViTDet[23]生成的边界框(bounding box, bbox)作为提示符来完成实例分割任务。如第3.3节所述,我们选择具有最高交集/联合(IoU)的掩码,bbox作为预测掩码。结果。

表6给出了评估结果。在此任务中,我们未能实现高AP。我们推断这主要是因为分割掩码精度或基于盒的掩码选择策略。第6节给出了几个例子。
在这里插入图片描述

4.5 Zero-Shot Object Localization with Text Prompts

在这里插入图片描述
在上图中显示了定性结果。FastSAM可以根据文本提示很好地分割对象。然而,文本到掩模分割的运行速度并不令人满意,因为每个掩模区域都需要被馈送到CLIP特征提取器中。如何将CLIP嵌入提取器组合到FastSAM的骨干网络中,仍然是关于模型压缩的一个有趣的问题。

5. Real-world Applications

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6. Discussion

在这里插入图片描述

7. model.py: FastSAM

# Ultralytics YOLO 🚀, AGPL-3.0 license
"""
FastSAM model interface.

Usage - Predict:
    from ultralytics import FastSAM

    model = FastSAM('last.pt')
    results = model.predict('ultralytics/assets/bus.jpg')
"""

from ultralytics.yolo.cfg import get_cfg
from ultralytics.yolo.engine.exporter import Exporter
from ultralytics.yolo.engine.model import YOLO
from ultralytics.yolo.utils import DEFAULT_CFG, LOGGER, ROOT, is_git_dir
from ultralytics.yolo.utils.checks import check_imgsz

from ultralytics.yolo.utils.torch_utils import model_info, smart_inference_mode
from .predict import FastSAMPredictor


class FastSAM(YOLO):

    @smart_inference_mode()
    def predict(self, source=None, stream=False, **kwargs):
        """
        Perform prediction using the YOLO model.

        Args:
            source (str | int | PIL | np.ndarray): The source of the image to make predictions on.
                          Accepts all source types accepted by the YOLO model.
            stream (bool): Whether to stream the predictions or not. Defaults to False.
            **kwargs : Additional keyword arguments passed to the predictor.
                       Check the 'configuration' section in the documentation for all available options.

        Returns:
            (List[ultralytics.yolo.engine.results.Results]): The prediction results.
        """
        if source is None:
            source = ROOT / 'assets' if is_git_dir() else 'https://ultralytics.com/images/bus.jpg'
            LOGGER.warning(f"WARNING ⚠️ 'source' is missing. Using 'source={
     source}'.")
        overrides = self.overrides.copy()
        overrides['conf'] = 0.25
        overrides.update(kwargs)  # prefer kwargs
        overrides['mode'] = kwargs.get('mode', 'predict')
        assert overrides['mode'] in ['track', 'predict']
        overrides['save'] = kwargs.get('save', False)  # do not save by default if called in Python
        self.predictor = FastSAMPredictor(overrides=overrides)
        self.predictor.setup_model(model=self.model, verbose=False)
        try:
            return self.predictor(source, stream=stream)
        except Exception as e:
            return None

    def train(self, **kwargs):
        """Function trains models but raises an error as FastSAM models do not support training."""
        raise NotImplementedError("Currently, the training codes are on the way.")

    def val(self, **kwargs):
        """Run validation given dataset."""
        overrides = dict(task='segment', mode='val')
        overrides.update(kwargs)  # prefer kwargs
        args = get_cfg(cfg=DEFAULT_CFG, overrides=overrides)
        args.imgsz = check_imgsz(args.imgsz, max_dim=1)
        validator = FastSAM(args=args)
        validator(model=self.model)
        self.metrics = validator.metrics
        return validator.metrics

    @smart_inference_mode()
    def export(self, **kwargs):
        """
        Export model.

        Args:
            **kwargs : Any other args accepted by the predictors. To see all args check 'configuration' section in docs
        """
        overrides = dict(task='detect')
        overrides.update(kwargs)
        overrides['mode'] = 'export'
        args = get_cfg(cfg=DEFAULT_CFG, overrides=overrides)
        args.task = self.task
        if args.imgsz == DEFAULT_CFG.imgsz:
            args.imgsz = self.model.args['imgsz']  # use trained imgsz unless custom value is passed
        if args.batch == DEFAULT_CFG.batch:
            args.batch = 1  # default to 1 if not modified
        return Exporter(overrides=args)(model=self.model)

    def info(self, detailed=False, verbose=True)

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

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

相关文章

最优化方法——Matlab实现黄金分割法一维搜索

文章目录 黄金分割法一维搜索原理算法流程: Matlab代码命令行窗口结果打印:《最优化方法》教材上写成表的答案:黄金分割法的一些性质 黄金分割法一维搜索原理 若保留区间为[x1,b],我们得到的结果是一致的. 该方法称为黄金分割法,实际计算取近…

编译工具:CMake(七) | cmake 常用变量和常用环境变量

编译工具:CMake(七) | cmake 常用变量和常用环境变量 cmake 变量引用方式cmake 自定义变量的方式cmake 常用变量总结 cmake 变量引用方式 cmake使用${}进行变量的引用。 在 IF 等语句中,是直接使用变量名而不通过${}取值 cmake…

京东全店商品采集教程(详解京东店铺所有商品数据采集步骤方法和代码示例)

随着电商行业的快速发展,京东已成为国内的电商平台之一,拥有着海量的商品资源。对于一些需要大量商品数据的商家或者需求方来说,京东全店采集是非常必要的。本文将详细介绍京东全店采集的步骤和技巧,帮助大家更好地完成数据采集任…

基于Spark的K-means快速聚类算法的优化

摘要 1 引言 2 相关研究 2.1 Spark计算框架 2.2 K-means算法 2.3 K-means++算法

Python异步编程高并发执行爬虫采集,用回调函数解析响应

一、问题:当发送API请求,读写数据库任务较重时,程序运行效率急剧下降。 异步技术是Python编程中对提升性能非常重要的一项技术。在实际应用,经常面临对外发送网络请求,调用外部接口,或者不断更新数据库或文…

位深bitdepth是什么

bitdepth bit depth/color depth到底是什么,其对视频有何影响? 数字数据比如数字视频、数字照片等,都是以二进制存储的,那么其一个最小的数据单元就是一位bit,比特位中只有0或1两种值。为了方便处理,把多…

McCabe度量法

概论: McCabe度量法是由 托马斯麦克凯 提出的一种基于程序控制流的复杂性度量方法。又称环路度量,循环复杂度(Cyclomatic complexity), 也称为条件复杂度或圈复杂度,是一种软件度量。它认为程序的复杂性很大程度上取决…

《计算机视觉中的多视图几何》笔记(5)

5 Algorithm Evaluation and Error Analysis 本章主要讲述对算法的验证和误差分析。 概述了两种计算这种不确定性(协方差)的方法。第一个基于线性近似值,涉及串联各种雅各布表达式,第二个是更容易实施蒙特卡洛方法。 文章目录 …

Soft-Serve小巧强大-轻量级Git服务

文章目录 前言一、Soft-Serve官方解释:我的要求 二、使用步骤我的环境公钥、私钥生成安装镜像参数解释: 配置config.yamlconfig 实操创建用户及绑定公钥创建代码仓库及添加合作者之后就是 git 基本操作了 总结 前言 用过 Gitlab, 也挺好用。 遇到几个问…

固定资产管理系统的作用有哪些

固定资产管理系统的功效原因很多。  它帮助企业更好地管理其固定资金,包括设备的采购、维护、更新和损坏。根据系统管理计划,企业可以更有效地节约成本,提高效率,降低风险。  资产管理系统可以实现企业资产共享与合作应用。在…

「聊设计模式」之中介者模式(Mediator)

🏆本文收录于《聊设计模式》专栏,专门攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎持续关注&&收藏&&订阅! 前言 在软件开发过程中,我们通常会遇到一个问题&…

北邮22级信通院数电:Verilog-FPGA(2)modelsim北邮信通专属下载、破解教程

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 1.下载 2.解压打开 3.modelsim初安装 4.…

控制器连接Profinet转Modbus RTU网关与精密数显温控仪通讯

Profinet是一种用于工业自动化领域的通信协议,而Modbus RTU则是一种常见的串行通信协议。由于生产现场中的控制器与精密数显温控仪通常采用不同的通信协议,因此需要借助Profinet转Modbus RTU网关(XD-MDPN100)完成通信的桥接与转换…

Markdown(MD)——Typora Markdown安装教程(2023九月亲测可用!!!)

目录 一、简介 1.Markdown简介 2.Markdown特点 3.Typora简介 二、安装教程 1.下载安装包 2.解压到文件夹 3.安装 4.破解 ​编辑5.激活 三、Markdown常用语法 1.常用语法 2.用于编辑LaTex公式 四、其他编辑器 一、简介 1.Markdown简介 Markdown 是一种轻量级标记语…

Java多线程篇(3)——线程池

文章目录 线程池ThreadPoolExecutor源码分析1、如何提交任务2、如何执行任务3、如何停止过期的非核心线程4、如何使用拒绝策略 ScheduledThreadPoolExecutor源码分析 线程池 快速过一遍基础知识 7大参数 corePoolSize : 核心线程数 maximumPoolSize: 最…

Docsify介绍—md文件直接生成网页的工具

Markdown是一种轻量级标记语言,它使用易读易写的纯文本格式,用于编写文档,如README,wiki,博客文章等。Markdown语言最初由约翰格鲁伯(John Gruber)和亚伦斯沃茨(Aaron Swartz&#x…

ssm637教材管理系统+vue

项目介绍 当下,正处于信息化的时代,许多行业顺应时代的变化,结合使用计算机技术向数字化、信息化建设迈进。以前学校对于教材信息的管理和控制,采用人工登记的方式保存相关数据,这种以人力为主的管理模式已然落后。本…

YOLO系列

一、YOLOv1 Bbox使用开根号的原因: 小目标与大目标偏移相同尺度时,小目标检测效果差,那么公式中使用根号就会让小目标损失值更大了 V1网络的一些问题: 小目标检测效果差,当目标出现新配置也不行,目标定位…

红黑树插入的实现

红黑树: 1.概念: 红黑树的性质: 红黑树的插入操作: 其前面的插入和二叉搜索树的一模一样,只是后面需要判断是否满足红黑树的性质: 具体分为三种情况: 1.uncle节点存在且为红色的&#xff1a…

芯科蓝牙BG27开发笔记9-资料整理

SSV5中的例程 在ssv5中有少量开箱即用的例程,第一篇笔记就是从这里开始的: 然而,仅仅这些代码吗?其他例程代码在何处? Software Developer Docs - Silicon Labs 所有内容都可以在官网文档找到。 之前是从ssv5直接开…