sagment-anything官方代码使用详解

文章目录

  • 一. sagment-anything官方例程说明
    • 1. 结果显示函数说明
    • 2. SamAutomaticMaskGenerator对象
      • (1) SamAutomaticMaskGenerator初始化参数
    • 3. SamPredictor对象
      • (1) 初始化参数
      • (2) set_image()
      • (3) predict()
  • 二. SamPredictor流程说明
    • 1. 导入所需要的库
    • 2. 读取图像
    • 3. 加载模型
    • 4. 生成预测对象
    • 5. 设置要检测的图像
    • 6. 根据不同输入需求对图像进行掩膜预测
      • (1) 根据输入一个点,输出对于这个点的三个不同置信度的掩膜
      • (2) 通过多个点获取一个对象的掩膜
      • (3) 通过设置反向点反选掩膜
      • (4) boxes输入生成掩膜
      • (5) 同时输入点与boxes生成掩膜
      • (6) 多个输入输出不同预测结果
  • 三. SamAutomaticMaskGenerator预测流程
    • 1. 导入所需要的库
    • 2. 读取图像
    • 3. 加载模型
    • 4. 生成预测对象
    • 5. 设置要检测的图像
    • 6. 给分割出来的物体上色,显示分割效果
  • 四. SamAutomaticMaskGenerator不同参数下的检测效果
    • 1. points_per_side参数测试
    • 2. pred_iou_thresh参数测试
    • 3. stability_score_thresh参数测试
    • 4. box_nms_thresh参数测试
    • 5. crop_nms_thresh参数测试

一. sagment-anything官方例程说明

1. 结果显示函数说明

def show_anns(anns):if len(anns) == 0:returnsorted_anns = sorted(anns, key=(lambda x: x['area']), reverse=True)ax = plt.gca()ax.set_autoscale_on(False)img = np.ones((sorted_anns[0]['segmentation'].shape[0], sorted_anns[0]['segmentation'].shape[1], 4))img[:,:,3] = 0for ann in sorted_anns:m = ann['segmentation']color_mask = np.concatenate([np.random.random(3), [0.35]])img[m] = color_maskax.imshow(img)

2. SamAutomaticMaskGenerator对象

(1) SamAutomaticMaskGenerator初始化参数

  • model (Sam): 用于掩模预测的Sam模型。
  • points_per_side (int or None): 沿图像一侧要采样的点的数量。总点数为points_per_side 2 ^2 2。如果为None,则point_grids必须提供显式点采样。默认为32
  • points_per_batch (int): 设置模型同时检测的点数。更高的数字可能更快,但使用更多的GPU内存。默认为64
  • pred_iou_thresh (float): [0,1]中的滤波阈值,使用模型的预测掩码质量。默认值为0.88
  • stability_score_thresh (float): [0,1]中的滤波阈值,使用掩码在截断值变化下的稳定性,用于对模型的掩码预测进行二值化。默认值为0.95
  • stability_score_offset (float): 计算稳定性分数时,偏移截止值的量。默认值为1.0
  • box_nms_thresh (float): 非最大抑制用于过滤重复掩码的框IoU截止。默认值为0.7
  • crop_n_layers (int): 如果>0,将对图像的裁剪再次运行掩膜预测。设置要运行的层数,其中每层具有2*i_layer数量的图像裁剪。默认值为0
  • crop_nms_thresh (float): 非最大抑制用于过滤不同物体之间的重复掩码的框IoU截止。默认值为0.7
  • crop_overlap_ratio (float): 设置物体重叠的程度。在第一个裁剪层中,裁剪将重叠图像长度的这一部分。物体较多的后几层会缩小这种重叠。默认值为512 / 1500
  • crop_n_points_downscale_factor (int): 在层n中采样的每侧的点数按比例缩小crop_n_points_downscale_factor n ^n n。默认值为1
  • point_grids (list(np.ndarray) or None): 用于采样的点的显式网格上的列表,归一化为[0,1]。列表中的第n个栅格用于第n个裁剪层。与points_per_side独占。默认值为None
  • min_mask_region_area (int): 如果>0,将应用后处理来移除面积小于min_mask_region_area的掩膜来中断开连接的区域和孔。需要opencv。默认为0
  • output_mode (str): 表单掩码在中返回。可以是binary_maskuncompressed_rlecoco_rlecoco_rle需要pycocotools。对于大分辨率,binary_mask可能会消耗大量内存。默认为'binary_mask'
    “”"

