Labelme标注的json文件转yolo训练的txt文件

在目标检测任务中,数据标注是模型训练的关键环节。常用的标注工具有Labelimg和 Labelme,它们均能够以直观的方式对图像中的目标进行标注,并生成包含标注信息的TXT文件或者 JSON 文件。然而,YOLO模型使用的是特定格式的 .txt 文件作为训练数据。因此,在使用 Labelme 进行标注后,如何将 JSON 文件转换为 YOLO 训练所需的 .txt 文件格式,成为了数据准备过程中的重要步骤。

本篇文章将详细介绍如何将 Labelme 生成的 JSON 文件转换为适用于 YOLO 训练的 .txt 文件,并通过 Python 代码示例,帮助你高效完成数据集的格式转换。

思路为,json文件中需要提取的关键信息为类别和坐标,可在shapes标签中通过提取label和points的值并进行分析得到,再将坐标值进行归一化,将全部信息按照每行文本输出到txt文件中,得到的即为yolo格式的txt文件。

需要注意labelme标注的json文件可以有矩形框和多边形框以及其它一些种类的形状,这里我们需要处理矩形“rectangle”和多边形“polygon”两种类型的标签,分别提取后经分析即可。

代码如下,输入输出均为文件夹,都是针对文件夹进行批量格式转换的。

# 作者:CSDN-笑脸惹桃花 https://blog.csdn.net/qq_67105081?type=blog

import json
import os

def json2yolo(json_path, output_dir, category_list):
    with open(json_path, 'r') as f:
        labelme_data = json.load(f)  # 读取JSON数据

    image_width = labelme_data.get('imageWidth', 1)  # 避免为0的情况
    image_height = labelme_data.get('imageHeight', 1)
    l = []

    # 遍历所有的标注形状
    for shape in labelme_data['shapes']:
        label = shape['label']
        if label not in category_list:
            print(f"Skipping shape with label '{label}' not in category list.")
            continue
        category = category_list.index(label)
        points = shape['points']
        if shape['shape_type'] == 'rectangle':
            (x1, y1), (x2, y2) = points
        elif shape['shape_type'] == 'polygon':
            x1, y1 = min(point[0] for point in points), min(point[1] for point in points)  
            x2, y2 = max(point[0] for point in points), max(point[1] for point in points)  
        else:
            continue
        # 计算YOLO格式所需的中心点和宽高
        x_center = max(0, (x1 + x2) / 2.0 / image_width)
        y_center = max(0, (y1 + y2) / 2.0 / image_height)
        width = max(0, (x2 - x1) / image_width)
        height = max(0, (y2 - y1) / image_height)
        l.append(f"{category} {x_center} {y_center} {width} {height}")

    # 输出txt文件
    output_file = os.path.join(output_dir, os.path.splitext(os.path.basename(json_path))[0] + '.txt')
    with open(output_file, 'w') as f:
        f.write('\n'.join(l))

def process_folder(json_folder, output_folder, category_list):
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    for filename in os.listdir(json_folder):
        if filename.endswith('.json'):
            json_path = os.path.join(json_folder, filename)
            json2yolo(json_path, output_folder, category_list)
	print("Conversion completed!")

# 定义类别列表
category_list = ["hat", "nohat"]  #修改为自己需要转化的列表

# 输入文件夹和输出文件夹
json_folder = r' '  # 修改为输入json文件夹路径
output_txt_folder = r' '  # 修改为输出txt文件夹路径

# 处理文件夹中的所有json文件
process_folder(json_folder, output_txt_folder, category_list)

使用时修改category_list列表中的类别和输入输出文件夹的路径即可,有疑问可以评论区交流~

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

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

相关文章

Kaggle竞赛——灾难推文分类(Disaster Tweets)

目录 1. 准备工作2. 资源导入3. 数据处理4. 绘制词云图5. 数据可视化5.1 词数和字符数可视化5.2 元特征可视化5.3 类别可视化 6. 词元分析6.1 一元语法统计6.2 多元语法统计 7. 命名实体识别8. 推文主题提取9. 构建模型9.1 数据划分与封装9.2 模型训练与验证 10. 模型评估11. 测…

【Linux】文件IO深度解析:文件描述符与重定向的奥秘

🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 一:🔥 C语言中文件IO操作 🥝 1.C语言中的开关读写文件🦋 1.1 fopen()🦋 1.2 fclose()🦋 1.3 fwrite()&#x1f98…

内容安全与系统构建加速,助力解决生成式AI时代的双重挑战

内容安全与系统构建加速,助力解决生成式AI时代的双重挑战 0. 前言1. PRCV 20241.1 大会简介1.2 生成式 Al 时代的内容安全与系统构建加速 2. 生成式 AI2.1 生成模型2.2 生成模型与判别模型的区别2.3 生成模型的发展 3. GAI 内容安全3.1 GAI 时代内容安全挑战3.2 图像…

面试宝典(五):用三个线程按顺序循环打印123三个数字,比如123123123

