用自然语言分割一切图像【lang-segment-anything】

news2024/12/23 15:36:12

近年来,计算机视觉取得了显着进步,特别是在图像分割和目标检测任务方面。 Segment Anything Model (SAM) 是最近的一项重大突破,这是一种多功能的深度学习模型,旨在有效地从图像和输入提示中预测对象掩码。 通过利用强大的编码器和解码器,SAM 能够处理范围广泛的分割任务,使其成为研究人员和开发人员等的宝贵工具。

在这里插入图片描述

推荐:用 NSDT设计器 快速搭建可编程3D场景

1、SAM简介

SAM 使用图像编码器(通常是视觉转换器 (ViT))来提取图像嵌入,作为掩码预测的基础。 该模型还包含一个提示编码器,它对各种类型的输入提示进行编码,例如点坐标、边界框和低分辨率掩码输入。 然后将这些编码的提示连同图像嵌入一起输入掩码解码器以生成最终的对象掩码。
在这里插入图片描述

上述架构允许在已经编码的图像上进行快速和轻便的提示。

SAM 旨在处理各种提示,包括:

  • Mask:可以提供一个粗糙的、低分辨率的二进制掩码作为初始输入来指导模型。
  • Point:用户可以输入 [x, y] 坐标及其类型(前景或背景)以帮助定义对象边界。
  • Box:可以使用坐标 [x1, y1, x2, y2] 指定边界框,以告知模型对象的位置和大小。
  • Text:文本提示也可用于提供额外的上下文或指定感兴趣的对象。

在这里插入图片描述

深入研究 SAM 的架构,我们可以探索其关键组件:

  • 图像编码器:SAM默认的图像编码器是ViT-H,但也可以根据具体要求使用ViT-L或ViT-B。
  • 下采样:为了降低提示二进制掩码的分辨率,采用了一系列卷积层。
  • 提示编码器:位置嵌入用于对各种输入提示进行编码,这有助于告知模型图像中对象的位置和上下文。
  • Mask 解码器:修改后的 transformer 编码器用作 mask 解码器,将编码的提示和图像嵌入转换为最终的对象掩码。
  • 有效掩码:对于任何给定的提示,SAM 都会生成三个最相关的掩码,为用户提供一系列可供选择的选项。

他们使用 focal、dice 和 IoU 损失的加权组合来训练模型。 权重分别为 20、1、1。

SAM 的优势在于它的适应性和灵活性,因为它可以使用不同的提示类型来生成准确的分割掩码。 与作为各种自然语言处理应用程序的强大基础的基础语言模型 (LLM) 非常相似,SAM 也为计算机视觉任务提供了坚实的基础。 该模型的架构旨在促进下游任务的轻松微调,使其能够针对特定用例或领域进行定制。 通过针对特定任务数据微调 SAM,开发人员可以增强其性能并确保其满足其应用程序的独特要求。

这种微调能力不仅让 SAM 在各种场景下都能获得令人印象深刻的性能,而且还促进了更高效的开发过程。 以预训练模型为起点,开发人员可以专注于针对他们的特定任务优化模型,而不是从头开始。 这种方法不仅节省了时间和资源,而且还利用了预训练模型中编码的广泛知识,从而使系统更加稳健和准确。

2、自然语言提示

文本提示与 SAM 的集成使模型能够执行高度特定和上下文感知的对象分割。 通过利用自然语言提示,可以引导 SAM 根据感兴趣的对象的语义特性、属性或与场景中其他对象的关系来分割感兴趣的对象。

在训练 SAM 的过程中,使用最大的公开可用的 CLIP 模型(ViT-L/14@336px)来计算文本和图像嵌入。 这些嵌入在用于训练过程之前被归一化。

为了生成训练提示,首先将每个掩码周围的边界框扩展一个范围为 1x 到 2x 的随机因子。 然后将展开的框裁剪成正方形以保持其纵横比并将大小调整为 336×336 像素。 在将作物送入 CLIP 图像编码器之前,掩膜外的像素以 50% 的概率被清零。 Masked attention 在编码器的最后一层使用,以确保嵌入集中在对象上,将输出 token 的注意力限制在 mask 内的图像位置。 输出标记嵌入作为最终提示。 在训练过程中,首先提供基于 CLIP 的提示,然后是迭代点提示以改进预测。

对于推理,未修改的 CLIP 文本编码器用于为 SAM 创建提示。 该模型依赖于 CLIP 实现的文本和图像嵌入的对齐,这使得在没有显式文本监督的情况下进行训练,同时仍然使用基于文本的提示进行推理。 这种方法允许 SAM 有效地利用自然语言提示来实现准确和上下文感知的分割结果。

不幸的是,Meta 还没有发布带有文本编码器的 SAM 的权重。

3、lang-segment-anything

lang-segment-anything 库结合了 GroundingDino 和 SAM 的优势,提供了一种创新的对象检测和分割方法。

