【深度学习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: 输…

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

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

【python】Flask开发感悟

【背景】 做需求做多了,有一个重要的感悟,无关乎技术,但决定着设计思维的方向。 【感悟】 用户往往提出的需求是碎片化的,他们想要的只是一个解决狭窄问题的特定工具。 但是身兼设计师和开发者双重身份的人员不可能看得这么狭窄…

【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或本机…

阅读完善程序复习(四)2022csp-s

错题: 25. 答案:D 解析:模拟即可。 27. 答案:C 解析:代入一个特例即可(基础,可以分析一下排序)。 32. 答案:B 解析:模拟即可。 33. 答案:B…

milvus元数据在etcd的存储解析

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

代码随想录算法训练营第六十一天| LeetCode739. 每日温度、496.下一个更大元素 I

一、LeetCode739. 每日温度 题目链接/视频讲解/文章讲解:https://programmercarl.com/0739.%E6%AF%8F%E6%97%A5%E6%B8%A9%E5%BA%A6.html 状态:已解决 1.思路 如果有同学学过单调栈的话这道题还是能看出明显解法的,因为需要寻找任一个元素的右…

【深度学习】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" 则会带来极大的便利,但同时…

js代码中关于async await的滥用 async await的滥用

概念: 返回值: async返回一个promise---这个返回值是默认自发行为 async function name1(params) {console.log(params) } let result name1(lion) console.log(result) // Promise { undefined } result.then(res > console.log(res)) // undefin…