首页 > 编程语言 >【Python&语义分割】Segment Anything(SAM)模型介绍&安装教程

【Python&语义分割】Segment Anything(SAM)模型介绍&安装教程

时间:2023-10-10 11:56:14浏览次数:56  
标签:plt Anything SAM show Python image Segment 模型

1 Segment Anything介绍

1.1 概况

        Meta AI 公司的 Segment Anything 模型是一项革命性的技术,该模型能够根据文本指令或图像识别,实现对任意物体的识别和分割。这一模型的推出,将极大地推动计算机视觉领域的发展,并使得图像分割技术进一步普及化。

        论文地址:https://arxiv.org/abs/2304.02643

        项目地址:Segment Anything

1.2 核心优势

         Segment Anything 模型的核心优势在于其强大的泛化能力和广泛的适用性。该模型不仅可以接受来自其他系统的输入提示,例如根据 AR / VR 头显传来的用户视觉焦点信息来选择对应的物体,而且还能从科学图像分析、照片编辑等各类场景中识别出万物。同时,Meta AI 还发布了 Segment Anything 1-Billion(SA-1B)掩码数据集,这是计算机视觉领域有史以来体量最大的分割数据集。这个数据集的推出,使得 Segment Anything 模型能够支持更为广泛的应用场景,并助力计算机视觉基础模型的进一步研究。

1.3 使用方法

        具体使用方法上,Segment Anything 提供了简单易用的接口,用户只需要通过提示,即可进行物体识别和分割操作。例如在图片处理中,用户可以通过 Hover & Click 或 Box 等方式来选取物体。值得一提的是,SAM 还支持通过上传自己的图片进行物体分割操作,提取物体用时仅需数秒。

        总的来说,Meta AI 的 Segment Anything 模型为我们提供了一种全新的物体识别和分割方式,其强大的泛化能力和广泛的应用前景将极大地推动计算机视觉领域的发展。未来,我们期待看到更多基于 Segment Anything 的创新应用,以及在科学图像分析、照片编辑等领域的广泛应用。

2 安装教程

2.1 Web端使用

        Segment Anything的官网提供了Demo可以在Web端直接对他的数据集或者自己上传的图片进行分割。我这里就不过多演示了,官网的英文很简单,应该都可以看懂,下面是效果图。

2.2 本地端使用(Python)

        该代码要求使用 python>=3.8,并且需要安装 pytorch>=1.7 和torchvision>=0.8。按照以下说明安装 PyTorch 和 TorchVision 的依赖项。建议同时安装支持 CUDA 的 PyTorch 和 TorchVision。项目地址:Segment Anything

2.2.1 git安装

pip install git+https://github.com/facebookresearch/segment-anything.git

        该项目依赖opencv-python pycocotools matplotlib onnxruntime onnx torch等包。

pip install opencv-python pycocotools matplotlib onnxruntime onnx torch

2.2.2 本地安装

        个人认为本地安装是最简单的,我之前已经下载好了项目源码,大家直接在命令行里使用pip install 安装zip文件即可,链接中还包含了三个模型。由于我之前做目标识别时就已经安装了Pytorch所以这里就没有介绍Pytorch怎么安装,后续更新相关安装教程。

C:\Users\JY03>cd /d G:\Neat Download Manager\Compressed

G:\Neat Download Manager\Compressed>pip install segment-anything-main.zip

3 使用教程

3.1 官方demo教程

        下载好官方的项目源码后,在notebooks文件夹中有三个demo文件,大家可以自己阅读观看,不过是.ipynb文件啊需要Jupyter打开,Pycharm打不开这种文件。

3.2 单点分割示例代码

        我这里给大家提供一下最简单的单点分割代码,大家可以做做实验,后续会详细更新其使用教程的。代码中只需要修改图片路径和模型路径即可。模型大家可以在上面的2.2.2小节中下载。

# -*- coding: utf-8 -*-
"""
@Time : 2023/10/10 11:10
@Auth : RS迷途小书童
@File :SAM.py
@IDE :PyCharm
"""
import numpy as np
import torch
import matplotlib.pyplot as plt
import cv2
import sys
from segment_anything import sam_model_registry, SamPredictor


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


