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

news2025/2/10 23:59:10

之前的文章【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 cv2

def show_anns(anns):
    if len(anns) == 0:
        return
    sorted_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, SamPredictor

sam_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 + 255
    mask = np.repeat(mask[:, :, np.newaxis], 3, axis=2)
    mask = mask.astype(np.uint8)
    res = cv2.bitwise_and(image, mask)
    res[res == 0] = 255
    plt.imshow(res)
    plt.savefig('res-{}.png'.format(i + 1))
    plt.show()

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

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

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

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

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

相关文章

11. 100ASK-V853-PRO开发板 RGB屏测试指南

100ASK-V853-PRO开发板 RGB屏测试指南 硬件要求: 100ASK-V853-PRO开发板七寸RGB屏 软件要求: 固件下载地址:链接:百度网盘 提取码:sp6a 固件位于资料光盘中的10_测试镜像/1.测试七寸RGB屏/v853_linux_100ask_uart0.…

echarts中国地图使用整理

一、echarts中国地图使用案例 1.准备地图数据china.json ; 需要的添加微信&#xff1a;tianma104&#xff0c;我发你 2.引入jquery&#xff0c;引入eachars 库 <script src"http://xx/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script s…

Unity入门5——Camera

一、参数面板 二、参数介绍 1. Clear Flags&#xff1a;清除背景 Skybox&#xff1a;天空盒背景&#xff08;通常用来做 3D 游戏&#xff09; Solid Color&#xff1a;使用 Background 颜色填充&#xff08;通常设置为全黑或全白&#xff0c;2D 使用&#xff09; Depth Only&am…

【ARM AMBA ATB 入门 1 - ATB 总线简介】

文章目录 背景1.1 ATB BUS1.2.1 全局信号1.2.2 数据信号1.2.3 流控信号1.2.4 Trace ID1.2.5 Buffer Flusing 背景 在 AMBA3 中&#xff0c;增加了 Advanced Trace Bus (ATB) 总线作为片上调试的总线接口&#xff0c;为 Debug 和 Trace 提供一种解决方案。第3代总线是2003年发布…

存储快速入门——【1】网络存储主要技术(NAS、SAN、SCSI、CIFS、zone)

存储快速入门——【1】网络存储主要技术 1 NAS简介&#xff08;网络&#xff09; 在20世纪80年代初&#xff0c;英国纽卡斯尔大学布赖恩.兰德尔教授 ( Brian Randell)和同事通过“纽卡斯尔连接”成功示范和开发了在整套UNIX机器上的远程文件访问。继“纽卡斯尔连接”之后&…

Springboot集成Redis常见的报错和解决方案

Springboot集成Redis后运行时常见的报错信息和其解决方案 1. io.lettuce.core.protocol.CommandHandler : null Unexpected exception during request: java.io.IOException: 远程主机强迫关闭了一个现有的连接。报错信息原因分析解决方案 2. io.netty.util.internal.OutOfDire…

Python自动化测试 史上最全的进阶教程

Python自动化测试就是把以前人为测试转化为机器测试的一种过程。自动化测试是一种比手工测试更快获得故障反馈的方法。 随着时代的变革&#xff0c;也许在未来测试这个职位的需求会越来越少甚至消失&#xff0c;但是每一个组织&#xff0c;每一个客户对软件质量的要求是永远不…

剪辑软件生成的mp4素材无法打开的修复方法

专业剪辑软件可以对视频、音频进行各种修改、美化&#xff0c;像adobe的PR等。今天我们来看一个剪辑软件生成的视频无法打开的修复案例&#xff0c;看看遇到这种情况如何处理. 故障文件:273M和1.72G两个文件 故障现象: 剪辑完成后保存到移动硬盘&#xff08;文件系统为exfat…

VALSE 2023 无锡线下参会个人总结 6月10日-1

VALSE2023无锡线下参会个人总结6月10日-1 会场照片6月10日会议日程安排大会主旨报告&#xff1a;高文&#xff1a;特征编码与数字视网膜焦李成&#xff1a;下一代深度学习的思考与若干问题陈熙霖&#xff1a;计算机视觉-从孤立到系统性方法 企业宣讲环节&#xff08;一&#xf…

邓铎:书中自有天地人