3. SamPredictor对象

(1) 初始化参数

  • model (Sam): 用于掩模预测的Sam模型。

(2) set_image()

说明:设置检测的图像
参数:image(np.ndarray):用于计算掩码的图像。应为HWC uint8格式的图像,像素值为[0,255]。image_format(str):图像的颜色格式,以'RGB''BGR'为单位。

(3) predict()

说明:使用当前设置的图像预测给定输入提示的掩码。
参数:point_coords(np.ndarray或None):存放指向图像中物体的点的Nx2数组。每个点都以像素为单位(X,Y)。point_labels(np.ndarray或None):点提示的长度为N的标签阵列。1表示前景点,0表示背景点。box(np.ndarray或None):长度为4的数组,以XYXY格式向模型提供长方体提示。mask_input(np.ndarray):输入到模型的低分辨率掩码,通常来自先前的预测迭代。形式为1xHxW,其中对于SAM,H=W=256。multimask_output(bool):如果为true,则模型将返回三个掩码。对于不明确的输入提示(如单击),这通常会产生比单个预测更好的掩码。如果只需要单个遮罩,则可以使用模型的预测质量分数来选择最佳遮罩。对于非模糊提示,例如多个输入提示,multimask_output=False可以提供更好的结果。return_logits(bool):如果为true,则返回未阈值掩码logits,而不是二进制掩码。
返回值:(np.ndarray):CxHxW格式的输出掩码,其中C是掩码的数量,(H,W)是原始图像大小。(np.ndarray):长度为C的数组,包含模型对每个掩码质量的预测。(np.ndarray):形状为CxHxW的数组,其中C是掩码的数量,H=W=256。这些低分辨率logits可以作为掩码输入传递给后续迭代。

二. SamPredictor流程说明

1. 导入所需要的库

import numpy as np
import torch
import matplotlib.pyplot as plt
import cv2
import sys
from segment_anything import sam_model_registry, SamAutomaticMaskGenerator, SamPredictor

2. 读取图像