最初,GroundingDino 执行零样本文本到边界框对象检测,根据自然语言描述有效地识别图像中感兴趣的对象。 然后将这些边界框用作 SAM 模型的输入提示,该模型会为已识别的对象生成精确的分割掩码。

from  PIL  import  Image
from lang_sam import LangSAM
from lang_sam.utils import draw_image

model = LangSAM()
image_pil = Image.open('./assets/car.jpeg').convert("RGB")
text_prompt = 'car, wheel'
masks, boxes, labels, logits = model.predict(image_pil, text_prompt)
image = draw_image(image_pil, masks, boxes, labels)

在这里插入图片描述

4、Lightening应用

你可以使用 Lightning AI App 框架快速部署应用程序。 我们将使用 ServeGradio 组件来部署带有 UI 的模型。 可以在此处了解有关 ServeGradio 的更多信息。

import os

import gradio as gr
import lightning as L
import numpy as np
from lightning.app.components.serve import ServeGradio
from PIL import Image

from lang_sam import LangSAM
from lang_sam import SAM_MODELS
from lang_sam.utils import draw_image
from lang_sam.utils import load_image

class LitGradio(ServeGradio):

    inputs = [
        gr.Dropdown(choices=list(SAM_MODELS.keys()), label="SAM model", value="vit_h"),
        gr.Slider(0, 1, value=0.3, label="Box threshold"),
        gr.Slider(0, 1, value=0.25, label="Text threshold"),
        gr.Image(type="filepath", label='Image'),
        gr.Textbox(lines=1, label="Text Prompt"),
    ]
    outputs = [gr.outputs.Image(type="pil", label="Output Image")]

    def __init__(self, sam_type="vit_h"):
        super().__init__()
        self.ready = False
        self.sam_type = sam_type

    def predict(self, sam_type, box_threshold, text_threshold, image_path, text_prompt):
        print("Predicting... ", sam_type, box_threshold, text_threshold, image_path, text_prompt)
        if sam_type != self.model.sam_type:
            self.model.build_sam(sam_type)
        image_pil = load_image(image_path)
        masks, boxes, phrases, logits = self.model.predict(image_pil, text_prompt, box_threshold, text_threshold)
        labels = [f"{phrase} {logit:.2f}" for phrase, logit in zip(phrases, logits)]
        image_array = np.asarray(image_pil)
        image = draw_image(image_array, masks, boxes, labels)
        image = Image.fromarray(np.uint8(image)).convert("RGB")
        return image

    def build_model(self, sam_type="vit_h"):
        model = LangSAM(sam_type)
        self.ready = True
        return model

app = L.LightningApp(LitGradio())

就这样,应用程序在浏览器中启动了!

在这里插入图片描述

5、结论

这就是我们对 Segment Anything Model 的介绍。 很明显,SAM 是计算机视觉研究人员和开发人员的宝贵工具,它能够处理各种分割任务并适应不同的提示类型。 它的架构易于实施,使其具有足够的通用性,可以针对特定的用例和领域进行定制。 总体而言,SAM 已迅速成为机器学习社区的重要资产,并且肯定会继续在该领域掀起波澜。


原文链接:用自然语言分割图像 — BimAnt

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

听说最近AI应用爆了?!来AI Studio玩转大模型应用

‍ 飞桨 AI Studio 是基于百度深度学习平台飞桨(PaddlePaddle)的人工智能学习与实训社区,支持一站式模型在线开发与应用。提供优质开源模型、丰富的开源内容、功能强大的在线编程环境、云端超强 GPU 算力及存储资源,帮助开发者们快…

Docker镜像更新通知器DIUN

什么是 DIUN ? Docker Image Update Notifier 是一个用 Go 编写的 CLI 应用程序,可作为单个可执行文件和 Docker 映像交付,用于当 Docker 映像在 Docker registry中更新时接收通知。 和老苏之前介绍过的 watchtower 不同,DIUN 只是通知&…

基于Grafana的WebUI添加Prometheus数据源(三)

基于Grafana的WebUI添加Prometheus数据源(三) 1、 Grafana 介绍 1.1 什么是Grafana Grafana是一款近几年比较流行的开源数据绘图工具平台。Grafana原生支持包括但不限于InfluxDB,MySQL,OpenTSDB,PostgreSQL和Prometheus等多种数据源作为输入源…

勤于奋讲解国外LEAD做任务前的准备

欢迎关注勤于奋 每天12点准时更新国外LEAD相关技术 今天跟大家分享一些做国外LEAD一些资源,就是做国外LEAD前IP的检查,有人不是很清楚,今天分享一些检查工具。 第一个当然是whoer,这个工具我用的最多,很早的时候就使…

深入了解CUDA编程模型:并行计算的强大工具

深入了解CUDA编程模型:并行计算的强大工具 本篇博客将详细介绍NVIDIA的CUDA编程模型,帮助您更好地理解并行计算的基本原理和技巧。CUDA是一种通用并行计算平台和编程模型,它允许开发者利用NVIDIA的GPU进行高性能计算。 CUDA已经成为GPU计算的…

