[目标检测]labelme标注数据转yoloV8需要的.txt格式

1、首先需要知道yoloV8目标检测的标签格式:

        yolov8标签数据格式说明

After using a tool like Roboflow Annotate to label your images, export your labels to YOLO format, with one *.txt file per image (if no objects in image, no *.txt file is required). The *.txt file specifications are:

    One row per object
    Each row is class x_center y_center width height format.
    Box coordinates must be in normalized xywh format (from 0 - 1). If your boxes are in pixels, divide x_center and width by image width, and y_center and height by image height.
    Class numbers are zero-indexed (start from 0).

        主要包括五个数字 id 、x 、y 、w,、h,分别代表标签类别、目标对象在图像中的中心位置(x,y)、目标对象的宽和高。

         注意的是中心位置坐标、以及目标对象的宽和高都需要进行归一化到0-1之间。如下:

0  0.060000 0.460000 0.12 0.65
1  0.450000 0.480000 0.38 0.68
0  0.880000 0.470000 0.24 0.63

2、示例有两种标签类型,转化为.txt的代码如下:

import json
import os
import shutil
import random# Convert label to idx
with open("labels.txt", "r") as f:classes = [c.strip() for c in f.readlines()]idx_dict = {c: str(i) for i, c in enumerate(classes)}def convert_labelmes_to_yolo(labelme_folder, output_folder):label_folder = os.path.join(output_folder, "labels")         # label_folder = image_folder/labelsos.makedirs(label_folder, exist_ok=True)image_folder = os.path.join(output_folder, "images")         # image_folder = image_folder/imagesos.makedirs(image_folder, exist_ok=True)for root, dirs, files in os.walk(labelme_folder):          # root-文件夹所在路径  dir-路经下的文件夹   file-里面的文件for file in files:file_path = os.path.join(root, file)if os.path.splitext(file)[-1] != ".json":      # 分割文件名和扩展名shutil.copy(file_path, image_folder)print(f"Copied {file_path} to {image_folder}")else:# 读取json文件with open(file_path, 'r') as f:labelme_data = json.load(f)image_filename = labelme_data["imagePath"]image_width = labelme_data["imageWidth"]image_height = labelme_data["imageHeight"]txt_filename = os.path.splitext(image_filename)[0] + ".txt"txt_path = os.path.join(label_folder, txt_filename)with open(txt_path, 'w') as f:for shape in labelme_data["shapes"]:label = shape["label"]points = shape["points"]x_min, y_min = points[0]x_max, y_max = points[1]center_x = round(((x_min + x_max) / 2) / image_width , 2)center_y = round(((y_min + y_max) / 2) / image_height ,2)width = round(abs(x_min - x_max) / image_width, 2)height = round(abs(y_min - y_max) / image_height, 2)class_id = label_dict[label]f.write(f"{class_id}  {center_x:.6f} {center_y:.6f} {width} {height}\n")print(f"Converted {file} to {txt_path}")print("转换成功")def split_data(output_folder, dataset_folder):random.seed(0)split_rate = 0.2 #验证集占比origin_label_path = os.path.join(output_folder, "labels")origin_image_path = os.path.join(output_folder, "images")train_label_path = os.path.join(dataset_folder, "train", "labels")os.makedirs(train_label_path, exist_ok=True)train_image_path = os.path.join(dataset_folder, "train", "images")os.makedirs(train_image_path, exist_ok=True)val_label_path = os.path.join(dataset_folder, "val", "labels")os.makedirs(val_label_path, exist_ok=True)val_image_path = os.path.join(dataset_folder, "val", "images")os.makedirs(val_image_path, exist_ok=True)images = os.listdir(origin_image_path)num = len(images)eval_index = random.sample(images,k=int(num*split_rate))for single_image in images:origin_single_image_path = os.path.join(origin_image_path, single_image)single_txt = os.path.splitext(single_image)[0] + ".txt"origin_single_txt_path = os.path.join(origin_label_path, single_txt)if single_image in eval_index:#single_json_path = os.path.join(val_label_path,single_json)shutil.copy(origin_single_image_path, val_image_path)shutil.copy(origin_single_txt_path, val_label_path)else:#single_json_path = os.path.join(train_label_path,single_json)shutil.copy(origin_single_image_path, train_image_path)shutil.copy(origin_single_txt_path, train_label_path)print("数据集划分完成")with open(os.path.join(dataset_folder,"data.yaml"),"w") as f:f.write(f"train: {dataset_folder}\n")f.write(f"val: {val_image_path}\n")f.write(f"test: {val_image_path}\n\n")f.write(f"nc: {len(classes)}\n")f.write(f"names: {classes}\n")if __name__ == '__main__':label_dict = {"incp_tank": 0, "cp_tank": 1}labelme_folder = "./labelme_folder" #labelme生成的标注文件所在的文件夹output_folder = "./test" #存储yolo标注文件的文件夹dataset_folder = "./mydata" #存储划分好的数据集的文件夹convert_labelmes_to_yolo(labelme_folder, output_folder)#将labelme标注文件转换为yolo格式split_data(output_folder, dataset_folder)#划分训练集和验证级

