使用segment-anything将目标检测label转换为语义分割label

使用segment-anything将目标检测label转换为语义分割label

  • 一、segment-anything简介
  • 二、segment-anything安装
    • 2.1安装方法
    • 2.2预训练模型下载
  • 三、将目标检测label转换为语义分割label
    • 3.1示例代码
    • 3.2代码说明

一、segment-anything简介

segment-anything是facebookresearch团队开发的一套无须训练,根据提示对图像自动分割的工具,提示可以是一个点,也可以是一个矩形框。根据主页介绍,它是使用1100万图片和1.1亿mask训练而成,在各类图片分割中都有很强的性能。

研究团队还在此基础上开发出了Segment-Anything-Model 2,简称SAM2,SAM2不仅可以对图像进行分割,还可以对视频进行分割。

segment-anything项目Github地址为:https://github.com/facebookresearch/segment-anything,
在线演示地址为:https://segment-anything.com/demo,可以在该网站上传一张本地图片,进行试验:
在这里插入图片描述

SAM2项目Github地址为:https://github.com/facebookresearch/sam2。

二、segment-anything安装

2.1安装方法

segment-anything要求环境:python>=3.8pytorch>=1.7,torchvision>=0.8。
安装方法有两种,一种为使用pip命令安装,安装命令如下:

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

一种为下载项目源代码进行本地安装,如下:

git clone git@github.com:facebookresearch/segment-anything.git
cd segment-anything; pip install -e .

2.2预训练模型下载

使用segment-anything需要下载对应的预训练模型,按照参数量从小到大分为:vit_b、vit_l、vit_h,大小分别为:360M、1.2G,2.5G。
三种模型对显卡显存的要求也依次增高,根据实际测试,8G显存的显卡可以加载运行vit_b和vit_l,无法加载vit_h模型。

模型下载官方地址如下:
vit_b:https://dl.fbaipublicfiles.com/segment_anything/sam_vit_b_01ec64.pth
vit_l:https://dl.fbaipublicfiles.com/segment_anything/sam_vit_l_0b3195.pth
vit_h:https://dl.fbaipublicfiles.com/segment_anything/sam_vit_h_4b8939.pth。

CSDN免费下载地址如下:
vit_b:https://download.csdn.net/download/weixin_46846685/91510193
vit_l:https://download.csdn.net/download/weixin_46846685/91510428,https://download.csdn.net/download/weixin_46846685/91510431(CSDN上传文件限制,分为两部分)
vit_h:https://download.csdn.net/download/weixin_46846685/91510458,https://download.csdn.net/download/weixin_46846685/91553916,https://download.csdn.net/download/weixin_46846685/91553931(CSDN上传文件限制,分为三部分)

三、将目标检测label转换为语义分割label

目标检测任务中的label为目标的矩形框坐标,而语义分割任务中的label为目标的轮廓。如果需要将目标检测任务转换为语义分割任务,那么就需要对图片进行重新标注。

这一过程需要耗费大量时间精力,所以本文给出了使用segment-anything进行自动化转换的代码,用于提高工作效率,但需要注意的是,实际分割效果需要根据场景进行测试评估,检查效果是否满足预期

3.1示例代码

以YOLO的标签格式为例,展示如何根据目标检测的box坐标,将目标轮廓从图片中分割出来生成对应的mask
代码如下:

import torch
import numpy as np
import cv2
from segment_anything import sam_model_registry, SamPredictor, SamAutomaticMaskGenerator
from PIL import Image
import os
import sysdevice = "cuda" if torch.cuda.is_available() else "cpu"
sam_checkpoint = "sam_vit_l_0b3195.pth"
model_type = "vit_l"sam = sam_model_registry[model_type](checkpoint=sam_checkpoint)
sam.to(device)imagepath = 'image.jpg'
labelpath = 'label.txt'
combine = np.zeros([256, 256])
if os.path.getsize(labelpath) > 0:with open(labelpath, 'r') as f:labels=f.readlines()boxes = []for labeldata in labels:parts = labeldata.strip().split()x_center, y_center, w, h = (float(parts[1]), float(parts[2]), float(parts[3]), float(parts[4]))gtx1 = int((x_center - w / 2) * 256)gty1 = int((y_center - h / 2) * 256)gtx2 = int((x_center + w / 2) * 256)gty2 = int((y_center + h / 2) * 256)boxes.append([gtx1, gty1, gtx2, gty2])image = cv2.imread(imagepath)image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)predictor = SamPredictor(sam)predictor.set_image(image)for box in boxes:masks, scores, logits = predictor.predict(point_coords=None,point_labels=None,box=np.array(box),multimask_output=True,)mask = masks[scores[0].argmax()]combine[np.where(mask==1)]=1mask_output_path = 'mask.png'
mask_img = Image.fromarray(combine.astype(np.uint8))
mask_img.save(mask_output_path)