要使用三个线程按顺序循环打印123三个数字,势必要控制线程的执行顺序,可以使用java.util.concurrent包中的Semaphore类来控制线程的执行顺序。 代码示例 import java.util.concurrent.Semaphore;public class SequentialPrinting123 {private static Se…

第T8周:猫狗识别

>- **🍨 本文为[🔗365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **🍖 原作者:[K同学啊](https://mtyjkh.blog.csdn.net/)** 🍺 要求: 了解mode…

离线电脑 Visual Studio Community 2017:您的许可证已过期

VS 2017社区版,打开后提示: “您的许可证已过期,必须进行更新。请确保已连接Internet,然后检查更新的许可证以继续使用本产品” 解决办法: (1)在另一台可以联网的电脑上,更新VS20…

8.Linux按键驱动-中断下半部

1.编程思路 1.1在gpio结构体中添加tasklet_struct结构体 1.2在probe函数中初始化tasklet结构体 1.3在中断服务程序中调度tasklet 1.4在这个函数中执行其它任务 2.代码: 应用程序和Makefile和上节一致 https://blog.csdn.net/weixin_40933496/article/details/1…

通过call指令来学习指令摘要表的细节

E8 cw cw 表示E8后面跟随2 字节 (什么数不知道) rel16 指在与指令同一代码段内的相对地址偏移 D ,指向Instruction Operand Encoding 表中的D列, 他告诉我们 操作数1 是一个0FFSET N.S. 在64位模式下,某些指令需要使用“地址覆盖前缀”(address over…

RL学习笔记-马尔可夫过程

参考资料:蘑菇书、周博磊老师课程 在强化学习中,智能体与环境交互是通过马尔可夫决策过程来表示的,因此马尔可夫决策过程是强化学习的基本框架。 马尔可夫性质 指一个随机过程在给定现在状态及所有过去状态情况下,其未来状态的条件…

Golang | Leetcode Golang题解之第506题相对名次

题目: 题解: var desc [3]string{"Gold Medal", "Silver Medal", "Bronze Medal"}func findRelativeRanks(score []int) []string {n : len(score)type pair struct{ score, idx int }arr : make([]pair, n)for i, s : …

BERT语言模型详解【Encoder-Only】

NLP-大语言模型学习系列目录 一、注意力机制基础——RNN,Seq2Seq等基础知识 二、注意力机制【Self-Attention,自注意力模型】 三、Transformer图文详解【Attention is all you need】 四、大语言模型的Scaling Law【Power Low】 五、大语言模型微调方法详解【全量微调、PEFT、…

Android Studio 导入/删除/新建库的模块(第三方项目) - Module

文章目录 一、导入module项目 Module空项目如何导入Project工程项目二、删除module项目三、新建module项目(不常用) 一、导入module项目 首先,你必须要有一个工程(Project),才可以打开项目(Module) 第一步骤:右键项目依次点击 New -> Module 1、工…

LLM | 论文精读 | 基于大型语言模型的自主代理综述

论文标题:A Survey on Large Language Model based Autonomous Agents 作者:Lei Wang, Chen Ma, Xueyang Feng, 等 期刊:Frontiers of Computer Science, 2024 DOI:10.1007/s11704-024-40231-1 一、引言 自主代理(…

AI 提示词(Prompt)入门 :ChatGPT 4.0 高级功能指南

这段时间 GPT4 多了很多功能,今天主要是增加了 GPTs Store 的介绍和 创建 GPTs 的简单方法,那么我们开始吧,文末有彩蛋。 这里主要讲解如下几个点: 1: ChatGPT 4.0 插件的使用 2:ChatGPT 4.0 高级数据分…

【已解决】【hadoop】【hive】启动不成功 报错 无法与MySQL服务器建立连接 Hive连接到MetaStore失败 无法进入交互式执行环境

启动hive显示什么才是成功 当你成功启动Hive时,通常会看到一系列的日志信息输出到控制台,这些信息包括了Hive服务初始化的过程以及它与Metastore服务连接的情况等。一旦Hive完成启动并准备就绪,你将看到提示符(如 hive> &#…

大数据Azkaban(二):Azkaban简单介绍

文章目录 Azkaban简单介绍 一、Azkaban特点 二、Azkaban组成结构 三、Azkaban部署模式 1、solo-server ode(独立服务器模式) 2、two server mode(双服务器模式) 3、distributed multiple-executor mode(分布式多…

FPGA第 13 篇,使用 Xilinx Vivado 创建项目,点亮 LED 灯,Vivado 的基本使用(点亮ZYNQ-7010开发板的LED灯)

前言 在FPGA设计中,Xilinx Vivado软件是一款功能强大的设计工具,它不仅支持硬件描述语言(HDL)的开发,还提供了丰富的图形化设计界面,方便用户进行硬件设计、调试和测试。这里我们将详细介绍,如…

RabbitMQ 高级特性——事务

文章目录 前言事务配置事务管理器加上Transactional注解 前言 前面我们学习了 RabbitMQ 的延迟队列,通过延迟队列可以实现生产者生产的消息不是立即被消费者消费。那么这篇文章我们将来学习 RabbitMQ 的事务。 事务 RabbitMQ 是基于 AMQP 协议实现的,…

Gstreamer的webrtcbin插件

1、输入参数 static GOptionEntry entries[] {{"peer-id", 0, 0, G_OPTION_ARG_STRING, &peer_id, "String ID of the peer to connect to", "ID"},{"server", 0, 0, G_OPTION_ARG_STRING, &server_url, "Signalling se…

unity项目导出安卓工程后,在AndroidStudio打包报错:unityLibrary:BuildIl2CppTask‘.

下面这个是我在unity开发者社区提问后,他们回答得: 解决方案:我这边按照这几个方案检查了下,NDK和JDK都没问题,最后重启电脑才解决的,应该是文件被锁定了,我用的windows系统的。 验证&#xff…