FastSAM 分割一切 速度可以比 SAM 快 50 倍

一、FastSAM

在自然语言处理领域有 ChatGPT 通用大语言模型系列,但是在图像领域好像一直没有通用领域模型,但MetaAI 提出能够 分割一切 的视觉基础大模型 SAM 可以做到很好的分割效果,并且不限于场景、不限于目标,为探索视觉大模型提供了一个新的方向,可以说是视觉领域通用大模型。而 FastSAM 为该任务提供了一套实时的解决方案,进一步推动了分割一切模型的实际应用和发展。

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

在这里插入图片描述

FastSAM 同样实现了 SAM 的各种提示来分割感兴趣的特定对象。包括点提示、框提示和文本提示,通过这种提示的方式进一步促进了通用领域模型的应用:

在这里插入图片描述

  • 论文地址:https://arxiv.org/pdf/2306.12156.pdf
  • 代码地址:https://github.com/CASIA-IVA-Lab/FastSAM
  • web demo:https://huggingface.co/spaces/An-619/FastSAM

FastSAM VS SAM

运行速度:

在这里插入图片描述

内存使用:

在这里插入图片描述

更多介绍,大家可以关注官方论文和 GitHub

二、FastSAM 使用

拉取官方代码:

git clone https://github.com/CASIA-IVA-Lab/FastSAM.git

下载相关依赖:

pip install --trusted-host mirrors.tuna.tsinghua.edu.cn -r requirements.txt -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple/

还需要 openai-clip 依赖:

pip install openai-clip==1.0.1 -i https://pypi.tuna.tsinghua.edu.cn/simple

下载 FastSAM 模型权重,其中 FastSAM_S 是轻量级的实现,模型更小,运算速度更快:

FastSAM_X : https://drive.google.com/file/d/1m1sjY4ihXBU1fZXdQ-Xdj-mDltW-2Rqv/view

FastSAM_S: https://drive.google.com/file/d/10XmSj6mmpmRb8NhXbtiuO9cTTBwR_9SV/view

将下载的模型放到项目的weights目录下:

在这里插入图片描述

使用下面官方图像进行测试:

在这里插入图片描述

1. 分割一切:

FastSAM 会将一切他认为可以分割的东西进行分割

from fastsam import FastSAM, FastSAMPrompt
import matplotlib.pyplot as pltdef main():# 加载模型model = FastSAM('./weights/FastSAM_X.pt')# 图像地址IMAGE_PATH = './images/dogs.jpg'# 指定设备DEVICE = 'cpu'everything_results = model(IMAGE_PATH, device="'cpu'", retina_masks=True, imgsz=1024, conf=0.4, iou=0.9,)prompt_process = FastSAMPrompt(IMAGE_PATH, everything_results, device=DEVICE)# everything promptann = prompt_process.everything_prompt()output_img= prompt_process.plot_to_result(annotations=ann)plt.imshow(output_img)plt.show()if __name__ == '__main__':main()

输出效果:

在这里插入图片描述

2. bbox prompts

根据给定一个左上角和一下右下角所形成一个矩形框,对该框中的目标进行分割:

例如:框出黑色狗的区域

from fastsam import FastSAM, FastSAMPrompt
import matplotlib.pyplot as plt
import matplotlib.patches as patchesdef main():# 加载模型model = FastSAM('./weights/FastSAM_X.pt')# 图像地址IMAGE_PATH = './images/dogs.jpg'# 指定设备DEVICE = 'cpu'everything_results = model(IMAGE_PATH, device="'cpu'", retina_masks=True, imgsz=1024, conf=0.4, iou=0.9, )prompt_process = FastSAMPrompt(IMAGE_PATH, everything_results, device=DEVICE)# 目标框bbox = [578, 230, 776, 589]# bbox default shape [0,0,0,0] -> [x1,y1,x2,y2]ann = prompt_process.box_prompt(bboxes=[bbox])output_img = prompt_process.plot_to_result(annotations=ann)fig, ax = plt.subplots()ax.imshow(output_img)rectangle = patches.Rectangle((bbox[0],bbox[1]), (bbox[2]-bbox[0]), (bbox[3]-bbox[1]), linewidth=1, edgecolor='b', facecolor='none')ax.add_patch(rectangle)plt.show()if __name__ == '__main__':main()

在这里插入图片描述

3. Point prompt

根据给定目标区域中某个点的形式分割出该目标。

例如:给出黑色狗身上的点

