YOLO数据集制作(一)|Labelme标注的矩形框json文件转txt

news2024/11/20 16:30:45

        以下教程用于将使用Labelme软件标注生成的json格式文件转成YOLO使用的txt格式,适用场景:矩形框

        使用方法:将json文件夹路径填到json_dir后, 将保存转化后txt的路径填入txt_dir后,运行即可转化。

        运行完成后会生成labelclassess.txt文件,其中保存了标签名称,这里的名称与转换后的txt对应。

import os
import cv2
import glob
import json
import numpy as np
from tqdm import tqdm

# 参考链接 https://zhuanlan.zhihu.com/p/622246547


# 将labelme_json标注转yolo_txt
def convert(size, box):
    """
    convert [xmin, xmax, ymin, ymax] to [x_centre, y_centre, w, h]
    """
    dw = 1. / size[0]
    dh = 1. / size[1]
    x = (box[0] + box[1]) / 2.0
    y = (box[2] + box[3]) / 2.0
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return [x, y, w, h]


if __name__ == "__main__":

    class_names = []

    # json文件夹路径
    json_dir = r"O:\DeepLearningTool\01_handle_dataset\dataset\object\image"
    # 转化后txt的保存路径
    txt_dir = r"O:\DeepLearningTool\01_handle_dataset\dataset\object\label"

    if not os.path.exists(txt_dir):
        os.makedirs(txt_dir, exist_ok=True)
    json_pths = glob.glob(json_dir + "/*.json")

    for json_pth in tqdm(json_pths,  desc='Processing'):
        f1 = open(json_pth, "r")
        json_data = json.load(f1)

        img_pth = os.path.join(json_dir, json_pth.replace("json", "jpg"))
        img = cv2.imread(img_pth)
        h, w = img.shape[:2]

        tag = os.path.basename(json_pth)
        out_file = open(os.path.join(txt_dir, tag.replace("json", "txt")), "w")
        label_infos = json_data["shapes"]

        for label_info in label_infos:
            label = label_info["label"]
            points = label_info["points"]
            if len(points) >= 3:
                points = np.array(points)
                xmin, xmax = max(0, min(np.unique(points[:, 0]))), min(w, max(np.unique(points[:, 0])))
                ymin, ymax = max(0, min(np.unique(points[:, 1]))), min(h, max(np.unique(points[:, 1])))
            elif len(points) == 2:
                x1, y1 = points[0]
                x2, y2 = points[1]
                xmin, xmax = min(x1, x2), max(x1, x2)
                ymin, ymax = min(y1, y2), max(y1, y2)
            else:
                continue
            bbox = [xmin, xmax, ymin, ymax]
            bbox_ = convert((w,h), bbox)
            if label not in class_names:
                class_names.append(label)
            cls_id = class_names.index(label)
            out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bbox_]) + '\n')
    with open(txt_dir + 'classes.txt', 'w') as f:
        for i in class_names:
            f.write(i + '\n')

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

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

相关文章

【Ajax零基础教程】-----第四课 简单实现

一、XMLHttpRequest对象 通过XMLHttpRequest对象来向服务器发送异步请求,从服务器获取数据。然后用JavaScript来操作DOM而更新页面。XMLHttpRequest是ajax的核心机制,它是IE5中首先引入的,是一种支持异步请求的技术。 简单的说,也…

分布式存储CephFS最佳实践

文章来源于知乎文章: 分布式存储CephFS最佳实践 背景 近日,一朋友说他们企业内部想落地CephFS,让我帮忙写一份能落地的CephFS最佳实践。然后就顺便把文章整理到了这里。因能力水平以及认知有限,如有错漏烦请指正。 简介 CephF…

Python学习笔记------json

json简介 JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去组织和封装数据 JSON本质上是一个带有特定格式的字符串 主要功能:json就是一种在各个编程语言中流通的数据格式,负责不同编程语言中的数据传递和交互 为了让不同的语言能够相互通…

重载,重写,重定义,纯虚函数,多态习题

只要不够成重写就是重定义。 重定义: 抽象类: 包含纯虚函数的类就是抽象类。 1.纯虚函数的作用,强制子类去完成重写。 2.表示抽象的类型。 抽象就是在现实中没有对应的实体。 1. 下面哪种面向对象的方法可以让你变得富有( a) A 继承 B…

创新案例|搜索新王Perplexity如何构建生成式AI产品开发的新模式

Perplexity AI:生成式搜索的颠覆者 刚刚成立满两年,Perplexity AI已经变成了我日常频繁使用的工具,甚至取代了我对 Google搜索的依赖 —— 而我并非个案。该公司仅凭不到 50 名员工,已经吸引了数千万用户。他们目前的年收入超过 …

C++ 多态 - 下

