【深度学习Labelme】使用Segment Anything Model (SAM)快速打标,labelme多边形转yolo txt框看看对不对

文章目录

  • windows安装环境
  • 打开labelme
  • 自动保存勾选上,保存图片数据不要勾选
  • 选SAM精准模型,然后打开图片路径,然后点击创建AI多边形:
  • 鼠标点击确认物体控制点,确认完成后,双击鼠标完成选取,并给上标签。
  • 这样就有对应json了:
  • json转为yolotxt
  • 验证对不对看图

windows安装环境


# py310
# torch>=1.7
# torchvision>=0.8
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
pip install  appdirs
pip install  opencv-python-headless
pip install git+https://github.com/facebookresearch/segment-anything.gitpip install  labelme

打开labelme

在这里插入图片描述

自动保存勾选上,保存图片数据不要勾选

在这里插入图片描述

或者修改C:\Users\Administrator.labelmerc的默认配置为:

auto_save: true
display_label_popup: true
store_data: false
keep_prev: false
keep_prev_scale: false
keep_prev_brightness: false
keep_prev_contrast: false
logger_level: info

选SAM精准模型,然后打开图片路径,然后点击创建AI多边形:

在这里插入图片描述

鼠标点击确认物体控制点,确认完成后,双击鼠标完成选取,并给上标签。

在这里插入图片描述

这样就有对应json了:

在这里插入图片描述

json转为yolotxt

执行这个代码,输入是json文件夹路径、yolo txt保存路径,输出就是将json转为yolotxt:

import os
import jsondef convert_to_yolo(json_path, dst_path, label_dict):# 打开JSON文件with open(json_path, 'r') as f:data = json.load(f)# 获取图片的宽度和高度img_width = data['imageWidth']img_height = data['imageHeight']# 打开目标txt文件dst_file_path = os.path.join(dst_path, os.path.splitext(os.path.basename(json_path))[0] + '.txt')with open(dst_file_path, 'w') as dst_file:# 遍历多边形标记for shape in data['shapes']:label = shape['label']# 如果标签是新的,为其分配一个新的yolo标签数字if label not in label_dict:label_dict[label] = len(label_dict)# 获取yolo标签数字yolo_label = label_dict[label]# 获取多边形的点坐标points = shape['points']# 断言是多边形"shape_type": "polygon",assert shape['shape_type'] == 'polygon'# 计算多边形的矩形包裹框x_min = min(point[0] for point in points)y_min = min(point[1] for point in points)x_max = max(point[0] for point in points)y_max = max(point[1] for point in points)# 计算矩形中心点的归一化坐标x_center = (x_min + x_max) / (2 * img_width)y_center = (y_min + y_max) / (2 * img_height)width = (x_max - x_min) / img_widthheight = (y_max - y_min) / img_height# round 6x_center = round(x_center, 6)y_center = round(y_center, 6)width = round(width, 6)height = round(height, 6)# 将数据写入到txt文件中dst_file.write(f"{yolo_label} {x_center} {y_center} {width} {height}\n")def convert_folder_to_yolo(src_folder, dst_folder):# 如果想自己自定义标签数字,可以修改为label_dict= {'person': 0, 'car': 1, ...} 这种形式label_dict = {}# 遍历文件夹中的所有文件for filename in os.listdir(src_folder):if filename.endswith('.json'):json_path = os.path.join(src_folder, filename)convert_to_yolo(json_path, dst_folder, label_dict)print("Label与YOLO标签数字的字典:")print(label_dict)# 用法示例
# json 路径
src_folder = r'C:\Users\Administrator\Pictures\car'
# yolo txt文件保存路径
dst_folder = r'C:\Users\Administrator\Pictures\car'
convert_folder_to_yolo(src_folder, dst_folder)

验证对不对看图

输入图片文件夹和yolotxt文件夹,看看yolotxt对不对:

