使用sam进行零样本、零学习的分割实践

参照:利用SAM实现自动标注_sam标注-CSDN博客,以及SAM(分割一切模型)的简单调用_sam使用-CSDN博客

sam简介:

        Segment Anything Model(SAM)是Meta公司于2023年发布的一种AI模型,它打破了现有的分割技术,通过解决任意输入图像的分割问题,开启了发现世界中对象和区域可能性的新时代。 SAM对人类数字世界和整个视觉应用生态系统有着深远的影响,推动软件与用户的互动方式达到了新的高度。

        Segment Anything Model的主要特点包括:

        1. 卓越的准确性:在最为复杂的COCO panoptic基准上,SAM以超过56%的mask quality领先于其他方法。模型的准确性与之前的最佳方法相比,提高了30%,并且比亚军模型高出10个百分点。  

        2. 即插即用:模型以一种即插即用的方式提供,不需要重新训练或微调,同时能够泛化到之前未见过的图像和任务。  

        3. 遮罩调优能力:用户可以使用单个点击(称为点提示)来校正或微调模型的初始分割结果。  

        4. 多模式提示:模型能够采用来自多种模式的输入,包括复选框、排除框和标记点,用于优化分割。  

        5. 灵活性:支持处理各种任务,从细粒度的边界到粗糙的分割。  

        6. 速度:仅需约0.3秒/帧的速度,在快速和准确之间取得了平衡,与现有的交互式分割方法相比,显著减少了时间需求。  

        7. 强大的泛化能力:SAM 在不同的数据集和应用场景下都表现出了良好的泛化能力,不仅可以处理各种类型的图像,对于一些它未见过或相对模糊的场景,同样能实现较好的图像分割效果。

        总的来说,SAM提供了一种高效的分割解决方案,具有高度的灵活性和准确性,同时不需要像传统的分割方法那样进行大量的微调和训练。

        本文通过一个简单的图片分割实践来体验一下sam在非标图片的零样本、零训练下的分割能力。

一、前期准备

        1、下载或克隆项目,打开下面的网址,可以克隆或者下载zip文件,这里选择了下载zip文件:GitCode - 全球开发者的开源社区,开源代码托管平台

 得到了文件:segment-anything-main.zip

在这个网页中,还可以看到环境的要求:

        2、按照上面的要求在conda虚拟环境下安装pytorch和torchvision。这里要注意,虽然SAM没有直接对CUDA版本提出要求,  但是pytorch和CUDA的版本是紧密相关的。

选择了:

        pytorch=1.7.1

        torchvision=0.8.0

        python=3.8

        cuda=11.0

        cudnn=8.0.5

具体的版本选择方法见:人工智能学习用的电脑安装cuda、torch、conda等软件,版本的选择以及多版本切换_cuda版本要求-CSDN博客

如果使用在线的方式:Previous PyTorch Versions | PyTorch 

 根据选定的版本下载和安装相关的torch、cuda、conda等工具和软件。

        3、安装必要的依赖包

pip install opencv-python pycocotools matplotlib onnxruntime onnx

        4、下载SAM-TOOL:GitCode - 全球开发者的开源社区,开源代码托管平台    ,得到文件SAM-Tool-main.zip。

        5、 下载模型:https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth

 得到文件:sam_vit_h_4b8939.pth

        6、安装:将segment-anything-main.zip解压缩,进入SAM所在的文件夹目录后,在目录下鼠标右键-->“打开于终端”,然后:

pip install -e .

二、牛刀小试

        1、安装完成后,在segment-anything-main目录下新建目录imgs用于存放图片,新建models目录用以存放模型权重,并新建demo.py,作为测试的脚本。

2、将前面下载得到的阶段权重模型sam_vit_h_4b8939.pth,复制到models目录。

3、将测试用的图片复制到imgs目录。图片是一个工业产品的微观图,特征如下:

 图片的大小为1200*850像素,将(330,390)与(480,550)框定的范围作为采样的样本。

4、demo.py的代码内容:

