YOLOv8 + SAM实现自动标注分割数据集【附完整源码+步骤详解】

《博主简介》

小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。
更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~
👍感谢小伙伴们点赞、关注!

《------往期经典推荐------》

一、AI应用软件开发实战专栏【链接】

项目名称项目名称
1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】
3.【手势识别系统开发】4.【人脸面部活体检测系统开发】
5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】
7.【YOLOv8多目标识别与自动标注软件开发】8.【基于YOLOv8深度学习的行人跌倒检测系统】
9.【基于YOLOv8深度学习的PCB板缺陷检测系统】10.【基于YOLOv8深度学习的生活垃圾分类目标检测系统】
11.【基于YOLOv8深度学习的安全帽目标检测系统】12.【基于YOLOv8深度学习的120种犬类检测与识别系统】
13.【基于YOLOv8深度学习的路面坑洞检测系统】14.【基于YOLOv8深度学习的火焰烟雾检测系统】
15.【基于YOLOv8深度学习的钢材表面缺陷检测系统】16.【基于YOLOv8深度学习的舰船目标分类检测系统】
17.【基于YOLOv8深度学习的西红柿成熟度检测系统】18.【基于YOLOv8深度学习的血细胞检测与计数系统】
19.【基于YOLOv8深度学习的吸烟/抽烟行为检测系统】20.【基于YOLOv8深度学习的水稻害虫检测与识别系统】
21.【基于YOLOv8深度学习的高精度车辆行人检测与计数系统】22.【基于YOLOv8深度学习的路面标志线检测与识别系统】
23.【基于YOLOv8深度学习的智能小麦害虫检测识别系统】24.【基于YOLOv8深度学习的智能玉米害虫检测识别系统】
25.【基于YOLOv8深度学习的200种鸟类智能检测与识别系统】26.【基于YOLOv8深度学习的45种交通标志智能检测与识别系统】
27.【基于YOLOv8深度学习的人脸面部表情识别系统】28.【基于YOLOv8深度学习的苹果叶片病害智能诊断系统】
29.【基于YOLOv8深度学习的智能肺炎诊断系统】30.【基于YOLOv8深度学习的葡萄簇目标检测系统】
31.【基于YOLOv8深度学习的100种中草药智能识别系统】32.【基于YOLOv8深度学习的102种花卉智能识别系统】
33.【基于YOLOv8深度学习的100种蝴蝶智能识别系统】34.【基于YOLOv8深度学习的水稻叶片病害智能诊断系统】
35.【基于YOLOv8与ByteTrack的车辆行人多目标检测与追踪系统】36.【基于YOLOv8深度学习的智能草莓病害检测与分割系统】
37.【基于YOLOv8深度学习的复杂场景下船舶目标检测系统】38.【基于YOLOv8深度学习的农作物幼苗与杂草检测系统】
39.【基于YOLOv8深度学习的智能道路裂缝检测与分析系统】40.【基于YOLOv8深度学习的葡萄病害智能诊断与防治系统】
41.【基于YOLOv8深度学习的遥感地理空间物体检测系统】42.【基于YOLOv8深度学习的无人机视角地面物体检测系统】
43.【基于YOLOv8深度学习的木薯病害智能诊断与防治系统】44.【基于YOLOv8深度学习的野外火焰烟雾检测系统】
45.【基于YOLOv8深度学习的脑肿瘤智能检测系统】46.【基于YOLOv8深度学习的玉米叶片病害智能诊断与防治系统】
47.【基于YOLOv8深度学习的橙子病害智能诊断与防治系统】48.【车辆检测追踪与流量计数系统】
49.【行人检测追踪与双向流量计数系统】50.【基于YOLOv8深度学习的反光衣检测与预警系统】
51.【危险区域人员闯入检测与报警系统】52.【高压输电线绝缘子缺陷智能检测系统】

二、机器学习实战专栏【链接】,已更新31期,欢迎关注,持续更新中~~
三、深度学习【Pytorch】专栏【链接】
四、【Stable Diffusion绘画系列】专栏【链接】
五、YOLOv8改进专栏【链接】持续更新中~~
六、YOLO性能对比专栏【链接】,持续更新中~

《------正文------》

引言