from fastsam import FastSAM, FastSAMPrompt
import matplotlib.pyplot as plt
import matplotlib.patches as patchesdef main():# 加载模型model = FastSAM('./weights/FastSAM_X.pt')# 图像地址IMAGE_PATH = './images/dogs.jpg'# 指定设备DEVICE = 'cpu'everything_results = model(IMAGE_PATH, device="'cpu'", retina_masks=True, imgsz=1024, conf=0.4, iou=0.9, )prompt_process = FastSAMPrompt(IMAGE_PATH, everything_results, device=DEVICE)point = [661, 380]pointlabel = 1# point prompt# points default [[0,0]] [[x1,y1],[x2,y2]]# point_label default [0] [1,0] 0:background, 1:foregroundann = prompt_process.point_prompt(points=[point], pointlabel=[pointlabel])output_img = prompt_process.plot_to_result(annotations=ann)fig, ax = plt.subplots()ax.imshow(output_img)ax.scatter(point[0], point[1], color='r', marker='o', label='Points')plt.show()if __name__ == '__main__':main()

在这里插入图片描述

4. Text prompt

根据文本提示的方式分割出目标,目前仅限英语提示:

例如:分割出黑色的狗:the black dog

from fastsam import FastSAM, FastSAMPrompt
import matplotlib.pyplot as pltdef main():# 加载模型model = FastSAM('./weights/FastSAM_X.pt')# 图像地址IMAGE_PATH = './images/dogs.jpg'# 指定设备DEVICE = 'cpu'everything_results = model(IMAGE_PATH, device="'cpu'", retina_masks=True, imgsz=1024, conf=0.4, iou=0.9,)prompt_process = FastSAMPrompt(IMAGE_PATH, everything_results, device=DEVICE)# text promptann = prompt_process.text_prompt(text='the black dog')output_img = prompt_process.plot_to_result(annotations=ann)plt.imshow(output_img)plt.show()if __name__ == '__main__':main()

在这里插入图片描述

三、结合目标检测进行实例分割

以目标检测模型的 bboxs 作为提示给到 FastSAM 分割其中的目标:

import os
import torch
from torchvision.models.detection import fasterrcnn_resnet50_fpn_v2
from torchvision.transforms import functional as F
from PIL import Image, ImageDraw, ImageFont
from torchvision.ops import nms
from fastsam import FastSAM, FastSAMPrompt
import matplotlib.pyplot as plt
import numpy as np
import random# COCO 目标分类
COCO_INSTANCE_CATEGORY_NAMES = ['__background__', 'person', 'bicycle', 'car', 'motorcycle','airplane', 'bus', 'train', 'truck', 'boat', 'traffic light','fire hydrant', 'N/A', 'stop sign', 'parking meter', 'bench','bird', 'cat', 'dog', 'horse', 'sheep', 'cow', 'elephant','bear', 'zebra', 'giraffe', 'N/A', 'backpack', 'umbrella', 'N/A','N/A', 'handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard','surfboard', 'tennis racket', 'bottle', 'N/A', 'wine glass','cup', 'fork', 'knife', 'spoon', 'bowl', 'banana', 'apple','sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza','donut', 'cake', 'chair', 'couch', 'potted plant', 'bed', 'N/A','dining table', 'N/A', 'N/A', 'toilet', 'N/A', 'tv', 'laptop','mouse', 'remote', 'keyboard', 'cell phone', 'microwave', 'oven','toaster', 'sink', 'refrigerator', 'N/A', 'book', 'clock','vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush'
]# 目标检测
def object_detection(image, model, iou_threshold=0.5, threshold=0.8):# 对图像进行预处理image_tensor = F.to_tensor(image)# 增加 batch 维度image_tensor = image_tensor.unsqueeze(0)# 获取预测结果with torch.no_grad():predictions = model(image_tensor)# 提取预测的边界框、类别和分数boxes = predictions[0]['boxes'].cpu().numpy()labels = predictions[0]['labels'].cpu().numpy()scores = predictions[0]['scores'].cpu().numpy()# 非极大值抑制keep = nms(torch.tensor(boxes), torch.tensor(scores), iou_threshold=iou_threshold)# 保留NMS后的结果boxes = boxes[keep]labels = labels[keep]scores = scores[keep]# 过滤掉低置信度的预测results = []bboxs = []for box, label, score in zip(boxes, labels, scores):if score > threshold:box = [round(coord, 2) for coord in box]classify = COCO_INSTANCE_CATEGORY_NAMES[label]score = round(score, 2)results.append({"box": box,"classify": classify,"score": score,})bboxs.append(box)return results, bboxs# 目标分割
def sam(image, model, bboxes, device="cpu", retina_masks=True, imgsz=1024, conf=0.4, iou=0.9):everything_results = model(image, device=device, retina_masks=retina_masks, imgsz=imgsz, conf=conf, iou=iou)prompt_process = FastSAMPrompt(image, everything_results, device=device)ann = prompt_process.box_prompt(bboxes=bboxes)return prompt_process.plot_to_result(annotations=ann)# 生成随机颜色
def generate_random_color():# 生成深色随机颜色r = random.randint(128, 255)g = random.randint(120, 180)b = random.randint(50, 125)return (r, g, b)def main():# 图像目录位置:image_path = "./img"# sam 模型位置sam_model_path = "./weights/FastSAM_X.pt"# 加载 FastSAM 模型sam_model = FastSAM(sam_model_path)# 加载预训练的 Faster R-CNN 模型object_detection_model = fasterrcnn_resnet50_fpn_v2(pretrained=True)object_detection_model.eval()# 字体font = ImageFont.truetype("arial.ttf", 20)for image_name in os.listdir(image_path):# 加载图像image = Image.open(os.path.join(image_path, image_name))# 目标检测results, bboxs = object_detection(image, object_detection_model)if (len(results) == 0):continue# 目标分割sam_image = sam(image, sam_model, bboxs)# 可视化结果sam_image = Image.fromarray(sam_image)draw = ImageDraw.Draw(sam_image)for item in results:box = item["box"]classify = item["classify"]score = item["score"]draw.rectangle(box, outline=generate_random_color(), width=2)draw.text((box[0], box[1]), f"{classify} ({score})", fill='red', font=font)plt.figure()plt.subplot(1, 2, 1)plt.imshow(image)plt.subplot(1, 2, 2)plt.imshow(sam_image)plt.show()if __name__ == '__main__':main()

