图像分割-Segment Anything实践

一、模型介绍

        Segment Anything 模型是一种新的图像分割模型,它可以在不需要大量标注数据的情况下,对图像中的任何物体进行分割。这种方法可以帮助计算机视觉领域的研究人员和开发人员更轻松地训练模型,从而提高计算机视觉应用程序的性能。该模型使用“自监督学习”的方法,在不需要大量标注数据的情况下训练模型。该模型使用了一个名为“Contrastive Predictive Coding (CPC)”的算法,可以从未标记的图像中学习到有用的特征,并将这些特征用于图像分割任务。

Segment Anything模型可以用于许多应用场景如:

  • 自动驾驶汽车:自动驾驶汽车需要能够识别道路、车辆和行人等物体,并对它们进行分割。使用Segment Anything模型可以更准确地进行物体分割,从而提高自动驾驶汽车的性能。

  • 医学图像分析:医学图像通常包含许多不同类型的组织和器官。使用Segment Anything模型可以更准确地对这些组织和器官进行分割,从而帮助医生更好地诊断疾病。

  • 视频监控:视频监控系统需要能够识别和跟踪不同的对象,并对它们进行分割。使用Segment Anything模型可以更准确地进行对象分割,从而提高视频监控系统的性能。

与传统图像分割方法相比,Segment Anything模型的优势和不同之处主要有以下几点:

  • 不需要大量标注数据就可以训练模型:传统的图像分割方法需要大量标注数据才能训练模型;

  • 可以对任何物体进行分割:传统的图像分割方法通常只能对特定类型的物体进行分割;

  • 更准确:与传统的图像分割方法相比,Segment Anything模型可以更准确地对图像中的物体进行分割;

  • 更快速:由于Segment Anything模型不需要大量标注数据,因此可以更快地训练模型。

二、使用方法

        Segment Anything可以一键分割和屏蔽任何照片或视频中的任何对象,包括训练期间没有看到的对象和图像类型。同时还发布了配套的数据集,比现有的数据集大400倍。它从输入提示中产生高质量的物体遮罩,用来为图像中的所有物体产生遮罩。它已经在一个由1100万张图像和11亿个遮罩组成的数据集上进行了训练,并在各种分割任务中具有强大的性能。

        使用Segment Anything模型进行图像分割,可用Facebook的Segment Anything库。该库是一个PyTorch库,提供了许多预训练模型,包括Segment Anything模型。使用这些预训练模型来进行图像分割,并将其集成到应用程序中。

Facebook官方示例

segment-anything在线demo体验

SAM数据集地址

SAM-paper

三、代码实践

       Segment Anything Model (SAM) 预测对象mask,给出所需识别出对象的提示输入。模型首先将图像转换为图像嵌入,然后解码器根据用户输入的提示生成高质量的掩模。

SamPredictor类为模型调用提供了一个简单的接口,用于提示模型的输入。它先让用户使用“set_image”方法设置图像,该方法会将图像输入转换到特征空间嵌入。然后,可以通过“predict”方法输入提示信息,以根据这些提示有效地预测掩码。predict函数支持将点和框提示以及上一次预测迭代中的mask作为输入。

#加载SAM模型
import sys
sys.path.append("..")
from segment_anything import sam_model_registry, SamPredictor# 模型在官方示例链接中下载,有三个模型,任意使用一个
sam_checkpoint = "sam_vit_b_01ec64.pth"model_type = "vit_b"device = "cuda"sam = sam_model_registry[model_type](checkpoint=sam_checkpoint)
sam.to(device=device)predictor = SamPredictor(sam)#处理图像以生成图像嵌入特征向量,将其用于后续掩码预测
predictor.set_image(image)

 1.单点输入预测mask

单点以(x, y)格式输入到模型中,并带有标签1(前景点)或0(背景点)。可以输入多个点。所选的点将在图像上显示为星形。SAM输出3个掩码,其中“scores”给出了模型对这些掩码质量的估计。该模型返回掩码(masks)、掩码的分数(scores)以及可传递到下一次预测迭代的低分辨率掩码(logits),选择在“分数”中返回的分数最高的一个来选择最佳的mask.

input_point = np.array([[250, 187]])
input_label = np.array([1])masks, scores, logits = predictor.predict(point_coords=input_point,point_labels=input_label,multimask_output=True,
)print(masks.shape)  # (number_of_masks) x H x W  | output (3, 600, 900)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.多点输入预测mask

        多点以(x, y)形式输入,并带有标签1(前景点)或0(背景点)。所选的点将在图像上显示为星形。使用多个提示指定单个对象时,可以通过设置“multimask_output=False”来请求获取单个mask。

