【CV大模型SAM(Segment-Anything)】如何保存分割后的对象mask?并提取mask对应的图片区域?

简介: 【CV大模型SAM(Segment-Anything)】如何保存分割后的对象mask?并提取mask对应的图片区域?

1.导入需要的库

#coding:utf-8
import numpy as np
import torch
import matplotlib.pyplot as plt
import cv2
import os
import copy

2. 定义相关绘图函数

def show_mask(mask, ax, random_color=False):
    if random_color:
        color = np.concatenate([np.random.random(3), np.array([0.6])], axis=0)
    else:
        color = np.array([30 / 255, 144 / 255, 255 / 255, 0.6])
    h, w = mask.shape[-2:]
    mask_image = mask.reshape(h, w, 1) * color.reshape(1, 1, -1)
    ax.imshow(mask_image)
def show_points(coords, labels, ax, marker_size=375):
    pos_points = coords[labels == 1]
    neg_points = coords[labels == 0]
    ax.scatter(pos_points[:, 0], pos_points[:, 1], color='green', marker='*', s=marker_size, edgecolor='white',
               linewidth=1.25)
    ax.scatter(neg_points[:, 0], neg_points[:, 1], color='red', marker='*', s=marker_size, edgecolor='white',
               linewidth=1.25)
def show_box(box, ax):
    x0, y0 = box[0], box[1]
    w, h = box[2] - box[0], box[3] - box[1]
    ax.add_patch(plt.Rectangle((x0, y0), w, h, edgecolor='green', facecolor=(0, 0, 0, 0), lw=2))

3. 加载图片与SAM模型

image = cv2.imread('notebooks/images/truck.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
import sys
sys.path.append("..")
from segment_anything import sam_model_registry, 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)
predictor = SamPredictor(sam)
predictor.set_image(image)

4.指定单个提示点,并显示该提示点

input_point = np.array([[500, 375]])
input_label = np.array([1])
plt.figure(figsize=(10,10))
plt.imshow(image)
show_points(input_point, input_label, plt.gca())
plt.axis('on')
plt.show()

5.使用SAM模型对上面的提示点进行目标分割

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()

6.保存分割结果的mask

由于我使用的是最小的一个SAM预训练模型:sam_vit_b_01ec64.pth,所以分割出来的结果没有那么完美。如果想得到更好的结果,可以使用较大的SAM预训练模型即可。

for i, (mask, score) in enumerate(zip(masks, scores)):
    mask = mask + 255
    plt.imshow(mask, cmap='gray')
    plt.savefig('pic-{}.png'.format(i + 1))
    plt.show()

7.提取并保存mask对应的图片区域

for i, (mask, score) in enumerate(zip(masks, scores)):
    mask = ~mask
    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()


相关文章
|
存储 数据采集 数据可视化
Open3d系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算
Open3d系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算
18132 1
Open3d系列 | 1. Open3d实现点云数据读写、点云配准、点云法向量计算
|
编解码 计算机视觉 异构计算
【CV大模型SAM(Segment-Anything)】如何一键分割图片中所有对象?并对不同分割对象进行保存?
【CV大模型SAM(Segment-Anything)】如何一键分割图片中所有对象?并对不同分割对象进行保存?
|
11月前
|
JSON API 数据格式
小红书商品列表API数据解析(附代码)
本内容介绍了小红书商品列表API的用途及调用方式,适用于电商分析与市场研究。接口支持HTTP GET请求,返回JSON格式商品信息,包含标题、价格、销量、商家名称等字段。文中提供了基于Python的完整请求示例,使用requests库实现,并包含请求头设置和参数传递方式,便于开发者快速集成与测试。
|
数据采集 编解码 缓存
通义万相,开源!
通义万相,开源!
|
自然语言处理 Python
【Prompt Engineering提示:Active-Prompt、方向性刺激提示、PAL(程序辅助语言模型)】
Diao等人(2023)提出了一种名为Active-Prompt的新方法,通过自适应提示来优化大型语言模型(LLMs)在特定任务中的表现。此方法通过不确定性评估选择需标注的问题,利用少量人工标注的思维链(CoT)示例逐步优化模型,提高其解决问题的能力。相比固定范例,Active-Prompt能够更有效地针对不同任务调整提示,从而提升模型性能。
915 7
【Prompt Engineering提示:Active-Prompt、方向性刺激提示、PAL(程序辅助语言模型)】
|
传感器 NoSQL 算法
ROS Moveit 配置全网最详细教程
本文是关于ROS Moveit配置的全网最详细教程,提供了一键安装脚本,以及如何使用Moveit进行机器人运动规划的详细步骤和说明。文中还深入解析了Moveit的配置包文件、Moveit的源码,以及如何使用不同的运动规划算法(如CHOMP、LERP、STOMP)进行路径规划。
3622 1
ROS Moveit 配置全网最详细教程
|
编解码 数据可视化 定位技术
60行代码就可以训练/微调 Segment Anything 2 (SAM 2)
本文演示了如何在仅60行代码内(不包括标注和导入)对SAM2进行微调。
1822 1
60行代码就可以训练/微调 Segment Anything 2 (SAM 2)
|
机器学习/深度学习
【元学习meta-learning】通俗易懂讲解元学习以及与监督学习的区别
本文通过通俗易懂的方式解释了元学习(Meta-learning)的概念及其与传统监督学习的区别,并通过实例说明了元学习是如何让模型具备快速学习新任务的能力。
4505 0
|
机器学习/深度学习 自然语言处理 算法
【CV大模型SAM(Segment-Anything)】真是太强大了,分割一切的SAM大模型使用方法:可通过不同的提示得到想要的分割目标
【CV大模型SAM(Segment-Anything)】真是太强大了,分割一切的SAM大模型使用方法:可通过不同的提示得到想要的分割目标