基于文本提示的图像目标检测与分割实践
近年来,计算机视觉取得了显着的进步,特别是在图像分割和目标检测任务方面。 最近值得注意的突破之一是分段任意模型(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液晶显示屏上显示相关数据。 随着现代生活节奏的加快和环境的变化,人们对身体健康的关注程度越来越高。为了及时掌握自身的生理状况,…...
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的倍数,将会进行填充。 优点࿱…...
leetcode 925. 长按键入
2023.9.7 我的基本思路是两数组字符逐一对比,遇到不同的字符,判断一下typed与上一字符是否相同,不相同返回false,相同则继续对比。 最后要分别判断name和typed分别先遍历完时的情况。直接看代码: class Solution { p…...
[CMake教程] 循环
目录 一、foreach()二、while()三、break() 与 continue() 作为一个编程语言,CMake也少不了循环流程控制,他提供两种循环foreach() 和 while()。 一、foreach() 基本语法: foreach(<loop_var> <items>)<commands> endfo…...
Mojo安装使用初体验
一个声称比python块68000倍的语言 蹭个热度,安装试试 系统配置要求: 不支持Windows系统 配置要求: 系统:Ubuntu 20.04/22.04 LTSCPU:x86-64 CPU (with SSE4.2 or newer)内存:8 GiB memoryPython 3.8 - 3.10g or cla…...
艺术与AI:科技与艺术的完美融合
文章目录 艺术创作的新工具生成艺术艺术与数据 AI与互动艺术虚拟现实(VR)与增强现实(AR)机器学习与互动性 艺术与AI的伦理问题结语 🎉欢迎来到AIGC人工智能专栏~艺术与AI:科技与艺术的完美融合 ☆* o(≧▽≦…...
Android常用的工具“小插件”——Widget机制
Widget俗称“小插件”,是Android系统中一个很常用的工具。比如我们可以在Launcher中添加一个音乐播放器的Widget。 在Launcher上可以添加插件,那么是不是说只有Launcher才具备这个功能呢? Android系统并没有具体规定谁才能充当“Widget容器…...
探索在云原生环境中构建的大数据驱动的智能应用程序的成功案例,并分析它们的关键要素。
文章目录 1. Netflix - 个性化推荐引擎2. Uber - 实时数据分析和决策支持3. Airbnb - 价格预测和优化5. Google - 自然语言处理和搜索优化 🎈个人主页:程序员 小侯 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏 ✨收录专…...
jupyter 添加中文选项
文章目录 jupyter 添加中文选项1. 下载中文包2. 选择中文重新加载一下,页面就变成中文了 jupyter 添加中文选项 1. 下载中文包 pip install jupyterlab-language-pack-zh-CN2. 选择中文 重新加载一下,页面就变成中文了 这才是设置中文的正解ÿ…...
系列十、Java操作RocketMQ之批量消息
一、概述 RocketMQ可以一次性发送一组消息,那么这一组消息会被当做一个消息进行消费。 二、案例代码 2.1、pom 同系列五 2.2、RocketMQConstant 同系列五 2.3、BatchConsumer package org.star.batch.consumer;import cn.hutool.core.util.StrUtil; import lom…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