3.2代码说明

代码整体逻辑为:

  1. 首先判断label文件是否为空,如果为空说明图片不包含目标,则生成一个全0的mask
  2. 如果不为空,则读取label的box信息,以box为提示,调用segment-anything对图片进行分割,上述代码假设目标只有1类,所以将目标区域填充为1,此处可根据需要进行修改;
  3. 最后生成的mask,背景区域灰度值为0,目标区域灰度值为1,所以直接打开mask图片无法看到分割出的目标,如需可视化需要另做一些简单的图像处理

调用segment-anything的注意事项:

  1. segment-anything不支持直接输入box的列表,所以上述代码做了一个循环,循环输入box;
  2. predictor.predict_torch方法据说可以接受多个box,但是经过实际测试,发现分割出的目标位置有所偏离,目前不知是什么原因。

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

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

相关文章

【unitrix数间混合计算】3.3 无符号整数标记trait(bin_unsigned.rs)

一、源码 这段代码是用 Rust 语言实现的一个类型级无符号二进制整数系统,通过类型系统在编译时表示和操作二进制数字。这是一种典型的"类型级编程"(type-level programming)技术。 use crate::number::{U0, Bin, Bit, BinInt};/// …

Python基本语法总结

1.类(Class)在Python中类(Class)是面向对象编程(OOP)的核心概念。1.1.类的基本定义最简单的类class Cat:"""这是一个最简单的类"""pass #创建实例 obj Cat()包含方法的类cl…

数据结构05(Java)-- ( 归并排序实质,归并排序扩展问题:小和问题)