#(2)多点输入生成mask
input_point = np.array([[250, 284], [362, 422]])
input_label = np.array([1, 1])mask_input = logits[np.argmax(scores), :, :]  # Choose the model's best maskmasks, _, _ = predictor.predict(point_coords=input_point,point_labels=input_label,mask_input=mask_input[None, :, :],multimask_output=False,
)
print(masks.shape) #output: (1, 600, 900)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.输入box预测mask

        segment anything支持将xyxy格式的box作为输入,将框内的主体目标识别出来(类似于实例分割)

input_box = np.array([70, 140, 500, 610])
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()

模型输出:

 

4.自动预测生成mask

import numpy as np
import torch
import matplotlib.pyplot as plt
import cv2
import sys
sys.path.append("..")
from segment_anything import sam_model_registry, SamAutomaticMaskGenerator, SamPredictordef 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)image = cv2.imread('dog11.jpg')
image = cv2.resize(image,None,fx=0.5,fy=0.5)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)sam_checkpoint = "sam_vit_b_01ec64.pth"
model_type = "vit_b"device = "cuda"sam = sam_model_registry[model_type](checkpoint=sam_checkpoint)
sam.to(device=device)
#自动生成采样点对图像进行分割
mask_generator = SamAutomaticMaskGenerator(sam)masks = mask_generator.generate(image)print(len(masks))
print(masks[0].keys())
print(masks[0])plt.figure(figsize=(16,16))
plt.imshow(image)
show_anns(masks)
plt.axis('off')
plt.show() 

模型输出:

 OK,最近工作中涉及到一些图像分割方面的应用,对于视觉大模型来说,Meta的Segment Anything肯定要实践一下的,Segment Anything可以用于多种场景下的图像分割,也可以涉及多种方式,可以针对自己的应用场景加以限制,欢迎大家一起交流~

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

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

相关文章

线段树基本原理和操作

线段树的一些基本操作和原理: 由二分的思想而来,一段区间划分,实现大量数据的查询删除O(log(n)) 线段树(英语:Segment tree)是一种二叉树形数据结构,1977年由Jon Louis Bentley发明&#xff0…

【网络安全---XSS漏洞(1)】XSS漏洞原理,产生原因,以及XSS漏洞的分类。附带案例和payload让你快速学习XSS漏洞

以pikachu靶场为例子进行讲解,pikachu靶场的搭建请参考以下博客; 【网路安全 --- pikachu靶场安装】超详细的pikachu靶场安装教程(提供靶场代码及工具)_网络安全_Aini的博客-CSDN博客【网路安全 --- pikachu靶场安装】超详细的pi…

设计模式——Decorator(装饰器模式)

Decorator(装饰器模式) 目的: 动态地给一个对象添加一些额外的职责。 适用性: 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。 简单解释 当有一个已经完成的系统,其中类和对象的关系的错综复杂的&#x…

【【萌新的SOC学习之小水文系列】】

萌新的SOC学习之小水文系列 SD卡读写TXT文本实验 SD 卡共有 9 个引脚线,可工作在 SDIO 模式或者 SPI 模式。在 SDIO 模式下,共用到 CLK、CMD、DAT[3:0]六根信号线;在 SPI 模式下,共用到 CS(SDIO_DAT[3])、…

leetcode:2427. 公因子的数目(python3解法)

难度:简单 给你两个正整数 a 和 b ,返回 a 和 b 的 公 因子的数目。 如果 x 可以同时整除 a 和 b ,则认为 x 是 a 和 b 的一个 公因子 。 示例 1: 输入:a 12, b 6 输出:4 解释:12 和 6 的公因…

016 Spring Boot + Vue 图书管理系统

Spring Boot Vue 图书馆管理系统(library-system) 本地快捷预览项目 第一步:运行 db 文件夹下的springboot-vue.sql(询问作者获取),创建springboot-vue数据库 第二步:修改后端数据库配置文件,启动后端 …

OpenCV防抖实践及代码解析笔记

视频防抖是指用于减少摄像机运动对最终视频的影响的一系列方法。摄像机的运动可以是平移(比如沿着x、y、z方向上的运动)或旋转(偏航、俯仰、翻滚)。 正如你在上面的图片中看到的,在欧几里得运动模型中,图像…

opencv图像的直方图,二维直方图,直方图均衡化

文章目录 opencv图像的直方图,二维直方图,直方图均衡化一、图像的直方图1、什么是图像的直方图:2、直方图的作用:3、如何绘制图像的直方图:(1)cv::calcHist()函数原型:英文单词 calc…

