基于 Python 的 Meta AI —— SAM

Segment Anything Model(SAM)是 Facebook 的一个 AI 模型,旨在推广分割技术。在我们之前的文章中,我们讨论了 SAM 的一般信息,现在让我们深入了解其技术细节。SAM 模型的结构如下图所示,图像经过编码器得到其嵌入,并且任何掩码都可以被实现。提示可以以文本、边界框或自由形式的点的形式出现。我们对提示进行编码,并将其与图像嵌入一起传递给解码器,该解码器生成我们的掩码。

64088365f4e8aa8ca2ba05482cfeae92.png

SAM 最有趣的特性之一是其轻量级的编码器和解码器,可以实现实时性能。您可以使用在 GitHub 上可用的打包版本在 Python 中使用 SAM:https://github.com/kadirnar/segment-anything-video

954ed6b7ffca86a07eed47e4424f8a46.png

然而,如果您在使用过程中遇到问题,您可以使用原始 GitHub 页面上提供的 Colab 文件。以下是您可以开始使用的步骤:

using_colab = True 
if using_colab:
    import torch
    import torchvision
    print("PyTorch version:", torch.__version__)
    print("Torchvision version:", torchvision.__version__)
    print("CUDA is available:", torch.cuda.is_available())
    import sys
    !{sys.executable} -m pip install opencv-python matplotlib
    !{sys.executable} -m pip install 'git+https://github.com/facebookresearch/segment-anything.git'
    
    !wget https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth

首先,导入 Torch 和 Torchvision,这是项目所必需的,然后使用 pip 安装 Segment Anything。

从https://github.com/facebookresearch/segment-anything#model-checkpoints 下载模型检查点,稍后我们将使用它。

接下来,创建一个图像目录,您可以将测试图像放在其中。您还可以通过替换以下命令中的 URL 来使用自己的图像:

!mkdir images
!wget -O images/image.jpg https://live.staticflickr.com/65535/49894878561_14a39c6c35_b.jpg

一旦您拥有了图像,您可以导入必要的包,包括 numpy、Torch、Matplotlib 和 OpenCV。

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)
    polygons = []
    color = []
    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)))

现在,使用 OpenCV 读取图像并将通道从 BGR 更改为 RGB。然后,使用 Matplotlib 显示图像。