注意:你需要新建一个label.txt文件,把涉及到的标签名字输入进去,会自动得到.yaml文件。当然也可以把这一步省略,后面我们直接copy已有的.yaml把训练、验证的路径加进去即可。

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

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

相关文章

Java.lang.Thread类和Java的主线程

一.Java.lang.Thread类 支持多线程编程 常用方法 二.主线程 ◆Java程序启动时,一个线程立即随之启动,通常称之为程序的主线程 ◆main()方法即为主线程入口 ◆产生其他子线程的线程 ◆必须最后完成执行,因为它执行各种关闭动作 示例 使用…

0-1背包、完全背包算法模板从递归到记忆化搜索到动态规划

0-1背包、完全背包算法模板从递归到记忆化搜索到动态规划 不管是0-1背包还是完全背包,我们都可以将问题转换成为选择或者不选的问题,这个问题在前面的回溯算法模板是一样的。 举个栗子: 假如有1、4、5这三个数,问组成和为12的数需…

202406 CCF-GESP Python 五级试题及详细答案注释

202406 CCF-GESP Python 五级试题及详细答案注释1 单选题(每题 2 分,共 30 分) 第 1 题 在Python中,print((c for c in "GESP"))的输出是( )。 A. (G, E, S, P) B. [G, E, S, P] C. {G, E, S, P} D. 以上选项均不正确答案:D解析:在Python中,(c for c in&q…

Keras实战之图像分类识别

文章目录 整体流程数据加载与预处理搭建网络模型优化网络模型学习率Drop-out操作权重初始化方法对比正则化加载模型进行测试 实战:利用Keras框架搭建神经网络模型实现基本图像分类识别,使用自己的数据集进行训练测试。 问:为什么选择Keras&am…

这门HCIE认证正式发布!

华为认证AI解决方案架构专家HCIE-AI Solution Architect V1.0(中文版)自2024年6月28日起,正式在中国区发布。 基于“平台生态”战略,围绕“云-管-端”协同的新ICT技术架构,华为公司打造了覆盖ICT领域的认证体系&#x…

C++ | Leetcode C++题解之第217题存在重复元素

题目&#xff1a; 题解&#xff1a; class Solution { public:bool containsDuplicate(vector<int>& nums) {unordered_set<int> s;for (int x: nums) {if (s.find(x) ! s.end()) {return true;}s.insert(x);}return false;} };

2024年江苏省研究生数学建模科研创新实践大赛C题气象数据高精度融合技术研究论文和代码分析

经过不懈的努力&#xff0c; 2024年江苏省研究生数学建模科研创新实践大赛C题气象数据高精度融合技术研究论文和代码已完成&#xff0c;代码为C题全部问题的代码&#xff0c;论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&#xff08;问题1模型的建…

Go 语言 UUID 库 google/uuid 源码解析:UUID version1 的实现

google/uuid 库地址 关于 UUID 的总体介绍可以查看这篇文章&#xff0c;其包含阅读此篇文章的前置内容。 UUID version 1 在 RFC 4122 文件中定义&#xff0c;其实现基于节点 ID、时钟序列以及当前时间&#xff08;距离格里历改日【1582年10月15日】 的100纳秒数&#xff0c;具…

服务器BMC基础知识总结

前言 因为对硬件方面不太理解&#xff0c;所以打算先从服务器开始学习&#xff0c;也想和大家一起分享一下&#xff0c;有什么不对的地方可以纠正一下哦&#xff01;谢谢啦&#xff01;互相学习共同成长~ 1.BMC是什么&#xff1f; 官方解释&#xff1a;BMC全名Baseboard Mana…

【深度学习】-WASB-调试说明

要改这么几个地方&#xff1a; 代码仓库&#xff1a;/Desktop/code/python_project/WASB-SBDT-main/ 篮球数据集xx_xx_11.xml只保留最后一个11.xml 并把11下直接放置11 video&#xff1a; 这里的东西被我改了&#xff0c;要以仓库为准

SpringSecurity中文文档(Servlet X.509 Run-As)

X.509 Authentication X. 509证书身份验证的最常见用途是在使用 SSL 时验证服务器的身份&#xff0c;最常见的用法是在浏览器中使用 HTTPS。浏览器会自动检查服务器提供的证书是否已由其维护的受信任证书颁发机构列表中的一个颁发(数字签名)。 您还可以使用带有“相互身份验证…

Java与Selenium配置及常见报错解决方法

Java与Selenium配置及常见报错解决方法 1. 简介 Java与Selenium是自动化测试中常用的工具和技术。正确配置开发环境并处理可能出现的问题&#xff0c;对于顺利开展测试工作至关重要。本文将为您详细介绍Java与Selenium的配置过程&#xff0c;并提供常见报错的解决方法。 2. …

中英双语介绍英国伟大的作家:查尔斯·狄更斯(Charles Dickens)

中文版 查尔斯狄更斯简介 查尔斯狄更斯&#xff08;Charles Dickens&#xff0c;1812年2月7日&#xff0d;1870年6月9日&#xff09;是19世纪英国最著名的小说家之一&#xff0c;以其丰富的文学作品和独特的写作风格闻名于世。他的作品不仅在文学界具有重要地位&#xff0c;而…

SpringSecurity中@PreAuthorize(“hasRole(‘ROLE_USER‘)“) 不起作用的原因

PreAuthorize(“hasRole(‘ROLE_USER’)”) 不起作用的原因可能确实是用户信息中没有包含正确的角色信息&#xff0c;但也可能由其他几个因素导致。以下是一些可能的原因&#xff1a; 1、用户信息中确实没有角色信息&#xff1a; 如果 Authentication 对象中的 GrantedAuthor…

一气之下,关闭成都400多人的游戏公司

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 最近&#xff0c;多益网络宣布关闭成都公司&#xff0c;在未来三年内&#xff0c;关闭成都所有的相关公司。原因竟然是输掉了劳动仲裁&#xff0c;赔偿员工38万多&#xff0c;然后一气之下要退出成都&#xff0c;…

【Python】简易书籍管理程序

之前简单介绍了有关Python的面向对象中的类&#xff0c;这次就围绕"类"和json格式来做一个简单的代码程序&#xff0c;并且在后面还附带了数据。 import json import re import timeclass BookManager:def __init__(self):self.books {} # 使用字典存储书籍信息&a…

Python基础之协程

文章目录 1 协程1.1 简介1.2 协程优势&分类1.2.1 优势1.2.2 分类 1.3 generator协程1.4 gevent协程1.5 asyncio1.5.1 简介1.5.2 asyncio函数1.5.3 async\await1.5.4 asyncio基本操作1.5.4.1 asyncio协程对象1.5.4.2 task对象1.5.4.3 future对象1.5.4.4 绑定回调1.5.4.5 异步…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的生日聚会(100分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

使用antd的<Form/>组件获取富文本编辑器输入的数据

前端开发中&#xff0c;嵌入富文本编辑器时&#xff0c;可以通过富文本编辑器自身的事件处理函数将数据传输给后端。有时候&#xff0c;场景稍微复杂点&#xff0c;比如一个输入页面除了要保存富文本编辑器的内容到后端&#xff0c;可能还有一些其他输入组件获取到的数据也一并…

Mac搭建anaconda环境并安装深度学习库

1. 下载anaconda安装包 根据自己的操作系统不同&#xff0c;选择不同的安装包Anaconda3-2024.06-1-MacOSX-x86_64.pkg&#xff0c;我用的还是旧的intel所以下载这个&#xff0c;https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/&#xff0c;如果mac用的是M1&#xff0…