import torch
from segment_anything import SamPredictor, sam_model_registry
import cv2
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image# 加载模型
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
sam_checkpoint = "models/sam_vit_h_4b8939.pth"  # 这里填写模型权重路径
model_type = "vit_h"   # 模型类型,可选vit_h, vit_l, vit_b
sam = sam_model_registry[model_type](checkpoint=sam_checkpoint)   # 加载模型
sam.to(device=device)   # 将模型加载到GPU或CPU# 初始化SAM预测器
predictor = SamPredictor(sam)# 读取图片
image_path = "/home/dy/program/segment-anything-main/imgs/IMG_PP.jpg"  # 图片路径
image = cv2.imread(image_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)   # 将图片转换为RGB格式# 设置输入图片
predictor.set_image(image)# 指定一些提示点,指导SAM识别特定对象
input_point = np.array([[330, 390], [480, 550]])  # 将列表转换为NumPy数组
input_label = np.array([1, 1])  # 也将标签转换为NumPy数组# 获得掩膜
masks, scores, logits = predictor.predict(   # 返回掩膜、置信度、类别概率point_coords=input_point,   # 指定提示点point_labels=input_label,   # 指定提示点对应的标签multimask_output=True,     # 是否输出多类别掩膜
)print("置信度:", scores,"类别概率:", logits)   # 显示置信度, 类别概率def show_masks(masks):   # 显示掩膜for i, mask in enumerate(masks):mask_image = (mask * 255).astype("uint8")    # 将掩膜转换为8位无符号整数mask = Image.fromarray(mask_image)     # 将掩膜转换为PIL图像mask = mask.convert("L")    # 将掩膜转换为灰度图像plt.imshow(mask, cmap='jet', alpha=0.5)    # 显示掩膜# 显示结果
plt.figure(figsize=(10, 10))     #  设置画布大小
plt.imshow(image)     # 显示原图
show_masks(masks)    # 显示掩膜
plt.axis('off')      #  隐藏坐标轴
plt.show()    # 显示图像

5、运行脚本,输出结果:

 看得出,针对一个零样本、零训练的非标图片,sam的表现还是非常优异的。

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

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

相关文章

【Git】—— 使用git操作远程仓库(gitee)

目录 一、远程仓库常用命令 1、从远程仓库克隆项目 2、查看关联的远程仓库 3、添加关联的远程仓库 4、移除关联的远程仓库 5、将本地仓库推送到远程仓库 6、从远程仓库拉取项目 二、分支命令 1、查询分支 2、创建分支 3、切换分支 4、推送到远程分支 5、合并分支 …

攻防世界web新手第五题supersqli

这是题目,题目看起来像是sql注入的题,先试一下最常规的,输入1,回显正常 输入1‘,显示错误 尝试加上注释符号#或者–或者%23(注释掉后面语句,使1后面的单引号与前面的单引号成功匹配就不会报错…

【MySQL】SQL 优化经验

1. 表的设计优化 参考依据:参考阿里开发手册嵩山版,其中有很多关于MySQL表设计的内容。类型选择:根据存储内容选择合适类型,如数值存储可选tinyint、bigint等,字符串可选varchar或text,根据内容长短选择合…

使用 .NET 6 或 .NET 8 上传大文件

如果您正在使用 .NET 6,并且它拒绝上传大文件,那么本文适合您。 我分享了一些处理大文件时需要牢记的建议,以及如何根据我们的需求配置我们的服务,并提供无限制的服务。 本文与 https://blog.csdn.net/hefeng_aspnet/arti…

STM32使用UART发送字符串与printf输出重定向

首先我们先看STM32F103C8T6的电路图 由图可知,其PA9和PA10引脚分别为UART的TX和RX(注意:这个电路图是错误的,应该是PA9是X而PA9是RX,我们看下图的官方文件可以看出),那么接下来我们应该找到该引脚的定义是什么&#xf…

转运机器人推动制造业智能化转型升级

​在当今制造业智能化转型的浪潮中,技术创新成为企业脱颖而出的关键。富唯转运机器人凭借一系列先进技术,成为智能转型的卓越之选。 一体化 AMR 控制系统是富唯的一大亮点。它采用低代码流程搭建和配置模式,极大地缩短了部署时间。企业无需耗…

深度分析java 使用 proguard 如何解析混淆后的堆栈

经过proguard混淆过后,发生异常时堆栈也进行了混淆,那么如果获取的原始的堆栈呢?我们下面来看下 使用proguard 根据mapping文件直接解析 import proguard.obfuscate.MappingReader; import proguard.retrace.FrameInfo; import proguard.re…