image = cv2.imread('images/image.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
plt.figure(figsize=(20,20))
plt.imshow(image)
plt.axis('off')
plt.show()

0bfa1e03ab85ad00fd90c565d6dee795.png

要创建您的掩码生成器,您需要定义您的 SAM 模型并使用 SamAutomaticMaskGenerator:

import sys
sys.path.append("..")
from segment_anything import sam_model_registry, SamAutomaticMaskGenerator, SamPredictor


sam_checkpoint = "sam_vit_h_4b8939.pth"
model_type = "vit_h"


device = "cuda"


sam = sam_model_registry[model_type](checkpoint=sam_checkpoint)
sam.to(device=device)


mask_generator = SamAutomaticMaskGenerator(sam)

我们的 SAM 模型注册表需要检查点和模型类型以提供模型,记得将您的运行时设置为 GPU。SamAutomaticMaskGenerator 使用您的模型来制作您的掩码生成器。您所需要做的就是将您的输入传递给这个函数以获取您的掩码。

masks = mask_generator.generate(image)

掩码对象包含关于区域和稳定性分数的多个信息,稍后会将标签添加到此掩码对象中。让我们来看一下输出:

plt.figure(figsize=(20,20))
plt.imshow(image)
show_anns(masks)
plt.axis('off')
plt.show()

02b44df256a8f85afa03b2afbd579f56.png

您还可以通过更改以下变量来调整遮罩生成器的参数:

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

91bb79317895261eb48fc46df499e6c6.png

不同参数的另一个输出

您可以在这里找到源代码:

https://colab.research.google.com/github/facebookresearch/segment-anything/blob/main/notebooks/automatic_mask_generator_example.ipynb

·  END  ·

HAPPY LIFE

540852cbe027f769b8c528589196fa46.png

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode-day4【88】【167】【125】【345】

文章目录 88. 合并两个有序数组题目解题思路解题思路【学习】尾插入法 167. 两数之和 II - 输入有序数组题目解题思路 125. 验证回文串题目解题思路 345. 反转字符串中的元音字母题目解题思路 88. 合并两个有序数组 题目 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums…

修改DaemonSet 的/args参数后多个pod重启的顺序

理论 当您修改了DaemonSet的/args参数时,DaemonSet控制器会自动触发Pod的滚动更新。滚动更新的过程是逐个将旧的Pod删除并创建新的Pod,以确保应用程序的高可用性和稳定性。 在进行滚动更新时,DaemonSet控制器会按照以下步骤逐个重启Pod&…

问卷中多选题如何分析?

一、案例与问卷 本研究选取大学生作为研究对象,旨在通过理财认知、理财现状、理财偏好三个方面,对大学生理财产品了解情况、使用需求进行调查。本次问卷共分为四个部分:第一部分共5道题,为基本信息题;第二部分共3道题…

【Linux高性能服务器编程】I/O复用的高级应用

文章目录 一、基于 select 的非阻塞 connect二、基于 poll 的聊天室程序2.1 客户端2.2 服务器 三、基于 epoll 实现同时处理 TCP 和 UDP 服务 一、基于 select 的非阻塞 connect connect系统调用的 man 手册中有如下一段内容: EINPROGERESS The socket is nonblock…

结构型模式-适配器模式

适配器模式 概述 如果去欧洲国家去旅游的话,他们的插座如下图最左边,是欧洲标准。而我们使用的插头如下图最右边的。因此我们的笔记本电脑,手机在当地不能直接充电。所以就需要一个插座转换器,转换器第1面插入当地的插座&#x…

【java笔记】java多线程

目录 一、概念 1.1 什么是进程? 1.2 什么是线程? 1.3 什么事多线程? 1.4 进程和线程的关系 二、线程对象的生命周期 三、实现线程有两种方式 3.1 继承 java.lang.Thread,重写 run方法 3.2 实现 java.lang.Runnable 接口…

图像描述算法排位赛:SceneXplain 与 MiniGPT4 谁将夺得桂冠?

如果你对图像描述算法的未来感到好奇,本场“图像描述算法排位赛”绝对是你不能错过的!在这场较量中,SceneXplain 和 MiniGPT-4 将会比试,谁将摘得这场比赛的桂冠? 背景介绍 在上篇文章中,我们介绍了图像描述…

【UE】倒计时归零时结束游戏

上一篇博客(【UE】一个简易的游戏计时器)完成了游戏时间每秒1的功能,本篇博客在此基础上完成倒计归零时结束游戏的功能 效果 步骤 1. 打开“ThirdPersonGameMode”,将剩余的秒数和分钟数的默认值分别设置为1和59 在事件图表中添…

Java设计模式-day02

4,创建型模式 4.2 工厂模式 4.2.1 概述 需求:设计一个咖啡店点餐系统。 设计一个咖啡类(Coffee),并定义其两个子类(美式咖啡【AmericanCoffee】和拿铁咖啡【LatteCoffee】);再设…

Linux: 进程间通信机制

文章目录 1. 前言2. 进程间通信机制2.1 管道2.1.1 匿名管道2.1.2 popen() 和 pclose()2.1.3 命名管道 FIFO 2.2 消息队列2.3 共享内存2.4 信号量2.5 网络套接字2.6 UNIX套接字2.7 信号 3. 参考资料 1. 前言 限于作者能力水平,本文可能存在谬误,因此而给…

Javaee Spring的AOP简介

一.Spring的AOP简介 1.1 什么是AOP AOP 为 Aspect Oriented Programming 的缩写,意思为面向切面编程,是通过预编译方式和运行期动态代 理实现程序功能的统一维护的一种技术。AOP 是 OOP 的延续,是软件开发中的一个热点,也是…

shell脚本控制

shell脚本编程系列 处理信号 Linux利用信号与系统中的进程进行通信,通过对脚本进行编程,使其在收到特定信号时执行某些命令,从而控制shell脚本的操作。 Linux信号 shell脚本编程会遇到的最常见的Linux系统信号如下表所示: 在默…

【获奖案例巡展】信创先锋之星——浙江省某市区视频能力中心

为表彰使用大数据、人工智能等基础软件为企业、行业或世界做出杰出贡献和巨大创新的标杆项目,星环科技自2021年推出了“新科技 星力量” 星环科技科技实践案例评选活动,旨在为各行业提供更多的优秀产品案例,彰显技术改变世界的力量&#xff0…

Cycling 74 Max for Mac:音乐可视化编程软件

Cycling 74 Max是一款音乐、视觉、互动艺术等领域中广泛使用的编程语言和应用软件,它允许用户创作和控制实时音频和视频效果、交互式应用程序和媒体艺术品等。 Max将程序设计和可视化编程相结合,通过简单的拖拽和连接方式,用户可以将各种功能…

基于springboot的大学生租房系统源码论文数据库

3.1系统功能 现在无论是在PC上还是在手机上,相信全国所有地方都在进行大学生租房管理。随着经济的不断发展,系统管理也在不断增多,大学生租房系统就是其中一种,很多人会登录到相关的租房系统查看租房信息,还能查看房屋…

微信小程序开发--利用和风天气API实现天气预报小程序

本来是参照《微信小程序开发实战》做一个天气预报小程序的,实际运行的时候提示错误,code 400,参数错误。说明问题应该出在查询API的语句上,没有返回结果。 查阅后才知道,可能书籍出版时间较早,现在的和风获…

类对象

一、类初识 类:表示一种事物所具有的共同特征和行为 对象:一个类的实例 如下图,通过狗这个类进行详解 这是一个Dog类 对象:斗牛犬、小猎犬、牧羊犬 类中的属性:breed(品种)、size(大小)、color(颜色)、age(年龄)、 …

安全常见基础名词概念

一、域名 1、域名:相当网站的名字,互联网上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位。 2、网域名系统(Domain Name System)有时也简称为域名(DNS),是互…

探索【Stable-Diffusion WEBUI】的插件:骨骼姿态(OpenPose)

文章目录 (零)前言(一)骨骼姿态(OpenPose)系列插件(二)插件:PoseX(三)插件:Depth Lib(四)插件:3D …

响应式开发(HTML5CSS3)实现媒体查询的功能案例

目录 前言 一、媒体查询知识点 二、实现功能的尺寸 三、代码部分 1.不带嵌套的媒体查询功能 1.1.代码段 1.2.运行结果 2.带嵌套的媒体查询功能 2.1.代码段 2.2.运行结果 2.2.3视频效果 前言 1.本文讲解的响应式开发技术(HTML5CSS3Bootstrap&#xff09…