自建数据集系列:从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

相关文章

SpringBoot集成EasyExcel实现百万级别的数据导入导出实践指南

《SpringBoot集成EasyExcel实现百万级别的数据导入导出实践指南》本文将基于开源项目springboot-easyexcel-batch进行解析与扩展,手把手教大家如何在SpringBo... 目录项目结构概览核心依赖百万级导出实战场景核心代码效果百万级导入实战场景监听器和Service(核心

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

pandas数据的合并concat()和merge()方式

《pandas数据的合并concat()和merge()方式》Pandas中concat沿轴合并数据框(行或列),merge基于键连接(内/外/左/右),concat用于纵向或横向拼接,merge用于... 目录concat() 轴向连接合并(1) join='outer',axis=0(2)join='o

批量导入txt数据到的redis过程

《批量导入txt数据到的redis过程》用户通过将Redis命令逐行写入txt文件,利用管道模式运行客户端,成功执行批量删除以Product*匹配的Key操作,提高了数据清理效率... 目录批量导入txt数据到Redisjs把redis命令按一条 一行写到txt中管道命令运行redis客户端成功了批量删除k

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

解决pandas无法读取csv文件数据的问题

《解决pandas无法读取csv文件数据的问题》本文讲述作者用Pandas读取CSV文件时因参数设置不当导致数据错位,通过调整delimiter和on_bad_lines参数最终解决问题,并强调正确参... 目录一、前言二、问题复现1. 问题2. 通过 on_bad_lines=‘warn’ 跳过异常数据3

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分