【数据标注】yolo系列中 labelme 标记的 json 文件转 txt 文件保存

news2024/11/26 23:29:09

在深度学习领域中,数据的标注方式和对应的数据格式确实五花八门。下面是一些常见的标注方式和对应的数据格式:

    1. 目标检测标注方式:对于图像目标检测任务,常见的标注方式包括Bounding Box、Mask、Keypoint等。其中,
    • Bounding Box指的是在图像中用矩形框标记出目标的位置和大小,通常用左上角和右下角的坐标表示;
    • Mask指的是将目标的轮廓用像素点进行标记,通常用二值图像表示;
    • Keypoint指的是在目标上标记出关键点的位置,通常用关键点坐标表示。
    • 这些标注方式通常用XML、JSON、CSV等格式进行存储。
    1. 分割标注方式:对于图像分割任务,常见的标注方式包括Semantic Segmentation、Instance Segmentation等。其中,
    • Semantic Segmentation指的是将图像中的每个像素都进行分类,以实现对图像的整体理解;
    • Instance Segmentation指的是将图像中的每个目标都进行分割,以实现对目标的精细理解。
    • 这些标注方式通常用PNG、JPEG、TIFF等格式进行存储。

在公开数据中,有一些特色代表性的标注文件存储格式,例如:

    1. COCO:这是一个广泛使用的图像目标检测和分割数据集,其标注文件采用JSON格式进行存储。
    1. Pascal VOC:这是一个经典的图像目标检测和分割数据集,其标注文件采用XML格式进行存储。
    1. ImageNet:这是一个包含超过1400万张图像的数据集,其标注文件采用TXT格式进行存储,每张图像对应一个TXT文件。
    1. Open Images:这是一个由Google发布的大规模图像数据集,其标注文件采用CSV格式进行存储。

本文主要记录在yolo系列目标检测和分割算法中,尝尝会将json文件,转为yolo所需要的txt文件。分别包括了目标检测和分割的数据转换形式。

一、yolov5的bbox另存为txt

yolov5的bbox目标检测中,数据形式是(x-center,y_center, width, height)。都是图像的相对大小

import numpy as np
import os
from PIL import Image
import json
import pandas as pd

label_list = ['a', 'b']
class LabelJson(object):
    def __init__(self, abs_path=None, mode='saveTXT') -> None:
        super().__init__()
        self.abs_path = abs_path
        self.mode = mode
        self.read()

    
    def read(self):
        with open(self.abs_path,'r', encoding='utf-8') as f:
            lj = json.load(f)
        self.wh = [lj.get('imageWidth'), lj.get('imageHeight')]
        shapes = lj.get('shapes')
        if self.mode=='saveTXT':
            self.cls = [i.get('label') for i in shapes]

        points = [i.get('points') for i in shapes]
        points = [np.array(i, dtype=np.int32).reshape((-1, 2)) for i in points]
        self.loc = points
        self.box = [[j[:, 0].min(), j[:, 1].min(), j[:, 0].max(), j[:, 1].max()] for j in points]
        self.img_name=lj.get('imagePath')
        self.is_pos = bool(self.cls)
        return self



def saveTXT_bbox(json_info, save_path, imp):
    box = np.array(json_info.box)
    w, h = json_info.wh
    cls = json_info.cls
    if w is None:
        img = Image.open(imp)
        w, h = img.size
    print(cls)

        with open(save_path, 'w', encoding='utf-8') as ff:
        for idx, (xmin, ymin, xmax, ymax) in enumerate(box):
            label = cls[idx].split('-')[0]

            ff.write(f'{label_list.index(label)} {(xmin+xmax)/(2*w)} {(ymin+ymax)/(2*h)} {(xmax-xmin)/w} {(ymax-ymin)/h}\n')

def json2txtBbox_main(img_dir, json_dir, save_dir):
    for imgfile in os.listdir(img_dir):
        print(imgfile)
        name, suffix = os.path.splitext(imgfile)
        json_path = os.path.join(json_dir, name + '.json')
        if os.path.exists(json_path):
            img_path = os.path.join(img_dir, imgfile)
            json_info = LabelJson(json_path, mode='saveTXT')
            saveTXT_bbox(json_info, os.path.join(save_dir, name + '.txt'), img_path)


if __name__=="__main__":
    img_dir = r'./image'
    json_dir = r'./label'
    save_dir = r'./txt'

    json2txtBbox_main(img_dir, json_dir, save_dir)

保存后的txt文件,存储内容为:

1

二、yolov8的mask另存为txt

在yolov8中,可以实现对目标的分割,其中分割数据集文件中单行的格式如下:

<class-index> <x1> <y1> <x2> <y2> ... <xn> <yn>
  • class-index: is the index of the class for the object,
  • x1 y1 x2 y2 … xn yn: are the bounding coordinates of the object’s segmentation mask.

例如:

0 0.6812 0.48541 0.67 0.4875 0.67656 0.487 0.675 0.489 0.66
1 0.5046 0.0 0.5015 0.004 0.4984 0.00416 0.4937 0.010 0.492 0.0104