邓铎&#xff0c;一个优秀的艺术家&#xff0c;他的书法作品、理论文章自成一派&#xff0c;从书法中咀嚼出人生百味&#xff0c;大千世界&#xff0c;写下了他生命中“六十余载&#xff0c;书中天地人”的执着与坚持。 作为一名优秀的书法家&#xff0c;邓铎的艺术表达具有独…

网安笔记14 firewall

防火墙概述 由软件和硬件组成的系统&#xff0c;它处于安全的网络和不安全的网络之间&#xff0c;根据由系统管理员设置的访问控制规则&#xff0c;对数据流进行过滤 对于内部攻击以及绕过防火墙的连接却无能为力 对数据流如何处理 允许数据流通过拒绝数据流通过&#xff0…

构建工具 Vite、Webpack、Rollup对比

Webpack介绍 热更新方面&#xff1a;webpack支持HMR&#xff0c;但是webpack需要全部重新编译并更新&#xff0c;效率较低 tree-shaking&#xff1a;webpack2开始支持且消除效果不好&#xff0c;但是webpack5有更好的tree-shaking&#xff08;去除未使用代码&#xff09; 分包…

0基础学习VR全景平台篇第43篇:编辑器底部菜单-隐藏场景

大家好&#xff0c;欢迎观看蛙色VR官方系列——后台使用课程&#xff01; 本期为大家带来蛙色VR平台&#xff0c;底部菜单—隐藏场景功能操作。 功能位置示意 一、本功能将用在哪里&#xff1f; 隐藏场景功能&#xff0c;指将选中的场景隐藏&#xff0c;浏览页将不显示隐藏的…

最详细,从0-1性能测试步骤详细,测试老鸟经验总结...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试流程 性…

sandfly-entropyscan:一款功能强大的恶意程序熵扫描工具

关于sandfly-entropyscan sandfly-entropyscan是一款功能强大的熵扫描工具&#xff0c;该工具可以用于检测与恶意软件相关的打包文件或加密二进制文件。除此之外&#xff0c;该工具还支持查找恶意文件和Linux进程相关的安全信息&#xff0c;并提供带有加密哈希的输出结果。 s…

cesium学习(下载,官方案例)

下载cesium源码 可以从官网直接下载&#xff0c;官网下载的是编译好的。链接: https://www.cesium.com/downloads/从github下载源码&#xff0c;方便我们本地调试学习(本文采用这种方式)。链接: https://github.com/CesiumGS/cesium 运行项目 安装依赖 npm i运行 npm run …

八股|ThreadLocal的内存泄露

ThreadLocal是个好用的工具类&#xff0c;但是使用不好是会导致内存泄露的。 内存泄露&#xff1a;之前开辟使用的内存空间&#xff0c;在使用完毕后未释放&#xff0c;结果导致一直占据该内存单元&#xff0c;无法被gc回收&#xff0c;导致该内存单元后续无法被使用&#xff0…

优思学院|质量管理六大思维陷阱【四】:抽样检查是最经济又能保证质量的方法吗?

在质量控制的过程中&#xff0c;一个常见的误解是认为抽样检查是最经济又能保证质量的方法。许多人认为进行百分之百的全数检查既浪费人力又时间不够。因此&#xff0c;他们倾向于采用抽样检查的方法&#xff0c;认为这样既符合经济成本&#xff0c;又能确保产品质量的水准。 …

Java中的死锁和Lock锁

6.死锁 1.死锁的理解&#xff1a; 不同的线程分别占用对方需要的同步资源不放弃&#xff0c;都在等待对方放弃自己需要的同步资源&#xff0c;就形成了线程的死锁 2.说明&#xff1a; 1出现死锁后&#xff0c;不会出现异常&#xff0c;不会出现提示&#xff0c;只是锁的线程…

【小白入门】Verilog实现异步FIFO

之前也在CSDN上面写过两个FIFO相关的文章&#xff0c;不过代码看起来比较复杂&#xff0c;且注释也比较少&#xff0c;不利于新手入门。很多时候都没有耐心继续看下去。 http://t.csdn.cn/0dPX6 http://t.csdn.cn/lYvoY 因为自己本身是一个初学者&#xff0c;就从初学者的视…