image = cv2.imread('images/dog.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)plt.figure(figsize=(20,20))
plt.imshow(image)
plt.axis('off')
plt.show()

3. 加载模型

sam_checkpoint = "sam_vit_h_4b8939.pth"  # 模型文件所在路径
model_type = "vit_h"  # 模型的类型
device = "cuda"  # 运行模型的设备sam = sam_model_registry[model_type](checkpoint=sam_checkpoint)  # 注册模型
sam.to(device=device)

4. 生成预测对象

mask_predictor = SamPredictor(sam)  # 生成sam预测对象

5. 设置要检测的图像

predictor.set_image(image)

6. 根据不同输入需求对图像进行掩膜预测

(1) 根据输入一个点,输出对于这个点的三个不同置信度的掩膜

input_point = np.array([[250, 187]])
input_label = np.array([1])# 在'multimask_output=True'(默认设置)的情况下,SAM输出3个掩码,其中“scores”给出了模型对这些掩码质量的估计。
masks, scores, logits = predictor.predict(point_coords=input_point, point_labels=input_label, multimask_output=True,)for i, (mask, score) in enumerate(zip(masks, scores)):plt.figure(figsize=(10,10))plt.imshow(image)show_mask(mask, plt.gca())show_points(input_point, input_label, plt.gca())plt.title(f"Mask {i+1}, Score: {score:.3f}", fontsize=18)plt.axis('off')plt.show()

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

(2) 通过多个点获取一个对象的掩膜

# 通过多个点获取一个对象的掩膜
input_point = np.array([[237, 244], [273, 259]])
input_label = np.array([1, 1])  # 把两个点的标签都设置为1,代表两个点为同一个目标物所有 masks, _, _ = predictor.predict(point_coords=input_point, point_labels=input_label, multimask_output=False)plt.figure(figsize=(10,10))
plt.imshow(image)
show_mask(masks, plt.gca())
show_points(input_point, input_label, plt.gca())
plt.axis('off')
plt.show()

在这里插入图片描述

(3) 通过设置反向点反选掩膜

# 通过多个点获取一个对象的掩膜
input_point = np.array([[237, 244], [319, 274]])
input_label = np.array([1, 0])  # 把两个点的标签都设置为1,代表两个点为同一个目标物所有 masks, _, _ = predictor.predict(point_coords=input_point, point_labels=input_label, multimask_output=False)plt.figure(figsize=(10,10))
plt.imshow(image)
show_mask(masks, plt.gca())
show_points(input_point, input_label, plt.gca())
plt.axis('off')
plt.show()

在这里插入图片描述

(4) boxes输入生成掩膜

input_box = np.array([228, 230, 280, 276])masks, _, _ = predictor.predict(point_coords=None, point_labels=None, box=input_box[None, :], multimask_output=False,)
plt.figure(figsize=(10, 10))
plt.imshow(image)
show_mask(masks[0], plt.gca())
show_box(input_box, plt.gca())
plt.axis('off')
plt.show()

在这里插入图片描述

(5) 同时输入点与boxes生成掩膜

input_point = np.array([[237, 244]])
input_label = np.array([1])
input_box = np.array([228, 230, 280, 276])masks, _, _ = predictor.predict(point_coords=input_point, point_labels=input_label, box=input_box[None, :], multimask_output=False,)
plt.figure(figsize=(10, 10))
plt.imshow(image)
show_mask(masks[0], plt.gca())
show_points(input_point, input_label, plt.gca())
show_box(input_box, plt.gca())
plt.axis('off')
plt.show()

在这里插入图片描述

(6) 多个输入输出不同预测结果

SamPredictor可以使用predict_tarch方法对同一图像输入多个提示(points、boxes)。该方法假设输入点已经是tensor张量,且boxes信息与image size相符合。例如,假设我们有几个来自对象检测器的输出结果。
SamPredictor对象(此外也可以使用segment_anything.utils.transforms)可以将boxes信息编码为特征向量(以实现对任意数量boxes的支持,transformed_boxes),然后预测mask。

input_boxes = torch.tensor([[228, 230, 280, 276],[495, 90, 554, 125],[447, 499, 494, 548],[162, 346, 214, 390],
], device=predictor.device) #假设这是目标检测的预测结果transformed_boxes = predictor.transform.apply_boxes_torch(input_boxes, image.shape[:2])masks, _, _ = predictor.predict_torch(point_coords=None, point_labels=None, boxes=transformed_boxes, multimask_output=False)plt.figure(figsize=(10, 10))
plt.imshow(image)
for mask in masks:show_mask(mask.cpu().numpy(), plt.gca(), random_color=True)
for box in input_boxes:show_box(box.cpu().numpy(), plt.gca())
plt.axis('off')
plt.show()

在这里插入图片描述

三. SamAutomaticMaskGenerator预测流程

1. 导入所需要的库

import numpy as np
import torch
import matplotlib.pyplot as plt
import cv2
import sys
from segment_anything import sam_model_registry, SamAutomaticMaskGenerator, SamPredictor

2. 读取图像

image = cv2.imread('images/dog.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)plt.figure(figsize=(20,20))
plt.imshow(image)
plt.axis('off')
plt.show()

3. 加载模型

sam_checkpoint = "sam_vit_h_4b8939.pth"  # 模型文件所在路径
model_type = "vit_h"  # 模型的类型
device = "cuda"  # 运行模型的设备sam = sam_model_registry[model_type](checkpoint=sam_checkpoint)  # 注册模型
sam.to(device=device)

4. 生成预测对象

mask_generator = SamAutomaticMaskGenerator(model=sam,points_per_side=32,points_per_batch=64,pred_iou_thresh=0.88,stability_score_thresh=0.95,stability_score_offset=1.0,box_nms_thresh=0.7,crop_n_layers=0,crop_nms_thresh=0.7,crop_overlap_ratio=0.34133,crop_n_points_downscale_factor=1,point_grids=None,min_mask_region_area=0,output_mode='binary_mask')

5. 设置要检测的图像

# 将图像送入推理对象进行推理分割,输出结果为一个列表,其中存的每个字典对象内容为:
# segmentation : 分割出来的物体掩膜(与原图像同大小,有物体的地方为1其他地方为0)
# area : 物体掩膜的面积
# bbox : 掩膜的边界框(XYWH)
# predicted_iou : 模型自己对掩模质量的预测
# point_coords : 生成此掩码的采样输入点
# stability_score : 掩模质量的一个附加度量
# crop_box : 用于以XYWH格式生成此遮罩的图像的裁剪
masks = mask_generator.generate(image)

6. 给分割出来的物体上色,显示分割效果

# 给分割出来的物体上色,显示分割效果
plt.figure(figsize=(20, 20))
plt.imshow(image)
show_anns(masks)
plt.axis('off')
plt.show()

在这里插入图片描述

四. SamAutomaticMaskGenerator不同参数下的检测效果

1. points_per_side参数测试

  1. points_per_side=4,检测到9个物体
    在这里插入图片描述

  2. points_per_side=16,检测到211个物体
    在这里插入图片描述

  3. points_per_side=64,检测到683个物体
    在这里插入图片描述

  4. points_per_side=256,检测到872个物体
    在这里插入图片描述

2. pred_iou_thresh参数测试

  1. pred_iou_thresh=1, 检测到1个物体
    在这里插入图片描述
  2. pred_iou_thresh=0.95, 检测到274个物体
    在这里插入图片描述
  3. pred_iou_thresh=0.8, 检测到792个物体
    在这里插入图片描述

3. stability_score_thresh参数测试

  1. stability_score_thresh=1,检测到0个物体
    kjui
  2. stability_score_thresh=0.95,检测到683个物体
    在这里插入图片描述
  3. stability_score_thresh=0.95,检测到764个物体
    在这里插入图片描述

4. box_nms_thresh参数测试

  1. box_nms_thresh=1,检测到4680个物体
    在这里插入图片描述

  2. box_nms_thresh=0.7,检测到683个物体
    在这里插入图片描述

  3. box_nms_thresh=0.4,检测到621个物体
    在这里插入图片描述

  4. box_nms_thresh=0.1,检测到458个物体
    在这里插入图片描述

  5. box_nms_thresh=0,检测到201个物体
    在这里插入图片描述

5. crop_nms_thresh参数测试

  1. crop_nms_thresh=1,检测到683个物体
    在这里插入图片描述

  2. crop_nms_thresh=0.7,检测到683个物体
    在这里插入图片描述

  3. crop_nms_thresh=0.1,检测到683个物体
    在这里插入图片描述

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

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

相关文章

【NI-RIO入门】Real Time(实时系统解释)

1.什么是实时系统? 实时系统可以非常精确可靠的执行需要特定时许要求的系统,对于许多工程项目来说,通用操作系统,例如WINDOWS等标准PC上运行测量和控制程序是无法精确控制计时的,这些系统很容易受用户的其他程序、图像…

数据挖掘与低代码开发应用:加速业务创新的黄金组合

数据挖掘与低代码开发是当今创新领域的两大热点技术。数据挖掘技术可以从大量数据中发现隐藏的模式和知识,为决策提供有力支持;而低代码开发则使得应用程序的开发变得更加快捷和高效。本文将介绍数据挖掘和低代码开发的概念及其应用,并阐述它…

GEE:使用拉普拉斯(Laplacian)算子对遥感图像进行卷积操作

作者:CSDN @ _养乐多_ 本文记录了使用拉普拉斯(Laplacian)算子对遥感图像进行卷积操作的代码。并以试验区NDVI图像为例。 研究区真彩色影像、NDVI图像以及Sobel卷积结果如下所示, 文章目录 一、拉普拉斯算子二、完整代码三、代码链接一、拉普拉斯算子 详细介绍参考《遥感…

决策树 算法原理

决策树 算法原理 决策树的原理 决策树: 从训练数据中学习得出一个树状结构的模型 决策树属于判别模型 决策树是一种树状结构,通过做出一系列决策 (选择) 来对数据进行划分,这类似于针对一系列问题进行选择。 决策树的决策过程就是从根节点开始&#…

不再只是android,华为自爆Harmony将对标iOS

今年10月,华为官方宣布,鸿蒙OS 4升级设备数量已突破1亿,成为史上升级最快的鸿蒙OS版本。 日前,据数码博主“定焦数码”消息,大厂技术员工做适配,通过线下沟通时,华为反复提到一个问题&#xff…

基于stm32的LCD1602与无线蓝牙温湿度显示

这一篇博客是为了实现温湿度的显示,温湿度传感器将数据穿给单片机,单片机又把数据送给LCD1602和蓝牙,让温度和湿度可以再LCD1602显示屏和手机上显示,它的执行逻辑和C51那里基本一样,就是要修改程序,在程序上…

Windows server——部署DHCP服务(2)

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.配置DHCP服务 1.DHCP安装的要求 安装DHCP服务器需要满足如下要求&#…

python pyaudio显示音频波形图

python pyaudio显示音频波形图 代码如下: import numpy as np import matplotlib.pylab as plb import wave# 读取 wav wf wave.open("./output.wav", "rb")# 获取音频相关参数:声道数、量化位数、采样频率、采样帧数 nchannels,…

2023全网最新-免杀方法大集结

目录 00. 概述 01. 简介 02. 静态免杀 1. 怎么找特征码 工具查找 手工查找 其他 2. 怎么免杀? 手工修改 非源码 工具免杀(盲免杀) 03. 行为动态免杀 行为拦截原理 如何进行行为免杀呢? 总结 注意/技巧 00. 概述 …

分享全球顶尖的AIGC文生图资源

1 引言 人工智能正在改变许多行业的格局,而其中改变最直观和影响最大的就是AIGC领域的图像创作。文生图技术作为AIGC的一个重要分支,展现了人工智能在视觉创作领域的巨大潜力。发展至今已经有很多AI文生图平台,这是一次革命性的突破&#xf…

ENVI植被指数阈值法

植被指数阈值法提取纯净像元 首先用ENVI打开无人机遥感影像 1. 假彩色显示 打开数据管理工具,无人机的4波段为红边波段 2. 波段计算 打开band math,输入 float(b1-b2)/(b1b2) 选择对应波段 3. 阈值筛选 阈值按经验值选的0.7,ndvi…

Vue3引入markdown编辑器--Bytemd

字节跳动开源了一款markdown编辑器,bytemd,项目地址:GitHub - bytedance/bytemd: ByteMD v1 repository 安装 npm i bytemd/vue-next 引入方式如下,再main.js中引入样式 import bytemd/dist/index.css 直接封装一个Markdown编…

Windows 10安装FFmpeg详细教程

Windows 10安装FFmpeg详细教程 0. 背景 在搭建之前的项目环境时,需要安装ffmpeg,在此记录下过程 1. 官网下载 点击进入官网:ffmpeg,官网地址:https://ffmpeg.org/download.html 如图所示,点击Windows图标…

Python中判定列表是否包含某个元素的方法

更多Python学习内容:ipengtao.com 大家好,我是彭涛,今天为大家分享 Python中判定列表是否包含某个元素的方法,全文4000字,阅读大约10分钟。 在Python编程中,判定一个列表是否包含特定元素是一项常见任务。本…

大模型技术的发展与实践

一、大模型的概念 大型语言模型,也称大语言模型、大模型(Large Language Model,LLM;Large Language Models,LLMs) 。 大语言模型是一种深度学习模型,特别是属于自然语言处理(NLP)的…

类和对象——(6)友元

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 没有存储汗水,就无法支取成…

【LeetCode】每日一题 2023_12_1 找出叠涂元素(读题/数组/哈希)

文章目录 刷题前唠嗑题目:找出叠涂元素题目描述代码与解题思路 结语 刷题前唠嗑 LeetCode?启动!!! 新的一个月开始啦!这个月也要继续蝉联月度刷题! 题目:找出叠涂元素 题目链接&a…

SD-WAN组网中的CPE及云服务CPE部署方法

什么是CPE? CPE全称为Customer Premises Equipment,即客户端设备,在SD-WAN中通常为路由器,部署在中心点和分支上,提供连接和路由、协议转换、流量监控等功能。一般可分为硬件CPE和虚拟化CPE(virtual CPE&a…

python结构数据类型【侯小啾python基础领航计划 系列(六)】

python结构数据类型【侯小啾python领航计划 系列(六)】 大家好,我是博主侯小啾, 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ�…

关于使用百度开发者平台处理语音朗读问题排查

错误信息:"convert_offline": false, "err_detail": "16: Open api characters limit reach 需要领取完 识别和合成都要有