自建数据集系列:从labelImg格式->txt格式(YOLO格式、ICDAR2015格式)

2023-10-13 16:40

本文主要是介绍自建数据集系列:从labelImg格式->txt格式(YOLO格式、ICDAR2015格式),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 前言
    • xml转YOLO格式
    • xml转ICDAR2015格式
    • 🔰 汇总 🔰
      • 🔷1.从labelImg格式->txt格式(YOLO格式、ICDAR2015格式)
      • 2.从二值mask->labelme格式->coco格式
      • 3.从labelme格式->VOC格式+从二值mask->VOC格式
      • 4.从RGB->二值mask->coco格式
      • 5.实例分割mask->语义分割mask->扩增mask
      • 6.COCO格式->YOLO格式
      • 双模图片数据与对应标注文件的命名对齐
      • xml标注文件的节点、属性、文本的修正
      • cocoJson数据集统计分析

前言

xml格式虽然在检测领域是比较常用,但是吧也并非绝对

xml转YOLO格式

xml格式

<?xml version="1.0" ?><annotation><folder>JPEGImages</folder><filename>000000.jpg</filename><path>E:\dataset\camo\JPEGImages\000000.jpg</path><source><database>Unknown</database></source><size><width>500</width><height>282</height><depth>3</depth></size><segmented>0</segmented><object><name>person</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>170</xmin><ymin>112</ymin><xmax>223</xmax><ymax>232</ymax></bndbox></object>
</annotation>

txt格式

0 0.391 0.6063829787234042 0.106 0.425531914893617
# -*- coding: utf-8 -*-
import xml.etree.ElementTree as ET
import ossets = ['train', 'val', 'test']
# classes = ["a", "b"]   # 改成自己的类别
classes = ['person']  # class names
abs_path = os.getcwd()def convert(size, box):dw = 1. / (size[0])dh = 1. / (size[1])x = (box[0] + box[1]) / 2.0 - 1y = (box[2] + box[3]) / 2.0 - 1w = box[1] - box[0]h = box[3] - box[2]x = x * dww = w * dwy = y * dhh = h * dhreturn x, y, w, hdef convert_annotation(image_id):in_file = open(abs_path + '/Annotations/%s.xml' % (image_id), encoding='UTF-8')out_file = open(abs_path + '/labels/%s.txt' % (image_id), 'w')tree = ET.parse(in_file)root = tree.getroot()size = root.find('size')w = int(size.find('width').text)h = int(size.find('height').text)for obj in root.iter('object'):difficult = obj.find('difficult').text# difficult = obj.find('Difficult').textcls = obj.find('name').textif cls not in classes or int(difficult) == 1:continuecls_id = classes.index(cls)xmlbox = obj.find('bndbox')b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),float(xmlbox.find('ymax').text))b1, b2, b3, b4 = b# 标注越界修正if b2 > w:b2 = wif b4 > h:b4 = hb = (b1, b2, b3, b4)bb = convert((w, h), b)out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')for image_set in sets:if not os.path.exists(abs_path + '/labels/'):os.makedirs(abs_path + '/labels/')image_ids = open(abs_path + '/ImageSets/Main/%s.txt' % (image_set)).read().strip().split()list_file = open(abs_path + '/%s.txt' % (image_set), 'w')for image_id in image_ids:list_file.write(abs_path + '/JPEGImages/%s.jpg\n' % (image_id))convert_annotation(image_id)list_file.close()

xml转ICDAR2015格式

ICDAR格式主要用于文字检测识别领域,多为四点框
在这里插入图片描述

原始xml:labelImg的标注

<annotation><folder>数据集jpg</folder><filename>81.jpg</filename><path>C:\Users\cam_robot\Desktop\28船\船名字符数据\数据集jpg\81.jpg</path><source><database>Unknown</database></source><size><width>1267</width><height>765</height><depth>3</depth></size><segmented>0</segmented><object><name>44106</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>197</xmin><ymin>488</ymin><xmax>312</xmax><ymax>521</ymax></bndbox></object><object><name>CHINA</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>606</xmin><ymin>514</ymin><xmax>671</xmax><ymax>541</ymax></bndbox></object><object><name>COAST</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>679</xmin><ymin>515</ymin><xmax>747</xmax><ymax>543</ymax></bndbox></object><object><name>GUARD</name><pose>Unspecified</pose><truncated>0</truncated><difficult>0</difficult><bndbox><xmin>757</xmin><ymin>518</ymin><xmax>824</xmax><ymax>546</ymax></bndbox></object>
</annotation>