【C/C++】结构体内存分配问题

规则1:以多少个字节为单位开辟内存 就是说,该结构体最终所占字节大小,是这个单位的整数倍 给结构体变量分配内存的时候,会去结构体变量中找基本类型的成员 哪个基本类型的成员占字节数多,就以它大大小为单位开辟内存 …

【刷题】只出现一次的数字(三种解法)

【刷题】只出现一次的数字 文章目录 【刷题】只出现一次的数字解法异或运算解法一 : 异或运算解法二:集合类Set集合Map集合 链接: https://www.nowcoder.com/share/jump/2008263481696810321082 https://leetcode.cn/problems/single-number/description/ 题目描述 给定一个整…

[PyTorch][chapter 57][WGAN-GP 代码实现]

前言: 下图为WGAN 的效果图: 绿色为真实数据的分布: 8个高斯分布 红色: 为随机产生的数据分布,跟真实分布基本一致 WGAN-GP: 1 判别器D: 最后一层去掉sigmoid 2 生成器G 和判别器D: loss不取log 3 损失函数…

讲讲项目里的仪表盘编辑器(四)分页卡和布局容器组件

讲讲两个经典布局组件的实现 ① 布局容器组件 配置面板是给用户配置布局容器背景颜色等属性。这里我们不需要关注 定义文件 规定了组件类的类型、标签、图标、默认布局属性、主文件等等。 // index.js import Container from ./container.vue; class ContainerControl extends…

java:代理模式

概念代理模式 概念: 真实对象:被代理的对象,背景的联想总部代理对象:也就是那个西安联想代理商代理模式:代理对象代理真实对象,达到增强真实对象功能的目的 实现方式: 静态代理:有一…

边缘计算网关

一、项目整体框架图 二、项目整体描述 边缘计算网关项目主要实现了智能家居场景和工业物联网场景下设备的数据采集和控制。 整个项目分为三大层:用户接口层、网关层、设备层。 其中用户层通过QT客户端、WEB界面及阿里云提供数据展示和用户接口。 网关使用虚拟机代替…

ArcGIS Engine:实现Shp/Mxd数据的加载、图层的简单查询

本博客参考&#xff1a;BiliBili UP主 <羊羊旸> &#xff1a; Arcgis Engine学习 目录 01 加载控件以及控件的基本信息等调整 02 编写 <菜单-地图控件> 中各个子工具的代码 2.1 加载Shapefile数据-代码 2.2 加载地图文档数据-代码 2.3 获取图层数量-代码 2.…

如何从零开始系统的学习项目管理?

一、项目的概念 根据项目管理协会&#xff08;PMI&#xff09;的定义&#xff0c;项目是指为了创造独特的产品、服务或成果而进行的临时性工作。这意味着项目需要有明确的目标&#xff0c;且不是日常重复性工作。尽管项目是临时性工作&#xff0c;但它所交付的成果可能会持续存…

汽车冲压车间的RFID技术设计解决方案

一、RFID技术的基本原理 RFID技术是一种利用非接触式自动识别的技术&#xff0c;通过将RFID标签放置在被识别物品上&#xff0c;并使用RFID读写器对标签进行扫描和识别&#xff0c;实现对物品的自动识别和追踪。RFID标签分为被动式和主动式两种。被动式标签无内置电源&#xf…

解决远程git服务器路径改变导致本地无法push的问题

解决远程git服务器路径改变导致本地无法push的问题 &#xff08;1&#xff09;第一步&#xff1a;查看git配置 git config -l&#xff08;2&#xff09;第二步&#xff1a;删除远程git地址 git remote remove origin&#xff08;3&#xff09;第三步&#xff1a;再次查看git配…

Vue3 + Ts实现NPM插件 - 定制loading

目录 你的 Loading&#x1f916; 安装&#x1f6f9; 简介苍白请 您移步文档&#xff1a;✈️ 使用方法&#x1f6e0;️ 配置 loading 类型&#x1f3b2; 定制 loading 色彩 &#x1f4a1; 注意事项 前期回顾 你的 Loading 开箱即可用的 loading&#xff0c; 说明&#xff1a;vu…

Java练习题-用冒泡排序法实现数组排序

✅作者简介&#xff1a;CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1&#x1f3c6; &#x1f4c3;个人主页&#xff1a;hacker707的csdn博客 &#x1f525;系列专栏&#xff1a;Java练习题 &#x1f4ac;个人格言&#xff1a;不断的翻越一座又…