数据整理定义参考链接:Ultralytics YOLOv8 Docs
Instance Segmentation Datasets Overview

实现代码如下所示:

def saveTXT_mask(json_info, save_path, imp):
    points = json_info.loc
    w, h = json_info.wh
    cls = json_info.cls
    if w is None:
        img = Image.open(imp)
        w, h = img.size

    with open(save_path, 'w', encoding='utf-8') as ff:
        for idx, point in enumerate(points):
            label = cls[idx]

            coor_str = ''
            for (x, y) in point:
                coor_str += str(round(x/w, 4))+' '+str(round(y/h, 4))+' '
            print("coor_str:", coor_str)

            ff.write(f'{label_list.index(label)} {coor_str}\n')

def json2txtMask_main(img_dir, json_dir, save_dir):
    for imgfile in os.listdir(img_dir):
        print(imgfile)
        name, suffix = os.path.splitext(imgfile)
        json_path = os.path.join(json_dir, name + '.json')
        if os.path.exists(json_path):
            img_path = os.path.join(img_dir, imgfile)
            json_info = LabelJson(json_path, mode='saveTXT')
            saveTXT_mask(json_info, os.path.join(save_dir, name + '.txt'), img_path)


if __name__ == "__main__":
    img_dir = r'./image'
    json_dir = r'./label'
    save_dir = r'./txt'
    json2txtMask_main(img_dir, json_dir, save_dir)

保存后的txt文件,存储内容为:

在这里插入图片描述

三、总结

整个过程大致就分为以下几步:

  1. 读取原数据存储文件,拿到需要转储的对应的数字
  2. 转化为新的数组形式
  3. 另存为新的文件格式

最后,记得检查下转储后的文件是否正确。这个可以在训练阶段,查看训练过程中生成的图片,记录了标签和图像合并到一起之后的结果。帮助我们检验下制作的标注文件,是否有问题,并做出及时的调整。

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

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

相关文章

Postman怎么做接口测试-以简单的登录接口为例

我们就以登录某测试系统为例子&#xff0c;实现在Postman上做接口测试 一、首先打开系统首页首页&#xff0c;做一个登录操作&#xff08;目的是获取接口url及参数&#xff09;&#xff1a;一般在公司做接口测试的时候页面还没有出来&#xff0c;我们需要根据接口文档进行接口…

java学习(二):反射

系列文章目录 https://editor.csdn.net/md/?articleId131757340 文章目录 系列文章目录参考【1】注解1. 什么是注解2. 内置注解3. 元注解4.自定义注解 【2】反射--基本概念一、反射的基本概念1. 为什么要用反射&#xff1f;2. 什么是反射&#xff1f;3. 用和不用反射的区别&a…

spring复习:(49)@Configuration配置类上的注解是在哪里被解析的?

主类示例源代码如下&#xff1a; 配置类源码如下&#xff1a; 进入context.register方法&#xff1a; 进入this.reader.register方法&#xff1a; 进入registerBean方法&#xff1a; 进入doRegisterBean方法&#xff1a; 进入AnnotatedGenericBeanDefinition构造方法&am…

计算机科学cs/电子信息ei面试准备——python复习|理解题|简答题

目录 1 请简要概述python技术的主要应用场景? 2 python的基本数据类型是那几种? 3 python数组和列表有什么区别? 4 Python中的函数是什么&#xff1f; 5 请写出删除列表中的元素有几种方式? 6 描述python函数中递归的理解? 7 请介绍join()和split()的区别? 8 介绍…

C++ - 初识vector类 迭代器失效

之前对C当中的string类做了了解和模拟实现&#xff1a; C-string类的模拟实现_chihiro1122的博客-CSDN博客 C string类-2_chihiro1122的博客-CSDN博客 C string类 迭代器 范围for_string类型迭代器_chihiro1122的博客-CSDN博客 vector类使用模版来实现了&#xff0c;我们可…

如何在APP开发中实现无缝用户体验?

我们在日常生活中经常会看到这样一种情况&#xff1a;当我们打开 APP时&#xff0c;有时会出现卡顿、死机的情况&#xff0c;这就是所谓的“死机”现象。在开发 APP时&#xff0c;我们需要考虑用户体验&#xff0c;在用户操作 APP时能够感受到顺畅的使用体验&#xff0c;让用户…

设计模式—1、23种设计模式详解

目录 一、设计模式概述 二、设计模式的分类&#xff08;总共有 25 种设计模式&#xff09; 1、创建型模式&#xff08;5种&#xff09; 2、结构型模式&#xff08;8种&#xff09; 3、行为型模式&#xff08;12种&#xff09; 三、设计模式的优点和缺点 1、设计模式的优点…

Android OpenGL 教程——Native 工程初始化

NativeActivity NDK 的适用场景官方给出三点&#xff1a; 平台间的 App 移植复用现有库对软件性能要求较高的场合比如游戏等 有两种方式可以实现 native activity。 native_activity.handroid_native_app_glue 由于第二种方法启用另一个线程处理回调和输入事件&#xff0c…

