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

2023-11-07

之前的文章【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相关代码、论文、预训练模型、使用方法文档等
在这里插入图片描述

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • android studio 将已有的项目 以module Library的 形式引入到 自己的项目中

    1 什么是Module Library android 将项目 分成 project 和 Module module 其实也是一个项目 他里面也有 res java AndroidManifiest等文件 其实也是一个可以独立运行的项目 只
  • samba搭建(基于centos7)

    samba 基础 组管理 文件权限管理 基本命令 安装及配置 samba linux连接 samba 配置详解 global 配置特定目录共享 shell 自动创建用户 基础 SMB Server Message Block 服务器消息块
  • [转]video视频解码硬解和软解的区别及如何选择

    如果你认为本系列文章对你有所帮助 请大家有钱的捧个钱场 点击此处赞助 赞助额0 1元起步 多少随意 声明 本文只用于个人学习交流 若不慎造成侵权 请及时联系我 立即予以改正 锋影 email 174176320 qq com 硬解 字面上理
  • 百度引流推广怎么做?个人如何做百度推广

    个人如何做百度推广 相对于中小型企业 个人或者微商朋友在网络推广预算比较紧张 做网络营销推广的预算不会太多 因此 更需要在有限的推广费用预算 做出更好的推广效果 无疑 精准引流成为了个人做百度推广的首选 一 什么是百度推广 百度推广可以简单
  • 只出现一次的数字(异或运算^)

    给定一个非空整数数组 除了某个元素只出现一次以外 其余每个元素均出现两次 找出那个只出现了一次的元素 说明 你的算法应该具有线性时间复杂度 你可以不使用额外空间来实现吗 示例 1 输入 2 2 1 输出 1 示例 2 输入 4 1 2 1
  • 践行社会责任的路上,中概股们看到了怎样的风景?

    谈起社会责任 你会想到什么 绿色经济 双碳 目标 共同富裕 乡村振兴 慈善活动 ESG 环境 社会和公司治理 这些名词肯定少不了 当下 全球企业正越发强调社会责任 这或许是商业发展到一定阶段的必然结果 但也离不开公司们对社会事业的特别关注
  • PHP异常处理中的finally

    0x01 异常处理 在做代码分析的时候发现了一个有意思的点 样例代码如下 我们知道finally会在return之前执行 那么上
  • Packing(石板切割问题)回溯算法

    一 问题描述 给定一个最大的总切割目标石块 再给定一系列我们需要的样板石块 寻找切割方法使得我们从目标石块上切割出的所需样板石块的面积和最大 即对目标石块的利用率最高 限制切割为一刀切 即一次切割必须把一块石板一分为二 不能只切一段 左边为
  • 方差公式【数论】

    对于今天打的一道题 非常有感想 然后花了很久很久打了这个函数超多的方差公式 哎 来吧来吧 推导 首先我们知道方差的公式是 K i
  • 架构--网络关键指标公式

    架构 网络关键指标公式 一 经典公式1 估算系统的平均并发用户数和并发用户数峰值 1 1 公式 1 1 1 平均并发用户数 C nL T 参数说明 C 平均并发用户数 通过计算出来的 参数说明 n login session的数量 也就是
  • 告警与恢复告警原理及实现

    一 背景 自 双碳 政策提出以来 KaiwuDB 聚焦 数字能源 领域 为用户打造数字能源管理平台 旨在提升综合能源和碳资产管理能力 数字能源管理平台是以 KaiwuDB 为核心建设的云 边 端一体化数据服务平台 致力于为 IoT 工业互联
  • 多目标灰狼算法(MOGWO)的Matlab代码详细注释及难点解释(佳点集改进初始种群的MOGWO)

    目录 一 外部种群Archive机制 二 领导者选择机制 三 多目标灰狼算法运行步骤 四 MOGWO的Matlab部分代码详细注释 五 MOGWO算法难点解释 5 1 网格与膨胀因子 5 2 轮盘赌方法选择每个超立方体概率 为了将灰狼算法应
  • Ubuntu软件包升级失败的终极修复方法

    升级失败 apt upgrade y 尝试修复 apt autoremove Reading package lists Done Building dependency tree Reading state information Don
  • Centos7.6重置root密码

    启动Centos 7 虚拟机 三秒之内在这个系统boot引导界面迅速按e键进入boot编辑模式 如果没有在3秒内按写e 系统正常启动就不会进入到boot编辑模式了 找到以 linux16 开头的行 将从ro开始 ro不要删 往后到下一行前内
  • synchronized原理之前置知识

    一 Monitor概述 一 Java 对象头以 32 位虚拟机为例 一 普通对象 Object Header 64 bits Mark Word 32 bits Klass Word 32 bits 这个可以找到对象 二 数组对象
  • 构造一个简单的操作系统内核,详解进程切换细节

    1 基本功能介绍 如题 本文将介绍如何构造一个简单的操作系统内核 基于内核版本3 9 4 它有以下功能 1 进程的管理 2 进程的初始化 3 进程基于时间片的调度 2 实操步骤 1 安装qemu 以ubuntu为例 sudo apt get
  • jsp记住密码--Cookie

    jsp记住账号密码 本文介绍使用Cookie来实现记住账号密码操作 什么是Cookie Cookie是客户端访问服务器时 服务器在客户端硬盘上存放的信息 Cookie是服务器通知客户端保存键值对的一种技术 Cookie的用途 Cookie可
  • 百度智能云度能推出全新碳盘查服务,助力企业和园区摸清家底实现精细化管理

    今年1月 国务院发布 十四五 节能减排综合工作方案的通知 方案提出到2025年 全国单位国内生产总值能源消耗比2020年下降13 5 能源消费总量得到合理控制 百度也积极履行科技企业减碳责任 于2021年正式公布到2030年实现集团运营层面
  • 测开上手codewhisperer初体验

    AWS新出了一个插件 codewhisperer 这个名字一听还挺有意思 wispiser意为在耳边轻声细语的人 官方解释是一个强大的机器学习AI代码生成器 可以给你一些代码的建议 Amazon CodeWhisperer is a gen
  • 【CV大模型SAM(Segment-Anything)】如何一键分割图片中所有对象?并对不同分割对象进行保存?

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