当前位置: 首页 > news >正文

基于文本提示的图像目标检测与分割实践

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

在这里插入图片描述

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

1、SAM模型简介

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

在这里插入图片描述

上述架构允许对已编码的图像进行快速、轻松的提示。

SAM 设计用于处理各种提示,包括:

  • 掩模:可以提供粗略的、低分辨率的二进制掩模作为初始输入来指导模型。
    点:用户可以输入 [x, y] 坐标及其类型(前景或背景)来帮助定义对象边界。
  • Box:可以使用坐标 [x1, y1, x2, y2] 指定边界框,以告知模型有关对象的位置和大小。
  • 文本:文本提示还可用于提供附加上下文或指定感兴趣的对象。
    在这里插入图片描述

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

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

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

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

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

2、自然语言提示

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

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

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

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

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

3、lang-segment-anything

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

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

from  PIL  import  Image
from lang_sam import LangSAM
from lang_sam.utils import draw_imagemodel = 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、Lightning AI应用

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

import osimport gradio as gr
import lightning as L
import numpy as np
from lightning.app.components.serve import ServeGradio
from PIL import Imagefrom lang_sam import LangSAM
from lang_sam import SAM_MODELS
from lang_sam.utils import draw_image
from lang_sam.utils import load_imageclass 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 = Falseself.sam_type = sam_typedef 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 imagedef build_model(self, sam_type="vit_h"):model = LangSAM(sam_type)self.ready = Truereturn modelapp = L.LightningApp(LitGradio())

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

在这里插入图片描述

5、结束语

这就是我们对分段任意模型的介绍的总结。 显然,SAM 对于计算机视觉研究人员和开发人员来说是一个有价值的工具,它能够处理各种分割任务并适应不同的提示类型。 其架构允许轻松实施,使其具有足够的通用性,可以根据特定的用例和领域进行定制。 总体而言,SAM 已迅速成为机器学习社区的重要资产,并且肯定会继续在该领域掀起波澜。


原文链接:文本提示目标检测与分割 — BimAnt

相关文章:

基于文本提示的图像目标检测与分割实践

近年来,计算机视觉取得了显着的进步,特别是在图像分割和目标检测任务方面。 最近值得注意的突破之一是分段任意模型(SAM),这是一种多功能深度学习模型,旨在有效地从图像和输入提示中预测对象掩模。 通过利用…...

【4-5章】Spark编程基础(Python版)

课程资源:(林子雨)Spark编程基础(Python版)_哔哩哔哩_bilibili 第4章 RDD编程(21节) Spark生态系统: Spark Core:底层核心(RDD编程是针对这个)Spark SQL:…...

04 卷积神经网络搭建

一、数据集 MNIST数据集是从NIST的两个手写数字数据集:Special Database 3 和Special Database 1中分别取出部分图像,并经过一些图像处理后得到的[参考]。 MNIST数据集共有70000张图像,其中训练集60000张,测试集10000张。所有图…...

【hadoop运维】running beyond physical memory limits:正确配置yarn中的mapreduce内存

文章目录 一. 问题描述二. 问题分析与解决1. container内存监控1.1. 虚拟内存判断1.2. 物理内存判断 2. 正确配置mapReduce内存2.1. 配置map和reduce进程的物理内存:2.2. Map 和Reduce 进程的JVM 堆大小 3. 小结 一. 问题描述 在hadoop3.0.3集群上执行hive3.1.2的任…...

数据结构--6.5二叉排序树(插入,查找和删除)

目录 一、创建 二、插入 三、删除 二叉排序树(Binary Sort Tree)又称为二叉查找树,它或者是一棵空树,或者是具有下列性质的二叉树: ——若它的左子树不为空,则左子树上所有结点的值均小于它的根结构的值…...

无需公网IP,在家SSH远程连接公司内网服务器「cpolar内网穿透」

文章目录 1. Linux CentOS安装cpolar2. 创建TCP隧道3. 随机地址公网远程连接4. 固定TCP地址5. 使用固定公网TCP地址SSH远程 本次教程我们来实现如何在外公网环境下,SSH远程连接家里/公司的Linux CentOS服务器,无需公网IP,也不需要设置路由器。…...

Java工具类

一、org.apache.commons.io.IOUtils closeQuietly() toString() copy() toByteArray() write() toInputStream() readLines() copyLarge() lineIterator() readFully() 二、org.apache.commons.io.FileUtils deleteDirectory() readFileToString() de…...

makefile之使用函数wildcard和patsubst

Makefile之调用函数 调用makefile机制实现的一些函数 $(function arguments) : function是函数名,arguments是该函数的参数 参数和函数名用空格或Tab分隔,如果有多个参数,之间用逗号隔开. wildcard函数:让通配符在makefile文件中使用有效果 $(wildcard pattern) 输入只有一个参…...

算法通关村第十八关——排列问题