目录 1. 多态的原理 1.1. 虚函数表 1.2. 多态原理 1.3. 静态绑定和动态绑定 1.3.1. 运行时决议 1.3.2. 编译时决议 1.4. 为什么基类的对象调用虚函数不能构成多态 2. 单继承中的虚函数表 2.1. 同类型对象的虚表 2.2. 单继承的对象的虚表 2.2.1. 内存窗口查看 2.2.2…

【机器学习300问】84、AdaGrad算法是为了解决什么问题?

神经网络的学习的目的是找到使损失函数的值尽可能小的参数。这是寻找最优参数的问题,解决这个问题的过程称为最优化。因为参数空间非常复杂,无法轻易找到最优解,而且在深度神经网络中,参数的数量非常庞大,导致最优化问…

数据库表自增主键超过代码Integer长度问题

数据库自增主键是 int(10) unsigned类型的字段,int(M) 中 M指示最大显示宽度,不代表存储长度,实际int(1)也是可以存储21.47亿长度的数字,如果是无符号类型的,那么可以从0~42.94亿。 我们的表主键自增到21.47亿后&#…

【Pytorch】6.torch.nn.functional.conv2d的使用

阅读之前应该先了解基础的CNN网络的逻辑 conv2d的作用 是PyTorch中用于执行二维卷积操作的函数。它的作用是对输入数据进行二维卷积操作,通常用于图像处理和深度学习中的卷积神经网络(CNN)模型。 conv2d的使用 我们先查看一下官方文档 inpu…

Linux系统调用过程详解:应用程序调用驱动过程

Linux下应用程序调用驱动程序过程: (1)加载一个驱动模块(.ko),产生一个设备文件,有唯一对应的inode结构体 a、每个设备文件都有一个对应的’inode‘结构体,包含了设备的主次设备号,是设备的唯一…

AScript纯本地离线文字识别插件

目的 AScript是一款可以模拟鼠标和键盘操作的自动化工具。它可以帮助用户自动完成一些重复的、繁琐的任务,节省大量人工操作的时间。但按键精灵是不包含图色功能,无法识别屏幕上的图像,根据图像的变化自动执行相应的操作。本篇文章主要讲解下…

全网最详细使用war包的方式结合Tomcat和向量数据库PostgreSQL本地部署Xwiki教学

部署 XWiki 在 CentOS 7 上的过程涉及多个步骤,主要包括安装环境依赖、配置数据库以及安装和配置XWiki。以下是一个详细的步骤说明: 1. 系统准备 首先,确保您的系统是最新的: sudo yum update2. 安装 Java 这里需要注意一下版本…

综述列表(~2024.05.10)

(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 每周末更新,完整版进群获取。 Q 群在群文件,VX 群每周末更新。

vivado新版本兼容老版本,vitis classic兼容sdk教程

new version: vivado版本2023.2 和vitisv classic 2023.2 old version: vivado 2018.3以及之前的版本 打开工程 自动升级到当前版本,选择OK 点击Yes,合并当前的目录架构 点击OK 点击Report IP status 勾选要升级的IP核,点击升级 在项目工程文件夹…

leetcode-括号生成-101

题目要求 思路 1.左括号的数量等于右括号的数量等于n作为判出条件,将结果存到res中 2.递归有两种,一种是增加左括号,一种是增加右括号,只要左括号的数量不超过n,就走增加左括号的递归,右括号的数量只要小于…

Microsoft Edge浏览器,便携增强版 v118.0.5993.69

01 软件介绍 Microsoft Edge浏览器,便携增强版,旨在无需更新组件的情况下提供额外的功能强化。这一增强版专注于优化用户体验和系统兼容性,具体包含以下核心功能的提升: 数据保存:通过优化算法增强了其数据保存能力&…

结构体与联合体的嵌套使用

代码如下 #include <iostream> #include <string> using namespace std;typedef struct t_in_struct1 {int var1;int var2; }name_in_struct1;typedef struct t_in_struct2 {int var3;int var4; }name_in_struct2;typedef struct t_struct {int a;union {name_in_…

重生我是嵌入式大能之串口调试UART

什么是串口 串口是一种在数据通讯中广泛使用的通讯接口&#xff0c;通常我们叫做UART (通用异步收发传输器Universal Asynchronous Receiver/Transmitter)&#xff0c;其具有数据传输速度稳定、可靠性高、适用范围广等优点。在嵌入式系统中&#xff0c;串口常用于与外部设备进…

串口初始化自己独立的见解--第九天

1.SM0,SM1 我们一般用 8位UART&#xff0c;波特率可变 &#xff08;方式1的工作方式&#xff09; SCON &#xff1a;SM2 一般不用&#xff0c;SM0 0 ,SM1 1 PCON : 有两位 我们不动它&#xff0c;不加速&#xff0c;初始值 TMOD&#xff1a;8位自动重装定时器&#xff0…