前言 本文为本小白🤯学习数据结构的笔记,将以算法题为导向,向大家更清晰的介绍数据结构相关知识(算法题都出自🙌B站马士兵教育——左老师的课程,讲的很好,对于想入门刷题的人很有帮助&#x1f4…

税务专业人员能力构建与发展路径指南

CDA数据分析师证书含金量高,适应了未来数字化经济和AI发展趋势,难度不高,行业认可度高,对于找工作很有帮助。一、税务专业人员的核心能力框架能力维度关键技能要素专业工具与方法论实践输出成果税务法规应用税种政策解读、法规更新…

Linux中rsync使用与inotify实时同步配置指南

Linux中rsync使用与inotify实时同步配置指南 一、rsync 简介 rsync(Remote Sync)是 Linux 系统下的一款高效数据镜像和备份工具,用于在本地或远程同步文件和目录。 支持本地复制、基于 SSH 的远程同步,以及使用自有 rsync 协议的同…

Unicode 字符串转 UTF-8 编码算法剖析

📊 Unicode 字符串转 UTF-8 编码算法剖析 ——从 C# char 到 C wchar_t 的编码转换原理 引用:UTF-8 编解码可视化分析 🔍 1. 算法功能概述 该函数将 Unicode 字符串(C# string)转换为 UTF-8 编码的字节数组&#xf…

php的安全性到底怎么样

PHP作为一种流行的服务器端脚本语言,被广泛应用于Web开发。然而,由于PHP是一种较为灵活的语言,其安全性议题一直备受争议。在这篇文章中,我将从多个方面来讨论PHP的安全性,包括常见的安全漏洞、防范措施以及最佳实践。…

mapbox高阶,结合threejs(threebox)添加建筑glb模型,添加阴影效果,设置阴影颜色和透明度

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言 1.1 ☘️mapboxgl.Map 地图对象 1.2 ☘️mapboxgl.Map style属性 1.3 ☘️threebox loadObj加载模型 二、🍀…

SSM从入门到实战:1.6 Spring数据访问与JDBC模板

👋 大家好,我是 阿问学长!专注于分享优质开源项目解析、毕业设计项目指导支持、幼小初高的教辅资料推荐等,欢迎关注交流!🚀 06-Spring数据访问与JDBC模板 📖 本文概述 本文是SSM框架系列Spri…

下一代IT服务管理:ITIL5会是什么样?

ITIL4发布到现在也就5年多时间,按照以往的更新节奏,ITIL5最早也得2027年之后。但现在IT发展的速度,跟以前完全不是一个量级。AI都快把我们的饭碗抢了(开个玩笑),ITIL要是还按部就班,估计真要被时…

最新研究进展:2023-2025年神经机器翻译突破性成果

文章目录 一、模型架构创新 1.1 混合架构的崛起 1.2 多模态翻译的突破 1.3 大语言模型与NMT的深度融合(2023-2024) 1.4 非自回归翻译(NAT)的效率革命(2024) 二、数据与训练策略优化 2.1 低资源语言翻译的飞跃 2.2 动态数据增强技术 三、效率与部署 3.1 模型压缩与加速 3.…

OpenTelemetry WebSocket 监控终极方案:打通最后一公里

概述 OpenTelemetry,以下简称 OTEL,是由 CNCF 托管的“一站式可观测性标准”,把指标、链路、日志三大信号统一为单一 SDK/API,零侵入地采集从浏览器、移动端到后端、容器、云服务的全栈遥测数据,并支持 40 后端一键导…

VS Code 出现的 Web 视图加载错误和服务工作者注册失败问题解决方案

针对 VS Code 或 Cursor (vscode系)中出现的 Web 视图加载错误和服务工作者注册失败问题,以下是永久性解决方案的完整操作指南:解决方案步骤打开命令面板 使用快捷键 CtrlShiftP(Windows/Linux)或 CmdShift…

【qml-4】qml与c++交互(类型多例)

背景: 【qml-1】qml与c交互第一次尝试(实例注入) 【qml-2】尝试一个有模式的qml弹窗 【qml-3】qml与c交互第二次尝试(类型注册) 【qml-4】qml与c交互(类型多例) 【qml-5】qml与c交互&#…

图数据库如何构筑 Web3 风控防线 聚焦批量注册与链上盗转 悦数图数据库

随着 Web3 生态的不断演进,链上风险呈现出团伙化、隐蔽化和动态化的趋势,传统的单点风控手段已难以应对复杂多变的攻击模式。尤其在批量注册薅羊毛与链上交易盗转洗钱等高频风险场景中,攻击者往往通过伪造身份、跨链操作、多层嵌套转账等方式…

恒流源电路学习

恒流源的设计原理: 如图所示你可以看到右边的的推到公式得到红点处的电压是一个和左边相关的定值,所以呢右边的电流就是电压除以那个4Ω,所以得到右边的电路的电流大体是一个定值,不管你再加什么东西都可以保持这个电流&#xff…

基于生成对抗网络的模糊图像恢复原理与技术实现

1. 引言图像模糊是数字图像处理中的常见问题,其成因包括相机抖动、物体运动、聚焦不良等。传统方法如维纳滤波、Lucy-Richardson 算法等依赖于模糊核估计和逆滤波,在复杂场景下性能有限。生成对抗网络(Generative Adversarial Networks, GAN&…

【Doris 系列】Doris IP 变更修复

FE 恢复 异常日志 查看 fe.out 会有以下报错,此时 fe 进程是无法启动的,操作前注意备份所有 fe 的元数据并停止上游读写动作! java.io.IOException: the self host 192.168.31.78 does not equal to the host in ROLE file 192.168.31.81. Yo…

安卓14系统应用收不到开机广播

安卓14系统应用收不到开机广播 - Wesley’s Blog 前段时间有测试反馈在安卓14 上面某系统应用恢复出厂设置后没有自启动,究竟是什么原因呢? 回顾 Android 从3.1开始,会将新安装并且从未被启动的应用置为“STOPPED”状态,或者被…

C# Attribute 方法扩展

场景 刚写完一个干净利落的方法,比如保存数据到数据库,逻辑清晰、结构优雅, 第二天,“嘿,保存完数据,记得给客户发个邮件哦~” 第三天,“能不能再发个消息通知其他系统?” 第四天&am…