LeetCode46.给定一个没有重复数字的序列,返回其所有可能的全排列。例如: 输入:[1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 元素1在[1,2]中已经使…...

基于STM32设计的生理监测装置

一、项目功能要求 设计并制作一个生理监测装置,能够实时监测人体的心电图、呼吸和温度,并在LCD液晶显示屏上显示相关数据。 随着现代生活节奏的加快和环境的变化,人们对身体健康的关注程度越来越高。为了及时掌握自身的生理状况&#xff0c…...

Go-Python-Java-C-LeetCode高分解法-第五周合集

前言 本题解Go语言部分基于 LeetCode-Go 其他部分基于本人实践学习 个人题解GitHub连接:LeetCode-Go-Python-Java-C Go-Python-Java-C-LeetCode高分解法-第一周合集 Go-Python-Java-C-LeetCode高分解法-第二周合集 Go-Python-Java-C-LeetCode高分解法-第三周合集 G…...

【前端知识】前端加密算法(base64、md5、sha1、escape/unescape、AES/DES)

前端加密算法 一、base64加解密算法 简介:Base64算法使用64个字符(A-Z、a-z、0-9、、/)来表示二进制数据的64种可能性,将每3个字节的数据编码为4个可打印字符。如果字节数不是3的倍数,将会进行填充。 优点&#xff1…...

leetcode 925. 长按键入

2023.9.7 我的基本思路是两数组字符逐一对比,遇到不同的字符,判断一下typed与上一字符是否相同,不相同返回false,相同则继续对比。 最后要分别判断name和typed分别先遍历完时的情况。直接看代码: class Solution { p…...

[CMake教程] 循环

目录 一、foreach()二、while()三、break() 与 continue() 作为一个编程语言&#xff0c;CMake也少不了循环流程控制&#xff0c;他提供两种循环foreach() 和 while()。 一、foreach() 基本语法&#xff1a; foreach(<loop_var> <items>)<commands> endfo…...

Mojo安装使用初体验

一个声称比python块68000倍的语言 蹭个热度&#xff0c;安装试试 系统配置要求&#xff1a; 不支持Windows系统 配置要求: 系统&#xff1a;Ubuntu 20.04/22.04 LTSCPU&#xff1a;x86-64 CPU (with SSE4.2 or newer)内存&#xff1a;8 GiB memoryPython 3.8 - 3.10g or cla…...

艺术与AI:科技与艺术的完美融合

文章目录 艺术创作的新工具生成艺术艺术与数据 AI与互动艺术虚拟现实&#xff08;VR&#xff09;与增强现实&#xff08;AR&#xff09;机器学习与互动性 艺术与AI的伦理问题结语 &#x1f389;欢迎来到AIGC人工智能专栏~艺术与AI&#xff1a;科技与艺术的完美融合 ☆* o(≧▽≦…...

Android常用的工具“小插件”——Widget机制

Widget俗称“小插件”&#xff0c;是Android系统中一个很常用的工具。比如我们可以在Launcher中添加一个音乐播放器的Widget。 在Launcher上可以添加插件&#xff0c;那么是不是说只有Launcher才具备这个功能呢&#xff1f; Android系统并没有具体规定谁才能充当“Widget容器…...

探索在云原生环境中构建的大数据驱动的智能应用程序的成功案例,并分析它们的关键要素。

文章目录 1. Netflix - 个性化推荐引擎2. Uber - 实时数据分析和决策支持3. Airbnb - 价格预测和优化5. Google - 自然语言处理和搜索优化 &#x1f388;个人主页&#xff1a;程序员 小侯 &#x1f390;CSDN新晋作者 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 ✨收录专…...

jupyter 添加中文选项

文章目录 jupyter 添加中文选项1. 下载中文包2. 选择中文重新加载一下&#xff0c;页面就变成中文了 jupyter 添加中文选项 1. 下载中文包 pip install jupyterlab-language-pack-zh-CN2. 选择中文 重新加载一下&#xff0c;页面就变成中文了 这才是设置中文的正解&#xff…...

系列十、Java操作RocketMQ之批量消息

一、概述 RocketMQ可以一次性发送一组消息&#xff0c;那么这一组消息会被当做一个消息进行消费。 二、案例代码 2.1、pom 同系列五 2.2、RocketMQConstant 同系列五 2.3、BatchConsumer package org.star.batch.consumer;import cn.hutool.core.util.StrUtil; import lom…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...

Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解

文章目录 一、开启慢查询日志&#xff0c;定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...

文件上传漏洞防御全攻略

要全面防范文件上传漏洞&#xff0c;需构建多层防御体系&#xff0c;结合技术验证、存储隔离与权限控制&#xff1a; &#x1f512; 一、基础防护层 前端校验&#xff08;仅辅助&#xff09; 通过JavaScript限制文件后缀名&#xff08;白名单&#xff09;和大小&#xff0c;提…...