本文主要介绍一个使用YOLOv8 + MobileSAM自动生成结构化分割数据标注的方法。这个脚本是一个完整的从图像检测到分割再到生成标注文件的工作流,利用YOLOv8进行快速物体检测,再借助SAM模型实现高精度的分割,并自动化生成结构化的标注数据,非常适合于大规模图像数据的分割数据集标注

实现步骤

下面是详细的实现步骤。

导入所需库和模块

from pathlib import Path
from ultralytics import SAM, YOLO
import torch

pathlib.Path:用于处理文件和目录路径的库。
ultralytics.YOLOultralytics.SAM:分别用于加载YOLOv8对象检测模型和Segment Anything Model (SAM)语义分割模型。
torch:PyTorch深度学习框架。

定义变量

# 定义图像数据路径
img_data_path = 'ultralytics/assets'
# 定义检测模型和SAM模型的路径
det_model="yolov8n.pt"
sam_model="MyModels/mobile_sam.pt"
# 根据CUDA是否可用选择设备
device = '0' if torch.cuda.is_available() else 'cpu'
# 定义输出目录,默认为None
# 输出路径
output_dir = None

img_data_path需要进行自动分割标注的图像数据路径
det_modelsam_model:分别为YOLO检测模型和SAM分割模型的文件路径。
device:根据系统中是否可用CUDA(NVIDIA GPU加速),选择运行模型的设备(GPU或CPU)。

模型初始化

# 初始化检测模型和SAM模型
det_model = YOLO(det_model)
sam_model = SAM(sam_model)

使用给定路径加载YOLOv8检测模型SAM分割模型到内存中,准备进行图像处理。
这里使用的是yolov8n.pt目标检测和mobile_sam.pt分割一切模型,如果对于精度要求更高的,可以使用yolov8x.pt或者sam_b.pt等更大的模型。

图像检测

# 对图像数据进行检测
det_results = det_model(data, stream=True, device=device)

使用YOLO模型对img_data_path路径下的所有图像进行物体检测,stream=True允许逐个处理图像,减少内存占用;device=device指定计算设备。

结果处理与分割

# 遍历检测结果
for result in det_results:
    # 获取类别ID
    class_ids = result.boxes.cls.int().tolist()  # noqa
    # 如果有检测到物体
    if len(class_ids):
        # 获取检测框坐标
        boxes = result.boxes.xyxy  # Boxes object for bbox outputs
        # 使用SAM模型进行分割
        sam_results = sam_model(result.orig_img, bboxes=boxes, verbose=False, save=False, device=device)

遍历检测结果:对于每个检测到物体的图像,提取其类别ID和边界框坐标。
应用SAM模型:对每个检测到的物体使用SAM模型进行精细化分割,获取更精确的分割掩码。

生成标注文件

# 获取分割结果
        segments = sam_results[0].masks.xyn  # noqa
        # 为每个图像生成标注文件
        with open(f"{Path(output_dir) / Path(result.path).stem}.txt", "w") as f:
            # 遍历每个分割区域
            for i in range(len(segments)):
                s = segments[i]
                # 如果分割区域为空,则跳过
                if len(s) == 0:
                    continue
                # 将分割区域坐标转换为字符串格式
                segment = map(str, segments[i].reshape(-1).tolist())
                # 写入标注信息
                f.write(f"{class_ids[i]} " + " ".join(segment) + "\n")

对于每张图像及其检测到的每个物体,创建一个文本文件用于存储标注信息。
文件命名规则为原图像文件名加上.txt后缀,存储于之前创建的output_dir目录下。

标注格式:每行代表一个物体的标注信息,包括类别ID后跟分割区域的坐标点序列,坐标点以空格分隔。

生成的标注文件为YOLO分割数据格式,如下图:
在这里插入图片描述
分割图片结果如下所示:
在这里插入图片描述

完整源码

from pathlib import Path
from ultralytics import SAM, YOLO
import torch

# 定义图像数据路径
img_data_path = 'ultralytics/assets'

# 定义检测模型和SAM模型的路径
det_model="yolov8n.pt"
sam_model="MyModels/mobile_sam.pt"

# 根据CUDA是否可用选择设备
device = '0' if torch.cuda.is_available() else 'cpu'

# 定义输出目录,默认为None
# 输出路径
output_dir = None

# 初始化检测模型和SAM模型
det_model = YOLO(det_model)
sam_model = SAM(sam_model)

# 获取图像数据路径
data = Path(img_data_path)