基于JAVA+SpringBoot+Vue的影院订票系统

基于JAVASpringBootVue的影院订票系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接🍅 哈喽兄…

LeetCode 83 :删除排链表中的重复元素

题目: 地址:https://leetcode.cn/problems/remove-duplicates-from-sorted-list/ 方法一: 方法二: package com.zy.leetcode.LeetCode_04;/*** Author: zy* Date: 2024-12-25-15:19* Description: 删除排链表中的里复元素* …

金仓数据库-用户与角色对象权限访问的查看

数据库用户 创建用户 创建用户且设置密码 create user user01 password 123;\du 查看用户user01,可以看见创建成功 创建用户设置密码和不可继承 create user02 password 123 noinherit;修改用户的属性 设置用户的连接数 设置为1个 alter user user01 connect…

理解神经网络

神经网络是一种模拟人类大脑工作方式的计算模型,是深度学习和机器学习领域的基础。 基本原理 神经网络的基本原理是模拟人脑神经系统的功能,通过多个节点(也叫神经元)的连接和计算,实现非线性模型的组合和输出。每个…

联通光猫怎么自己改桥接模式?

环境: 联通光猫 ZXHN F677V9 硬件版本号 V9.0 软件版本号 V9.0.0P1T3 问题描述: 联通光猫怎么自己改桥接模式 家里用的是ZXHN F677V9 光猫,最近又搞了个软路由,想改桥接模式 解决方案: 1.拿到最新超级密码&…

Matrix-Breakout 2 Morpheus(找到第一个flag)

第一步 信息收集 (1)寻找靶场真实ip arp-scan -l 靶场真实 ip 为192.168.152.154 (2)探测端口及服务 nmap -p- -sV 192.168.52.135 第二步 开始渗透 (1)访问web服务 http://192.168.152.154and http://192.168.52.135:81 发现 81 端口的页面要登录 我们使用 dirb 扫描…

【CSS in Depth 2 精译_094】16.2:CSS 变换在动效中的应用(下)——导航菜单的文本标签“飞入”特效与交错渲染效果的实现

当前内容所在位置(可进入专栏查看其他译好的章节内容) 第五部分 添加动效 ✔️【第 16 章 变换】 ✔️ 16.1 旋转、平移、缩放与倾斜 16.1.1 变换原点的更改16.1.2 多重变换的设置16.1.3 单个变换属性的设置 16.2 变换在动效中的应用 16.2.1 放大图标&am…

机器人C++开源库The Robotics Library (RL)使用手册(三)

进入VS工程,我们先看看这些功能函数及其依赖库的分布关系: rl命名空间下,主要有八大模块。 搞定VS后将逐个拆解。 1、编译运行 根据报错提示,配置相应错误的库(根据每个人安装位置不同而不同,我的路径如下:) 编译所有,Release版本耗时大约10分钟。 以rlPlan运动…

【报错】node:internal/modules/cjs/loader:936

报错问题: 当执行npm run dev后,出现下面错误 这个错误一般是由于Node.js无法找到所需的模块而引起的,解决此问题的一种方法就是重新安装所需的模块。 解决办法: 删除npm install 所下载在项目里的node_modules文件执行操作&…

Bash 脚本教程

注:本文为 “Bash 脚本编写” 相关文章合辑。 BASH 脚本编写教程 as good as well于 2017-08-04 22:04:28 发布 这里有个老 American 写的 BASH 脚本编写教程,非常不错,至少没接触过 BASH 的也能看懂! 建立一个脚本 Linux 中有…

谷歌浏览器 Chrome 提示:此扩展程序可能很快将不再受支持

问题现象 在Chrome 高版本上的扩展管理页面(地址栏输入chrome://extensions/或者从界面进入): , 可以查看到扩展的情况。 问题现象大致如图: 问题原因 出现此问题的根本原因在于:谷歌浏览器本身的扩展机制发生了…

vue2 升级为 vite 打包

VUE2 中使用 Webpack 打包、开发,每次打包时间太久,尤其是在开发的过程中,本文记录一下 VUE2 升级Vite 步骤。 安装 Vue2 Vite 依赖 dev 依赖 vitejs/plugin-vue2": "^2.3.3 vitejs/plugin-vue2-jsx": "^1.1.1 vite&…