import osimport cv2def draw_boxes(image_path, yolo_txt_path):# 读取图像image = cv2.imread(image_path)if image is None:print(f"Error: Unable to read image from {image_path}")return# 打开YOLO格式的txt文件with open(yolo_txt_path, 'r') as file:lines = file.readlines()# 遍历每行数据for line in lines:# 解析每行数据parts = line.strip().split(' ')yolo_label = int(parts[0])x_center, y_center, width, height = map(float, parts[1:])# 计算矩形左上角和右下角的坐标x_min = int((x_center - width / 2) * image.shape[1])y_min = int((y_center - height / 2) * image.shape[0])x_max = int((x_center + width / 2) * image.shape[1])y_max = int((y_center + height / 2) * image.shape[0])# 获取标签label = str(yolo_label)# 绘制矩形框和标签cv2.rectangle(image, (x_min, y_min), (x_max, y_max), (0, 255, 0), 2)cv2.putText(image, label, (x_min, y_min - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255), 2)# 显示图像cv2.imshow("Image", image)cv2.waitKey(0)cv2.destroyAllWindows()# 用法示例
image_path = r'C:\Users\Administrator\Pictures\car'
# yolo txt文件保存路径
yolo_txt_path = r'C:\Users\Administrator\Pictures\car'images_files = [f for f in os.listdir(image_path) if f.lower().endswith(('.jpg', '.png', '.jpeg'))]
images_files = [os.path.join(image_path, f) for f in images_files]
for img_path in images_files:yolo_txt_path = os.path.splitext(img_path)[0] + '.txt'draw_boxes(img_path, yolo_txt_path)

很对:
在这里插入图片描述

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

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

相关文章

利用OpenShift的ImageStream部署临时版本

公司是港企,项目都部署在OpenShift上统一管理,因为运行环境为香港网络(外网),配置、中间件等大陆无法直接访问联通。因此在大陆开发时,测试是个很大的问题。为了避免往Git上频繁提交未确定可用的版本,选择用利用OpenSh…

嵌入式学习70-复习(wireshark使用和http协议)

--------------------------------------------------------------------------------------------------------------------------------- wireshark 1.sudo wireshark 2.选择 any , 3.搜索 http/tcp 54 为 发送的数据包 58 回复的数据包 请求报文 请求报文…

【NLP练习】使用seq2seq实现文本翻译

使用seq2seq实现文本翻译 🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 from __future__ import unicode_literals, print_function, division from io import open import unicodedata import string impo…

05、Kafka 操作命令

05、Kafka 操作命令 1、主题命令 (1)创建主题 kafka-topics.sh --create --bootstrap-server 192.168.135.132:9092,192.168.135.133:9092,192.168.135.134:9092 --topic test1 --partitions 4 --replication-factor 3–bootstrap-server:…

Gradient发布支持100万token的Lllama3,上下文长度从8K扩展到1048K

前言 近日Gradient公司在Crusoe Energy公司的算力支持下,开发了一款基于Llama-3的大型语言模型。这款新模型在原Llama-3 8B的基础上,将上下文长度从8000 token大幅扩展到超过104万token。 这一创新性突破,展现了当前SOTA大语言模型在长上下…

类和对象(上篇)

面向对象和面向过程 C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 C是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。 类的引入 在…

【17-Ⅰ】Head First Java 学习笔记

HeadFirst Java 本人有C语言基础,通过阅读Java廖雪峰网站,简单速成了java,但对其中一些入门概念有所疏漏,阅读本书以弥补。 第一章 Java入门 第二章 面向对象 第三章 变量 第四章 方法操作实例变量 第五章 程序实战 第六章 Java…

024.反转链表

给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点。 示例 1: 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1]示例 2: 输入:head [1,2] 输出:[2,1]示例 3: 输…

《解锁高效合同管理系统:优化业务流程,提升管理效率》

随着企业规模的扩大和业务复杂性的增加,合同管理变得愈发重要。合同是企业与客户、供应商、合作伙伴之间的法律约束和商业承诺,而有效的合同管理系统则成为企业提高运营效率、降低风险的关键工具。本文将探讨合同管理系统的重要性以及如何利用合同管理系…