# 如果输出目录未定义,则生成默认的输出目录
if not output_dir:
    output_dir = data.parent / f"{data.stem}_auto_annotate_labels"
    # 创建输出目录
    Path(output_dir).mkdir(exist_ok=True, parents=True)

# 对图像数据进行检测
det_results = det_model(data, stream=True, device=device)

# 遍历检测结果
for result in det_results:
    # 获取类别ID
    class_ids = result.boxes.cls.int().tolist()  # noqa
    # 如果有检测到物体
    if len(class_ids):
        # 获取检测框坐标
        boxes = result.boxes.xyxy  # Boxes object for bbox outputs
        # 使用SAM模型进行分割
        sam_results = sam_model(result.orig_img, bboxes=boxes, verbose=False, save=False, device=device)
        # 获取分割结果
        segments = sam_results[0].masks.xyn  # noqa
        # 为每个图像生成标注文件
        with open(f"{Path(output_dir) / Path(result.path).stem}.txt", "w") as f:
            # 遍历每个分割区域
            for i in range(len(segments)):
                s = segments[i]
                # 如果分割区域为空,则跳过
                if len(s) == 0:
                    continue
                # 将分割区域坐标转换为字符串格式
                segment = map(str, segments[i].reshape(-1).tolist())
                # 写入标注信息
                f.write(f"{class_ids[i]} " + " ".join(segment) + "\n")

好了,这篇文章就介绍到这里,感谢点赞关注,更多精彩内容持续更新中~

关注文末名片G-Z-H:【阿旭算法与机器学习】,可获取更多干货学习资源

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

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

相关文章

【C++11】常见的c++11新特性(一)

文章目录 1. C11 简介2. 常见的c11特性3.统一的列表初始化3.1initializer_list 4. decltype与auto4.1decltype与auto的区别 5.nullptr6.右值引用和移动语义6.1左值和右值6.1.1左值的特点6.1.2右值的特点6.1.3右值的进一步分类 6.2左值引用和右值引用以及区别6.2.1左值引用6.2.2…

YOLOv5目标检测——基于YOLOv5的吊车安全监测

移动式起重机是建筑施工中使用的重要设备。 遵守正确的操作程序对于防止事故很重要。 然而,其中存在人为错误的因素。 这里我将举一个例子来说明计算机视觉(CV)如何帮助解决这个问题。 1、移动式起重机操作的安全问题 为简单起见&#xff0…

躬行践履始玉成,行而不辍终致远 | 中创算力季度优秀员工表彰大会

蓬勃发展,根基在人。在中创发展的道路上,有初心不改的领导者、有披星戴月的业务标杆、也有默默坚守的员工,他们扎根中创,用努力、拼搏、坚持,在中创的历程上镌刻下 属于自己的一份印记! 为了表彰优秀&…

【吉林大学Java程序设计】第9章:并发控制

第9章:并发控制 1.线程的基本概念2.线程的创建与启动3.线程的调度与优先级线程的状态线程的生命周期线程控制的基本方法线程优先级 4.线程的协作多线程存在的问题同步区域(临界区)生产者与消费者问题(互斥与同步问题)哲…

618必抢清单:内存升级国货更强,DDR5劲爆大白菜

随着数字时代的加速发展,平时在PC上玩游戏、办公的时候,电脑性能对我们的影响越来越打。相比于CPU、显卡等硬件,内存对于电脑性能的重要性也很高,而且可以通过更低的成本来升级。内存就像是电脑的神经网络,影响着CPU数…

【机器学习300问】119、什么是语言模型?

语言模型(Language Models)是自然语言处理(NLP)的重要组成部分,它的目的是量化一段文本或一个序列的概率。简单讲就是你给语言模型一个句子,它给你计算出特定语言中这个句子出现的概率。这样的概率度量可以…

Node-red win11安装

文章目录 前言一、安装node.js和npm二、安装Node-red三、 运行Node-red 前言 Node-RED 是一种编程工具,用于以新颖有趣的方式将硬件设备、API 和在线服务连接在一起。 它提供了一个基于浏览器的编辑器,只需单击一下即可将调色板中的各种节点轻松连接在…

麒麟移动运行环境(KMRE)——国内首个开源的商用移固融合“Android生态兼容环境”正式开源

近日,由麒麟软件研发的KMRE(Kylin Mobile Runtime Environment,麒麟移动运行环境)在openKylin(开放麒麟)社区正式发布,为Linux桌面操作系统产品提供了高效的Android运行环境解决方案。这也是国内…

