yolo图像检测数据集格式转换:xml 与 txt格式相互转换

您所在的位置:网站首页 怎么把bin文件转换成txt yolo图像检测数据集格式转换:xml 与 txt格式相互转换

yolo图像检测数据集格式转换:xml 与 txt格式相互转换

2024-07-09 17:22| 来源: 网络整理| 查看: 265

格式介绍

在这里插入图片描述 一图流介绍的比较详细,一般图像检测数据集格式为txt或者xml格式,在使用labelimg进行标注的时候,可以设置获得不同格式的数据集,以满足不同算法训练格式要求: 在这里插入图片描述 一般建议使用pascalVoc:即PASCAL VOC数据集格式,关于该数据集的参见:PASCAL VOC 因为这样的数据方便在标注软件中看到对应的框;

xml转txt

对于xml格式数据集,如果要用yolo对其进行使用时候,先将其转化为txt格式,再进行训练,转换代码:

#!/usr/bin/env python3 # -*- coding: utf-8 -*- import copy from lxml.etree import Element, SubElement, tostring, ElementTree import xml.etree.ElementTree as ET import pickle import os from os import listdir, getcwd from os.path import join classes = ["0", "1", "2", "3"] # 类别 CURRENT_DIR = os.path.dirname(os.path.abspath(__file__)) def convert(size, box): dw = 1. / size[0] dh = 1. / size[1] x = (box[0] + box[1]) / 2.0 # (x_min + x_max) / 2.0 y = (box[2] + box[3]) / 2.0 # (y_min + y_max) / 2.0 w = box[1] - box[0] # x_max - x_min h = box[3] - box[2] # y_max - y_min x = x * dw w = w * dw y = y * dh h = h * dh return (x, y, w, h) def convert_annotation(image_id): in_file = open('./label_xml\%s.xml' % (image_id), encoding='UTF-8') out_file = open('./label_txt\%s.txt' % (image_id), 'w') # 生成txt格式文件 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'): cls = obj.find('name').text # print(cls) if cls not in classes: continue cls_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)) bb = convert((w, h), b) out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n') xml_path = os.path.join(CURRENT_DIR, './label_xml/') # xml list img_xmls = os.listdir(xml_path) for img_xml in img_xmls: label_name = img_xml.split('.')[0] print(label_name) convert_annotation(label_name) txt转xml

txt格式的数据不方便进行一些数据增强操作,可以先将其转换成xml格式后再进行相关标注工作或者 增强操作;

#!/user/bin/env python3 # _*_ coding:utf-8 -*_ # using: 将yolo txt label 转换成xml标签 from xml.dom.minidom import Document import os import cv2 def makexml(txtPath, xmlPath, picPath): # 读取txt路径,xml保存路径,数据集图片所在路径 dict = {'0': "0", # 字典对类型进行转换 '1': "1", '2': "2", '3': "3"} files = os.listdir(txtPath) for i, name in enumerate(files): xmlBuilder = Document() annotation = xmlBuilder.createElement("annotation") # 创建annotation标签 xmlBuilder.appendChild(annotation) txtFile=open(txtPath+name) txtList = txtFile.readlines() img = cv2.imread(picPath+name[0:-4]+".jpg") Pheight, Pwidth, Pdepth=img.shape flag = 0 for i in txtList: flag += 1 oneline = i.strip().split(" ") folder = xmlBuilder.createElement("folder") # folder标签 folderContent = xmlBuilder.createTextNode("VOC2007") folder.appendChild(folderContent) annotation.appendChild(folder) if flag == 1: filename = xmlBuilder.createElement("filename") # filename标签 filenameContent = xmlBuilder.createTextNode(name[0:-4]+".jpg") filename.appendChild(filenameContent) annotation.appendChild(filename) size = xmlBuilder.createElement("size") # size标签 width = xmlBuilder.createElement("width") # size子标签width widthContent = xmlBuilder.createTextNode(str(Pwidth)) width.appendChild(widthContent) size.appendChild(width) height = xmlBuilder.createElement("height") # size子标签height heightContent = xmlBuilder.createTextNode(str(Pheight)) height.appendChild(heightContent) size.appendChild(height) depth = xmlBuilder.createElement("depth") # size子标签depth depthContent = xmlBuilder.createTextNode(str(Pdepth)) depth.appendChild(depthContent) size.appendChild(depth) annotation.appendChild(size) object = xmlBuilder.createElement("object") picname = xmlBuilder.createElement("name") nameContent = xmlBuilder.createTextNode(dict[oneline[0]]) picname.appendChild(nameContent) object.appendChild(picname) pose = xmlBuilder.createElement("pose") poseContent = xmlBuilder.createTextNode("Unspecified") pose.appendChild(poseContent) object.appendChild(pose) truncated = xmlBuilder.createElement("truncated") truncatedContent = xmlBuilder.createTextNode("0") truncated.appendChild(truncatedContent) object.appendChild(truncated) difficult = xmlBuilder.createElement("difficult") difficultContent = xmlBuilder.createTextNode("0") difficult.appendChild(difficultContent) object.appendChild(difficult) bndbox = xmlBuilder.createElement("bndbox") xmin = xmlBuilder.createElement("xmin") mathData=int(((float(oneline[1]))*Pwidth+1)-(float(oneline[3]))*0.5*Pwidth) xminContent = xmlBuilder.createTextNode(str(mathData)) xmin.appendChild(xminContent) bndbox.appendChild(xmin) ymin = xmlBuilder.createElement("ymin") mathData = int(((float(oneline[2]))*Pheight+1)-(float(oneline[4]))*0.5*Pheight) yminContent = xmlBuilder.createTextNode(str(mathData)) ymin.appendChild(yminContent) bndbox.appendChild(ymin) xmax = xmlBuilder.createElement("xmax") mathData = int(((float(oneline[1]))*Pwidth+1)+(float(oneline[3]))*0.5*Pwidth) xmaxContent = xmlBuilder.createTextNode(str(mathData)) xmax.appendChild(xmaxContent) bndbox.appendChild(xmax) ymax = xmlBuilder.createElement("ymax") mathData = int(((float(oneline[2]))*Pheight+1)+(float(oneline[4]))*0.5*Pheight) ymaxContent = xmlBuilder.createTextNode(str(mathData)) ymax.appendChild(ymaxContent) bndbox.appendChild(ymax) object.appendChild(bndbox) annotation.appendChild(object) f = open(xmlPath+name[0:-4]+".xml", 'w') xmlBuilder.writexml(f, indent='\t', newl='\n', addindent='\t', encoding='utf-8') f.close() makexml("./label_txt/","./label_xml/","./image/")

其中:

label_txt: 存放txt格式的文件label_xml: 存放xml格式的文件image: 存放本地图片 参考 https://arleyzhang.github.io/articles/1dc20586/https://zhuanlan.zhihu.com/p/58392978


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3