用 Generative AI 构建企业专属的用户助手机器人

原文来源&#xff1a; https://tidb.net/blog/a9cdb8ec 关于作者&#xff1a;李粒&#xff0c;PingCAP PM TL;DR 本文介绍了如何用 Generative AI 构建一个使用企业专属知识库的用户助手机器人。除了使用业界常用的基于知识库的回答方法外&#xff0c;还尝试使用模型在 fe…

QML使用滚轮/触控板实现水平滚动/垂直滚动/缩放功能

目录 引言核心代码完整代码 引言 因为项目需要需要进行组件移动、缩放的开发&#xff0c;具体要求如下&#xff1a; 鼠标滚轮&#xff0c;实现垂直移动Ctrl鼠标滚轮&#xff0c;实现缩放Alt鼠标滚轮&#xff0c;实现水平移动触控板移动&#xff0c;实现垂直、水平移动触控板双…

C#事件学习笔记

一.事件概述&#xff1a; 事件的作用是降低模块间的耦合度&#xff0c;本质是观察者模式的应用&#xff0c;通过增加监听器&#xff0c;使事件响应函数的调用分散在各个对象自身内部&#xff0c;当增加和减少一个事件响应函数时&#xff0c;只需要增加或删除相应对象内的代码&…

MyBatis-Plus 的基础增删改查

目录 1. 简介 2. 准备工作 3. MyBatis-Plus 实现增删改查 1. MyBatis-Plus 简介 MyBatis-Plus&#xff08;简称 MP&#xff09;是 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生. 2. 准备工作 2.1 准备数据表 D…

ArgoCD结合Gitlab交付项目到kubernetes集群

ArgoCD结合Gitlab交付项目到kubernetes集群 作者:行癫(盗版必究) 一:环境准备 1.kubernetes集群环境 2.HA_Argocd环境 3.Gitlab集群环境 二:项目配置 1.配置Gitlab 创建仓库,并写入yaml文件,利用yaml构建application;此案例结合了NFS实现持久化存储

【ARM Coresight 系列文章 10.2 - ARM Coresight STM Trace packets】

文章目录 Trace protocolpacket的种类Error packetsVERSION Packets同步 packet 上篇文章&#xff1a;ARM Coresight 系列文章 10.1 - ARM Coresight STM 介绍及使用 Trace protocol STM 产生的trace的是遵守 MIPI System Trace Protocol version 2 (STPv2) 规范的&#xff0c…

Windows环境下Elasticsearch相关软件安装

Windows环境下Elasticsearch相关软件安装 本文将介绍在 windows 环境下安装 Elasticsearch 相关的软件。 1、安装Elasticsearch 1.1 安装jdk ElasticSearch是基于lucence开发的&#xff0c;也就是运行需要java jdk支持&#xff0c;所以要先安装JAVA环境。 由于ElasticSear…

【C++】深入剖析list

本期我们来深入list的实现原理&#xff1a; 目录 一、STL中的list 二、list的模拟实现 2.1 搭建list的框架 2.2 list迭代器的实现 2.2.1 普通迭代器的实现 2.2.2 const类型迭代器的实现 2.2.3 迭代器中->运算符重载实现 2.3 其他功能函数的实现 2.3.1 insert 2.…

爬虫小白-如何辨别是否有cookie反爬案例

目录 一、Cookie介绍二、cookie生成来源区分查找三、如何判断是否有cookie反爬四、来自服务器生成的cookie反爬解决方法五、来自js生成的cookie反爬解决方法 一、Cookie介绍 先推荐该篇文章简单了解Cookie、Session、Token、JWT1、cookie的类型&#xff1a;会话cookie和持久co…

【LeetCode热题100】打卡第42天:滑动窗口最大值搜索二维矩阵II

文章目录 【LeetCode热题100】打卡第42天&#xff1a;滑动窗口最大值&搜索二维矩阵II⛅前言 滑动窗口最大值&#x1f512;题目&#x1f511;题解 搜索二维矩阵II&#x1f512;题目&#x1f511;题解 【LeetCode热题100】打卡第42天&#xff1a;滑动窗口最大值&搜索二维…

装箱问题(背包问题)

题目描述 有一个箱子容量为v(正整数&#xff0c;o≤v≤20000)&#xff0c;同时有n个物品(o≤n≤30)&#xff0c;每个物品有一个体积 (正整数)。要求从 n 个物品中&#xff0c;任取若干个装入箱内&#xff0c;使箱子的剩余空间为最小。 输入格式 第一行&#xff0c;一个整…

js函数增强

目录 函数的属性arguments将arguments转换成数组rest 纯函数柯里化函数自动实现函数柯里化组合函数自动实现组合化with与evalwitheval 严格模式严格模式的限制 函数的属性 函数其实也是一个对象 是对象就会有对应的方法与属性 以下是几个常用属性 name name属性主要用于访问给…