2024年【电工(高级)】考试内容及电工(高级)考试试题

题库来源:安全生产模拟考试一点通公众号小程序 电工(高级)考试内容考前必练!安全生产模拟考试一点通每个月更新电工(高级)考试试题题目及答案!多做几遍,其实通过电工(高…

Codesys 编程实现随机数字+仿照rand()原理+代码下载

目录 一、C语言中rand()随机数的演示及问题 二、同样的原理,在Codesys中实现随机数 三、codesys在线仿真验证功能 四、代码下载 一、C语言中rand()随机数的演示及问题 (1)只用rand(…

降噪领夹麦克风哪个牌子好?揭秘无线领夹麦克风哪个降噪好

相信很多新手视频创作者都有一个疑问:为什么别人的视频或者直播音质这么清晰,几乎没什么噪音呢?其实最主要的就是麦克风的原因,相机或手机内置的麦克风是无法提供高质量的音频记录以及很好的指向性的。 想要拍摄出来的视频作品拥有…

亚马逊跟卖ERP系统,怎样提升新手卖家选品的质量与效率!

今天给新手卖家推荐一款实用ERP系统,相信新手卖家在碰到最难的问题应该就是选品了吧,那我们该如何快速解决我们找品难找品慢的问题呢,现在有一套专门为跟卖打造的一款全功能erp系统,从我们选品上传,到我们采购&#xf…

XSS学习(绕过)

学习平台&#xff1a;xss.tesla-space.com XSS学习&#xff08;绕过&#xff09; level1level2level4level5level6level7level8level9level10level11level12 level1 应该没有过滤 https://xss.tesla-space.com/level1.php?name<script>alert(1);</script> leve…

修改以太网卡mac地址

原生以太网卡与PCIe以太网卡 以Intel 原生以太网卡与PCIe以太网卡为例&#xff1a; Intel原生以太网卡和PCIe以太网卡在系统中实现网络连接时&#xff0c;涉及到与系统总线&#xff08;如PCIe总线&#xff09;的连接方式和性能差异。 Intel 原生以太网卡 定义&#xff1a;所…

大模型应用开发技术:Multi-Agent框架流程、源码及案例实战(一)

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

celery使用 Zookeeper 或 kafka 作为broker,使用 mysql 作为 backend

背景介绍: 先贴上celery官方文档:Celery - Distributed Task Queue — Celery 5.4.0 documentation xxx项目中单点环境运行celery + redis,使用流畅,不做过多介绍。 切换高可用环境时,客户redis使用的是cluster集群,官方文档中并没有对redis cluster的支持,查看githu…

视频合成渲染服务解决方案,数字人+PPT+视频云剪辑

在金融理财领域&#xff0c;一个生动、直观、专业的视频&#xff0c;往往能够在海量信息中脱颖而出&#xff0c;帮助客户更好地理解产品、把握市场动态。然而&#xff0c;传统的视频制作方式往往周期长、成本高、难以适应快速变化的市场需求。 美摄科技&#xff0c;作为行业领…

eclipse maven打包报错: 致命错误: 在类路径或引导类路径中找不到程序包 java.lang的解决

还是上来帖张图&#xff1a; 1、系统之前是运行在mac上的&#xff0c;打包一切正常&#xff0c;但是现在在win11的eclipse打包就报错了。 2、致命错误: 在类路径或引导类路径中找不到程序包 java.lang&#xff0c;上面的问题应该是找不到java中的jar中的class导致。 解决&…

python安装目录文件说明----Dlls文件夹

在Python的安装目录下&#xff0c;通常会有一个DLLs文件夹&#xff0c;它是Python标准库的一部分。这个文件夹包含了一些动态链接库&#xff08;Dynamic Link Libraries&#xff0c;DLL&#xff09;&#xff0c;这些库提供了Python解释器和标准库的一些关键功能。以下是对这个文…

JAVA面试(六)

缓存 MemcachedredisRedis常见数据类型和使用Redis缓存持久化RDB-快照AOF-追加文件 Redis数据过期机制惰性删除定期删除 Redis缓存淘汰策略&#xff08;8种&#xff09;算法LRU &#xff08;Least Recently Used&#xff09;&#xff1a;最近最少使用LFU&#xff08;Least Freq…