运行示例:

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

在这里插入图片描述

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

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

相关文章

四. 基于环视Camera的BEV感知算法-BEVDet

目录 前言0. 简述1. 算法动机&开创性思路2. 主体结构3. 损失函数4. 性能对比总结下载链接参考 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》,链接。记录下个人学习笔记,仅供自己参考 本次课程我们来学习下课程第四章——基于环视Cam…

Java系列-HashMap构造方法

1.无参 只初始化了loadFactor public class HashMap<K,V> extends AbstractMap<K,V>implements Map<K,V>, Cloneable, Serializable {final float loadFactor;public HashMap() {this.loadFactor DEFAULT_LOAD_FACTOR; // all other fields defaulted} }2…

Android动画

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 目录 一、导读二、概览三、动画实现3.1 帧动画资源文件中实现…

【MySQL】触发器trigger / 事件

文章目录 1. 触发器 trigger1.1 触发器命名1.2 new和old关键字1.3 案例&#xff1a;insert 触发器1.4 练习&#xff1a;delete 触发器1.5 查看触发器 show triggers1.6 使用触发器记录对表的操作 2 事件2.1 打开 / 关闭事件调度器2.2 创建事件 create event2.3 查看&#xff0c…

软件设计师——数据结构(二)

&#x1f4d1;前言 本文主要是【数据结构】——软件设计师——数据结构的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…

5个免费、跨平台的SQLite数据库可视化工具

前言 SQLite是一个轻量级的嵌入式关系型数据库&#xff0c;目前最新的版本是 SQLite3。今天推荐5个实用的SQLite数据库可视化工具(GUI)&#xff0c;帮助大家更好的管理SQLite数据库。 什么是SQLite&#xff1f; SQLite是一个轻量级的嵌入式关系型数据库&#xff0c;它以一个…

dp中最短编辑距离的笔记(分析dp)

dp分析往往就是看最后一步的变化。 分析&#xff1a; 设a串长度为i&#xff0c;b串长度为j。题目要求为通过三种操作将a字符串转化为b字符串的最少次数。 删除操作&#xff1a; 把a[i]删除后a[1~i]和b[1~j]匹配&#xff0c;所以可以得到f[i - 1][j] 1&#xff0c;在此之前要先…

连锁管理系统是什么?有哪些功能?

连锁管理系统帮助门店实现POS收银管理、门店管理、采购订货管理、线上商城搭建、供应链管理一体化管理系统&#xff0c;快速提高门店管理效率&#xff0c;无论你的门店有多少&#xff0c;连锁总部都能通过系统随时洞察监管门店的所有运营数据。 连锁管理系统由&#xff1a;1个…

Eslint 要被 Oxlint替换了吗

什么是 Oxlint 由于最近的rust在前端领域的崛起,基于rust的前端生态链遭到rust底层重构,最近又爆出OxLint,是一款基于Rust的linter工具。Oxlint在国外前端圈引起热烈讨论,很多大佬给出了高度评价。 事实上,Oxlint 是 Oxc 项目旗下的一款产品,专为 JavaScript 和 TypeSc…

Java解决不同路径问题

Java解决不同路径问题 01 题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少…

linux修改mysql默认端口(很明智的选择因为后面会遇到各种问题)

1. 登录到mysql查看当前的端口号&#xff1a; show global variables like ‘port’; 2.编辑/etc/my.conf 文件添加port3506 这样的样式 保存退出&#xff1b; 内容: mysqld] port3506 datadir/var/lib/mysql socket/var/lib/mysql/mysql.sock usermysql # Disabling sy…

【CMU 15-445】Lecture 10: Sorting Aggregations Algorithms 学习笔记

Sorting & Aggregations Algorithms SortingTop-N Heap SortExternal Merge Sort2-WAY External Merge SortK-WAY External Merge SortDouble Buffering Optimization AggregationsSortingHashing 本节课主要介绍的是数据库系统中的排序算法以及聚合算法 Sorting 排序算法…

【TB作品】51单片机 实物+仿真-电子拔河游戏_亚博 BST-M51

代码工程。 http://dt4.8tupian.net/2/28880a66b12880.pg3这段代码是用于一个数字拔河游戏的嵌入式系统&#xff0c;采用了基于8051架构的单片机&#xff0c;使用Keil C51编译器。 主要功能包括&#xff1a; 数码管显示&#xff1a;使用了四个数码管&#xff08;通过P2的控制…

【华为数据之道学习笔记】5-4 数据入湖方式

数据入湖遵循华为信息架构&#xff0c;以逻辑数据实体为粒度入湖&#xff0c;逻辑数据实体在首次入湖时应该考虑信息的完整性。原则上&#xff0c;一个逻辑数据实体的所有属性应该一次性进湖&#xff0c;避免一个逻辑实体多次入湖&#xff0c;增加入湖工作量。 数据入湖的方式…

配置 vim 默认显示行号 行数 :set number

vi ~/.vimrc 最后添加一行 :set number保存退出&#xff0c;再次 vim 打开文件&#xff0c;默认就会显示行号了

Feign-实现Feign最佳实践

目录 一、实现最佳实践的步骤&#xff08;方式二&#xff09; 1.1 首先创建一个module&#xff0c;命名为feign-api&#xff0c;然后引入feign的starter依赖 1.2.将order-service中编写的UserClient、User、DefaultFeignConfiguration都复制到feign-api项目 1.3.在order-se…

Kali Linux安装Xrdp远程桌面工具结合内网穿透实现远程访问Kali桌面

文章目录 前言1. Kali 安装Xrdp2. 本地远程Kali桌面3. Kali 安装Cpolar 内网穿透4. 配置公网远程地址5. 公网远程Kali桌面连接6. 固定连接公网地址7. 固定地址连接测试 前言 Kali远程桌面的好处在于&#xff0c;它允许用户从远程位置访问Kali系统&#xff0c;而无需直接物理访…

vulnhub7

靶机地址&#xff1a;https://download.vulnhub.com/hackerkid/Hacker_Kid-v1.0.1.ova 这次的靶机风格比较偏向 OSCP 风格&#xff0c;区别于传统的 CTF 类型的靶机&#xff0c;只需要提权到 root 即可&#xff0c;而且这次打靶确实触碰到很多知识盲区了 提示&#xff1a;本地…

安卓开发学习---kotlin版---笔记(二)

UI学习 UI分类 安卓的UI分为两大类&#xff1a;一类叫做View视图&#xff0c;一类叫做ViewGroup容器 View视图&#xff1a;TextView,Button,ImageView都是常见的视图ViewGroup容器&#xff1a;内部尅承载、放置、添加View视图的容器 布局方式 安卓布局主要有&#xff1a;线…

【Qt图书管理系统】4.系统设计与详细设计

文章目录 核心流程图软件架构设计流程图软件开发类图及功能点 核心流程图 用户登录图书查询图书借阅图书归还账户管理 软件架构设计 流程图 软件开发类图及功能点 Dlg_Login 登录界面 Cell_Main 主窗体 Cell_MyBook 我的书籍 Cell_BookMgr 书籍管理 Cell_RecoredMgr 借阅记录…