【CV大模型SAM(Segment-Anything)】如何一键分割图片中所有对象?并对不同分割对象进行保存?

news/2024/11/24 11:46:41/

之前的文章【CV大模型SAM(Segment-Anything)】真是太强大了,分割一切的SAM大模型使用方法:可通过不同的提示得到想要的分割目标,中详细介绍了大模型SAM(Segment-Anything)根据不同的提示方式得到不同的目标分割结果。

后续有小伙伴问我,怎么样一键分割图片中的所有对象,并且保存各个对象的分割结果? 这篇文章解答一下这个问题。

如何保存不同提示的分割结果?请参考我的另一篇博文:【CV大模型SAM(Segment-Anything)】如何保存分割后的对象mask?并提取mask对应的图片区域?

关于Segment-Anything模型的相关代码、论文PDF、预训练模型、使用方法等,我都已打包好,供需要的小伙伴交流研究,获取方式如下:

关注文末名片GZH:阿旭算法与机器学习,回复:【SAM】即可获取SAM相关代码、论文、预训练模型、使用方法文档等
在这里插入图片描述

1. 一键分割图片中所有对象

import numpy as np
import torch
import matplotlib.pyplot as plt
import cv2def 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)for ann in sorted_anns:m = ann['segmentation']img = np.ones((m.shape[0], m.shape[1], 3))color_mask = np.random.random((1, 3)).tolist()[0]for i in range(3):img[:,:,i] = color_mask[i]ax.imshow(np.dstack((img, m*0.35)))image = cv2.imread('notebooks/images/dog.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)plt.figure(figsize=(20,20))
plt.imshow(image)
plt.axis('off')
plt.show()import sys
sys.path.append("..")
from segment_anything import sam_model_registry, SamAutomaticMaskGenerator, SamPredictorsam_checkpoint = "./models/sam_vit_b_01ec64.pth"
model_type = "vit_b"device = "cpu"sam = sam_model_registry[model_type](checkpoint=sam_checkpoint)
sam.to(device=device)mask_generator = SamAutomaticMaskGenerator(sam)
masks = mask_generator.generate(image)plt.figure(figsize=(20,20))
plt.imshow(image)
show_anns(masks)
plt.axis('off')
plt.show()

原图:
请添加图片描述
一键分割后的结果:
请添加图片描述

2.一键分割的SamAutomaticMaskGenerato参数调整与说明

调整SamAutomaticMaskGenerator函数相关的参数,可以得到不同尺度的分割结果,代码示例如下:

mask_generator_2 = SamAutomaticMaskGenerator(model=sam,points_per_side=32,pred_iou_thresh=0.86,stability_score_thresh=0.92,crop_n_layers=1,crop_n_points_downscale_factor=2,min_mask_region_area=100,  # Requires open-cv to run post-processing
)masks2 = mask_generator_2.generate(image)plt.figure(figsize=(20,20))
plt.imshow(image)
show_anns(masks2)
plt.axis('off')
plt.show()

分割结果:
请添加图片描述
通过调整SamAutomaticMaskGenerator函数的相应参数后,可以发现:相比于默认参数,这个示例分割的结果更加细致了,例如:盆子里面的不同区域等都被独立分割出来了。
SamAutomaticMaskGenerator()参数详细说明:

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

  • points_per_side (int or None): 沿着图像一侧采样的点的数量。点的总数是point_per_side**2。如果没有,'point_grids’必须提供明确的点采样。

  • points_per_batch (int):设置模型同时运行的点的数量。更高的数字可能会更快,但会使用更多的GPU内存。

  • pred_iou_thresh (float): 滤波阈值,在[0,1]中,使用模型的预测掩膜质量。

  • stability_score_thresh (float):滤波阈值,在[0,1]中,使用掩码在用于二进制化模型的掩码预测的截止点变化下的稳定性。

  • stability_score_offset (float):计算稳定性分数时,对截止点的偏移量。 - box_nms_thresh (float):非最大抑制用于过滤重复掩码的箱体IoU截止点。

  • crop_n_layers (int):如果>0,蒙版预测将在图像的裁剪上再次运行。设置运行的层数,其中每层有2**i_layer的图像裁剪数。

  • crop_nms_thresh (float):非最大抑制用于过滤不同作物之间的重复掩码的箱体IoU截止值。

  • crop_overlap_ratio(float):设置作物重叠的程度。在第一个作物层中,作物将以图像长度的这个分数重叠。在第一个裁剪层中,裁剪物将以图像长度的这一比例重叠,以后的裁剪层中,更多的裁剪物将缩小这一重叠。

  • crop_n_points_downscale_factor (int):在图层n中每面采样的点数被crop_n_points_downscale_factor**n缩减。

  • point_grids (list(np.ndarray) or None):用于取样的明确网格的列表,归一化为[0,1]。列表中的第n个网格被用于第n个作物层。与points_per_side排他。

  • min_mask_region_area (int):如果>0,后处理将被应用于移除面积小于min_mask_region_area的遮罩中的不连接区域和孔。需要opencv。

  • output_mode (str):掩模的返回形式。可以是’binary_mask’, ‘uncompressed_rle’, 或者’coco_rle’。coco_rle’需要pycocotools。对于大的分辨率,'binary_mask’可能会消耗大量的内存。

SamAutomaticMaskGenerator()函数的参数默认值:

model: Sam,
points_per_side: Optional[int] = 32,
points_per_batch: int = 64,
pred_iou_thresh: float = 0.88,
stability_score_thresh: float = 0.95,
stability_score_offset: float = 1.0,
box_nms_thresh: float = 0.7,
crop_n_layers: int = 0,
crop_nms_thresh: float = 0.7,
crop_overlap_ratio: float = 512 / 1500,
crop_n_points_downscale_factor: int = 1,
point_grids: Optional[List[np.ndarray]] = None,
min_mask_region_area: int = 0,
output_mode: str = “binary_mask”,

3. 保存所有分割后的目标对象

for i, mask in enumerate(masks):mask = ~mask['segmentation']mask = mask + 255mask = np.repeat(mask[:, :, np.newaxis], 3, axis=2)mask = mask.astype(np.uint8)res = cv2.bitwise_and(image, mask)res[res == 0] = 255plt.imshow(res)plt.savefig('res-{}.png'.format(i + 1))plt.show()

下图只展示了4个分割结果:
在这里插入图片描述
关于Segment-Anything模型的相关代码、论文PDF、预训练模型、使用方法等,我都已打包好,供需要的小伙伴交流研究,获取方式如下:

关注文末名片GZH:阿旭算法与机器学习,回复:【SAM】即可获取SAM相关代码、论文、预训练模型、使用方法文档等
在这里插入图片描述

如果文章对你有帮助,感谢点赞+关注!


http://www.ppmy.cn/news/384045.html

相关文章

【通信原理实验】基于A律13折线的PCM编码与解码(附完整代码)

一、实验原理 PCM,Pulse Code Modulation(脉冲编码调制),即把从模拟信号抽样、量化、编码成为二迚制符号的基本过程, 称为脉冲编码调制。 模拟信号的数字化过程: 1、抽样 – 时间离散:时间连续…

DLNA(明基的返校讲座)

数位家庭技术的两大标准 DLNA是目前产业界最大的标准,DLNA建议采用UPnP这个业界标准。 UPnP世界有七、八百家公司加入,在DLNA这一块有将近快三百家厂商加入,几乎市面上看的到的品牌都有加入这两大协会。这两个是非常显眼的工业标准&#xff0…

[转帖]从光刻机的发展,看懂ASML为何是不可取替

从光刻机的发展,看懂ASML为何是不可取替 http://mini.eastday.com/mobile/171230223351249.html# 2017-12-30 22:33 来源:半导体行业观察 阿斯麦(ASML.O)是全球最大的半导体光刻机设备及服务提供商,在细分领域具备垄断地位。总部位于荷兰费…

蓝牙基本介绍及相关应用

蓝牙(BlueTooth)技术详解 沸沸扬扬的数字和信息的世界不断有活力的注入,而BlueTooth为语音、文字及影像的无线传输大开方便之门,瞬间便带来了移动通讯的新视野。即便BlueTooth仍旧有许多细节亟待解决,但当BlueTooth技术较为完善的那一天,无…

为什么我抓不到baidu的数据包

最近,有位读者问起一个奇怪的事情,他说他想抓一个baidu.com的数据包,体验下看包的乐趣。 但却发现“抓不到”,这就有些奇怪了。 我来还原下他的操作步骤。 首先,通过ping命令,获得访问百度时会请求哪个I…

软件测试面试通关秘籍,一些回答的“禁忌“

“你为什么从上一家公司离职?”这个问题在面试时基本都会被问到,这是无法避免的问题。那么什么样的理由才能做到既反映实际情况,又能得到HR认可呢?以下的几种回答千万不能脱口而出。 1、毫无顾忌地说前公司的坏话 1)…

内网渗透—隧道搭建Ngrok与Frp内网穿透

这里写目录标题 1. 前言1.1. 隧道技术介绍1.2. 代理技术介绍1.2.1. 正向代理1.2.2. 反向代理1.2.3. 透明代理1.2.4. 正向代理与透明代理区别 2. 内网穿透2.1. Ngrok2.1.1. 访问Ngrok2.1.2. 代理设置2.1.2.1. 开通代理2.1.2.2. 配置隧道2.1.2.3. 下载客户端 2.1.3. 配置客户端2.…

【方法调用(解析与分派)】

文章目录 方法调用(解析与分派)小故事 方法调用(解析与分派) 方法调用是指在程序运行时,程序通过方法名来执行这个方法的过程。方法调用的实现需要解析和分派两个步骤。 解析(Resolution)是指…