【YashanDB知识库】ycm托管数据库时报错OM host ip:127.0.0.1 is not support join to YCM

问题现象 问题的风险及影响 导致数据库无法托管监控 问题影响的版本 问题发生原因 安装数据库时修改了OM的监听ip为127.0.0.1 解决方法及规避方式 后台修改OM的ip为本机的ip或者0.0.0.0 问题分析和处理过程 1、修改env文件中的om IP地址,修改为0.0.0.0或本机…

milvus元数据在etcd的存储解析

milvus元数据在etcd的存储解析 数据以key-value形式存在。 大致包含如下一些种类: databasecollectionfieldpartitionindexsegment-indexresource_groupsession database 创建一个数据库会产生2个key,但value是相同的。 key规则: 前缀/root-coord/database/db…

【深度学习】Diffusion扩散模型原理解析1

1、前言 diffusion,这几年一直很火的模型,比如这段时间在网上的文生图大模型——Stable diffusion。就是以diffusion作为基底模型,但由于该模型与VAE那边,都涉及了较多了概率论知识,实在让人望而却步。所以&#xff0…

线路和绕组中的波过程(二)

本篇为本科课程《高电压工程基础》的笔记。 本篇为这一单元的第二篇笔记。上一篇传送门。 行波通过串联电感与旁路并联电容 由于并联电容或串联电感的存在,线路上传播的行波会发生幅值和波形的变化。 直角波通过串联电感 有一个无限长的直角波 U 1 f U_{1f} U1…

C语言 | Leetcode C语言题解之第82题删除排序链表中的重复元素II

题目: 题解: struct ListNode* deleteDuplicates(struct ListNode* head) {if (!head) {return head;}struct ListNode* dummy malloc(sizeof(struct ListNode));dummy->next head;struct ListNode* cur dummy;while (cur->next && cu…

vue----- watch监听$attrs 的注意事项

目录 前言 原因分析 解决方案 总结 前言 在 Vue 开发过程中,如遇到祖先组件需要传值到孙子组件时,需要在儿子组件接收 props ,然后再传递给孙子组件,通过使用 v-bind"$attrs" 则会带来极大的便利,但同时…

设计模式 六大原则之单一职责原则

文章目录 概述代码例子小结 概述 先看下定义吧,如下: 单一职责原则的定义描述非常简单,也不难理解。一个类只负责完成一个职责或者功能。也就是说在类的设计中, 我们不要设计大而全的类,而是要设计粒度小、功能单一的类。 代码例…

灯珠CCD或CMOS成像RGB数据 光谱重建

1. 源由 本文主要为了通过摄像头CCD或者CMOS传感器对灯珠成像数据分析、重建灯珠可见光范围光谱数据的研究,从原理和方法上论证可行性。 随着照明技术迅猛发展,LED技术日渐成熟。LED产品由于具备经久耐用、节能且价格低等优势,已成为照明行…

传输层之 TCP 协议

TCP协议段格式 源/目的端口号:表示数据是从哪个进程来,到哪个进程去。 序号:发送数据的序号。 确认序号:应答报文的序号,用来回复发送方的。 4 位首部长度:一个 TCP 报头,长度是可变的&#xff…

2024年汉字小达人活动还有4个多月开赛:来做18道历年选择题备考吧

不出特殊情况的话,距离2024年第11届汉字小达人比赛还有4个多月的时间,如何利用这段时间有条不紊地备考呢?我的建议是两手准备:①把小学1-5年级的语文课本上的知识点熟悉,重点是字、词、成语、古诗。②把历年真题刷刷熟…

脆皮之“指针和数组的关系”

文章目录 1. 数组名的理解2. 使用指针访问数组3. 一维数组传参的本质4. 冒泡排序5. 二级指针6. 指针数组7. 指针数组模拟二维数组 hello,大家好呀,窝是脆皮炸鸡。这一期是关于数组和指针的,我觉得并不是很难,但是我觉着下一期可能…