image = cv2.imread(r'G:\Neat Download Manager\Compressed\segment-anything-main\notebooks\images/truck.jpg')
# 图片地址
image = cv2.resize(image, None, fx=0.5, fy=0.5)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
plt.figure(figsize=(10, 10))
plt.imshow(image)
plt.axis('on')
plt.show()
sys.path.append("..")
sam_checkpoint = "G:/Neat Download Manager/Misc/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)
input_point = np.array([[250, 187]])
# 输入兴趣点
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()
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()

4 总结

        不得不说,国外程序员的创造力是真的牛,这些算法不仅功能强大最重要的是源码还是开源的,我们任重而道远啊。总的来说,Segment Anything这个模型还是很不错的,图片的分割效果非常好,真的可以做到分割万物。同时其前景也非常可观,我看现在已经有人使用SAM这个模型做了二开实现了样本的自动化标注,这对于我们在标记深度学习样本时有很大的帮助,还有很多领域都可以和SAM相契合,大家感兴趣可以自己去了解。

标签:plt,Anything,SAM,show,Python,image,Segment,模型
From: https://www.cnblogs.com/RSran/p/17754306.html

相关文章

  • python高级思路写法
    一、处理多个条件语句all()方法对于all()的一般例子如下:size="lg"color="blue"price=50#badpracticeifsize=="lg"andcolor=="blue"andprice<100:print("Yes,Iwanttobuttheproduct.")更好的处理方法如下:#goo......
  • python实现同时给多个变量赋值的方法 Simultaneous Assignments
    SimultaneousAssignmentsx,y=y,x这个赋值的执行流程是什么?python的多元赋值原理是tuple的元组封装(tuplepacking)和序列拆封(sequenceunpacking)。t=12345,54321,'hello!'这是元组封装(tuplepacking)的例子,将多个值放进tuple里。x,y,z=t元组封装(tuplepacking)的......
  • Python 学习资源
    ThePythonTutorial(Python3.6.X)的中文翻译版本。PythonTutorial为初学Python必备官方教程,本教程适用于Python3.6.X。http://www.pythondoc.com/pythontutorial3/index.html  Python自带的chm文件安装Python之后,安装目录里面有一个doc文件夹,其中有个chm文件:  The......
  • Python 中的round函数
    在python2.7的doc中,round()的最后写着,"Values are rounded to the closest multiple of 10 to the power minus ndigits; if two multiples are equally close, rounding is done away from 0." 保留值将保留到离上一位更近的一端(四舍六入),如果距离两端一......
  • Python文件类型
    1.文件分类   源代码:文件以py为扩展名,由python程序解释,不需要编译;   *.pyc,py源文件编译成的二进制字节码文件,依然由python加载执行,不过速度会提高,也会隐藏源码;   *.pyo,优化编译后的程序,也是二进制文件,适用于嵌入式系统。2pyc和pyo文件生成   生成pyc文件:   ......
  • python 折行 代码换行
    非常长的字符串换行 ##三个双引号line="""thisisaveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylongstring"""line##三个单引号longstring1='''thisisalonglonglonglonglonglonglong......
  • 《流畅的Python》高清高质量电子书PDF+源代码
    下载:https://pan.quark.cn/s/02b9697a37d0......
  • 标量衍射计算不完全指南(python 实现)
    标量衍射计算不完全指南(python实现)Introduction本文的目的总结一些标量衍射的计算方法,并讨论讨论他们的适用条件。代码和例子在:https://github.com/zhemglee/Scalardiffraction需要的预备知识:涉及的数理知识并不高深,主要是线性系统和傅里叶变换(离散傅里叶变换)的基础知识,当然还......
  • python多线程
    importdatetimeimportthreadingfromtimeimportsleep#创建一个信号量,限制最多同时运行2个线程semaphore=threading.Semaphore(2)#创建一个线程锁threadLock=threading.Lock()defworker(i):withsemaphore:current_datetime=datetime.datet......
  • python接口自动化之request请求,如何使用 Python调用 API?
    Python实战|如何使用Python调用API一、HTTP 请求HTTP 请求是在 HTTP 协议下的一种数据格式,用于向服务器发送请求,其通常由请求行、请求头和请求体三部分构成,请求头和请求体之间用空行隔开,其中各部分包含的信息如下:请求行 (Request Line):包括请求方法 (GET请求、POST请......