目标结果:icdar2015的txt形式

197.0,488.0,312.0,488.0,312.0,521.0,197.0,521.0,44106
606.0,514.0,671.0,514.0,671.0,541.0,606.0,541.0,CHINA
679.0,515.0,747.0,515.0,747.0,543.0,679.0,543.0,COAST
757.0,518.0,824.0,518.0,824.0,546.0,757.0,546.0,GUARD

转换脚本:xml2txt.py

import xml.etree.ElementTree as ET
import osdef dealXml(xmlPath):tree = ET.parse(xmlPath)root = tree.getroot()  #获取根节点,此处是<Annotion>的节点filename = root.find('filename').text  #通过find节点再text获取文本time1.jpglists = []for obj in root.findall('object'):  #获取所有名为'object'的直接子节点lineList = []for attr in list(obj): #list出Object的所有直接子节点if 'bndbox'in attr.tag:   #判断节点标签x1 = float(attr.find('xmin').text) y1 = float(attr.find('ymin').text)x2 = float(attr.find('xmax').text)y2 = float(attr.find('ymin').text)x3 = float(attr.find('xmax').text)y3 = float(attr.find('ymax').text)x4 = float(attr.find('xmin').text)y4 = float(attr.find('ymax').text)lineList = [x1,y1,x2,y2,x3,y3,x4,y4] + lineListif attr.tag=="name":label = attr.textlineList.append(label)lists.append(lineList)return listsdef saveTxt(xmlPath):lists = dealXml(xmlPath)if len(lists)>0:txtPath = os.path.splitext(xmlPath)[0]+".txt"with open(txtPath,mode='w', encoding='UTF-8') as f:for lineList in lists:for item in lineList:if item!= lineList[-1]:f.write(str(item))f.write(",")else:f.write(str(item))f.write("\n")if __name__=='__main__':path = r"C:\Users\cam_robot\Desktop\船名数据集(SEU401)\LabelImgs"for root, dirs, files in os.walk(path, topdown=False):for file in files:portion = os.path.splitext(file)if portion[1]==".xml":saveTxt(os.path.join(path,file))

🔰 汇总 🔰

🔷1.从labelImg格式->txt格式(YOLO格式、ICDAR2015格式)

2.从二值mask->labelme格式->coco格式

3.从labelme格式->VOC格式+从二值mask->VOC格式

4.从RGB->二值mask->coco格式

5.实例分割mask->语义分割mask->扩增mask

6.COCO格式->YOLO格式

双模图片数据与对应标注文件的命名对齐

xml标注文件的节点、属性、文本的修正

cocoJson数据集统计分析

这篇关于自建数据集系列:从labelImg格式->txt格式(YOLO格式、ICDAR2015格式)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/204562

相关文章

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

使用SpringBoot整合Sharding Sphere实现数据脱敏的示例

《使用SpringBoot整合ShardingSphere实现数据脱敏的示例》ApacheShardingSphere数据脱敏模块,通过SQL拦截与改写实现敏感信息加密存储,解决手动处理繁琐及系统改... 目录痛点一:痛点二:脱敏配置Quick Start——Spring 显示配置:1.引入依赖2.创建脱敏

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

Python数据分析与可视化的全面指南(从数据清洗到图表呈现)

《Python数据分析与可视化的全面指南(从数据清洗到图表呈现)》Python是数据分析与可视化领域中最受欢迎的编程语言之一,凭借其丰富的库和工具,Python能够帮助我们快速处理、分析数据并生成高质... 目录一、数据采集与初步探索二、数据清洗的七种武器1. 缺失值处理策略2. 异常值检测与修正3. 数据

pandas实现数据concat拼接的示例代码

《pandas实现数据concat拼接的示例代码》pandas.concat用于合并DataFrame或Series,本文主要介绍了pandas实现数据concat拼接的示例代码,具有一定的参考价值,... 目录语法示例:使用pandas.concat合并数据默认的concat:参数axis=0,join=

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L