躺平减重法,续篇,泸州富顺六斤胡吃海喝之行的减重数据变化

朋友们大都知道我最近先回了一趟北京,然后去四川泸州参加了腾讯云泸州老窖联合举办的传统企业数字化转型研讨会,会议结束后,又去了富顺县,在我同学的四星级酒店大吃大喝了四天,嗯,果然不负众望,…

设计一个像ESPN一样的实时视频流系统

功能需求 •直播事件与流之间的最大延迟不超过1分钟•系统应能够适应大量用户(异构交付)•系统应能将视频转换为不同的分辨率和编解码器•系统应具备容错性 视频转换和接收 由于我们正在实时直播整个事件,因此我们不能等待整个视频结束后再开…

分布式ID-Leaf

目录 一,背景二,ID生成方案1,UUID2,类snowflake方案3,号段模式4,基于Redis模式5,数据库自增ID 三,Leaf Segment1,拉取源码2,修改配置并创建号段表3&#xff0…

FM实现F4帮助系列三:弹出框多筛选条件的搜索帮助(根据搜索帮助筛选字段)...

函数:F4IF_GET_SHLP_DESCR F4IF_START_VALUE_REQUEST 效果图: 本例子代码: 找到需要的帮助: *& Report ZLM_TEST_045 REPORT zlm_test_045. TABLES makt. DATA: BEGIN OF str_f4, matnr TYPE matnr, maktx TYPE maktx, END OF str_f4.…

【JavaEE初阶】前端第四节.JavaScript入门学习笔记

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:Java测试开发 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!! 前言 一、…

反馈体系

(1)引子 我前段时间看了一个小短视频,有主持人问马斯克:你最害怕什么? 马斯克想了很久,回答:我最害怕反馈机制失灵。 马斯克说的不是特斯拉汽车的反馈机制失灵(虽然特斯拉汽车上装了…

Office Visio 2010安装

哈喽,大家好。今天一起学习的是Visio 2010的安装,这是一个绘制流程图的软件,用有效的绘图表达信息,比任何文字都更加形象和直观。Office Visio 是office软件系列中负责绘制流程图和示意图的软件,便于IT和商务人员就复杂…

Java程序设计入门教程-- if 条件语句

目录 单分支选择语句(if) 双分支选择语句(if…else) 嵌套if语句 单分支选择语句(if) 情形 当判断条件满足时,执行语句体S,而不满足则什么都不做。 格式 if (条件判断表…

Web3:实质、本质和棒喝

本文的名称可能让人困惑,实质和本质不一样吗?棒喝又是个什么。 什么是实质、本质和棒喝 如果不是很计较的话,“实质”和“本质”其实差不多。但在这篇文章里,略有区别。 “实质”是说一个东西原原本本是个什么东西。 “本质”是一…

刚刚,吴恩达 ChatGPT 新课三连发!

你有没有想过,你可以自己构建一个AI系统,或者开发一个使用大语言模型(LLM)的应用,甚至理解并创建扩散模型?我在吴恩达的三门新课程中找到了答案,这些课程让我看到了AI的无限可能性。 好消息&…

Neo4j图数据库介绍及简单入门

文章目录 Neo4j图数据库介绍Neo4j数据库安装可视化例子Neo4j增删改查增删改查 Neo4j图数据库介绍 电影里有这样的片段,警察抓捕凶手时,在墙上会画一个图: 这里也有一个demo可以让我们看到一个做好的图数据库: 这个demo也是用Neo4…

前端基础几大件

文章目录 HTMLCSSJavaScriptAjaxAxios(第三方库,专门用于请求数据)SpringBoot单例模式与前端异步请求 HTML 在HTML当中,一切都是节点Object:(非常重要) 整个Html文档就是一个DOM文档节点。所有…

26 strcpy 的调试

前言 同样是一个 很常用的 glibc 库函数 不管是 用户业务代码 还是 很多类库的代码, 基本上都会用到 字符串的复制 不过 我们这里是从 具体的实现 来看一下 它的实现 主要是使用 汇编 来进行实现的, 因此 理解需要一定的基础 测试用例 就是简单的使用了一下 strcpy, s…

推进印度制造受挫,苹果仍踢出13家中国企业,一条道走到黑?

苹果公布了2022年的供应商名单,让人惊讶的是苹果将13家中国供应商踢出了供应链,而美国、日本的供应商却有所增加,似乎苹果仍然在降低对中国制造的依赖,这对于苹果来说未必是好事。 一、苹果的印度制造计划受挫 数年前苹果推动印度…

深度学习在金融领域的十大应用算法【附Python代码】

引言 随着金融数据的不断增长和复杂化,传统的统计方法和机器学习技术面临着挑战。深度学习算法通过多层神经网络的构建,以及大规模数据的训练和优化,可以从数据中提取更加丰富、高级的特征表示,从而提供更准确、更稳定的预测和决策…