> 文章列表 > 【模式识别4】YOLO目标检测数据集xml格式转txt格式

【模式识别4】YOLO目标检测数据集xml格式转txt格式

【模式识别4】YOLO目标检测数据集xml格式转txt格式

YOLO目标检测数据集xml格式转txt格式

    • 1. 转换前的xml格式
    • 2. xml格式转txt格式代码
      • 2.1 源代码
      • 2.2 需要修改的地方
    • 3. 转换后的txt格式

代码资源:voc2txt.py

1. 转换前的xml格式

如果我们使用LabelImg工具标注数据集,生成的xml文件如下:
在这里插入图片描述
xml中各标签含义:

  • <object>:检测的目标
  • <name>:检测对象 / 类别
  • <pose>:拍摄角度(Left:左//Right:右//Unspecified:未指明)
  • <truncated>:是否被截断(0 代表检测目标完整//1 代表检测目标被截断)
  • <difficult>:是否容易被检测(0 代表容易检测)
  • <bndbox> :bounding-box(包含左上角 x,y 坐标<xmin>、<ymin>和右下角 x,y 坐标<xmax>、<ymax>) (单位:像素)

2. xml格式转txt格式代码

2.1 源代码

# 导入相关库
import os
from lxml import etree
from tqdm import tqdmdef voc2txt():# 获取xml文件夹下的所有xml文件名,存入列表xmls_list = os.listdir(xmls_ori_path)for xml_name in tqdm(xmls_list):# 打开写入文件txt_name = xml_name.replace('xml', 'txt')f = open(os.path.join(txts_save_path, txt_name), 'w')  # 代开待写入的txt文件with open(os.path.join(xmls_ori_path, xml_name), 'rb') as fp:# 开始解析xml文件xml = etree.HTML(fp.read())width = int(xml.xpath('//size/width/text()')[0])height = int(xml.xpath('//size/height/text()')[0])# 获取对象标签obj = xml.xpath('//object')for each in obj:name = each.xpath("./name/text()")[0]classes = dic[name]xmin = int(each.xpath('./bndbox/xmin/text()')[0])xmax = int(each.xpath('./bndbox/xmax/text()')[0])ymin = int(each.xpath('./bndbox/ymin/text()')[0])ymax = int(each.xpath('./bndbox/ymax/text()')[0])# 归一化dw = 1 / widthdh = 1 / heightx_center = (xmin + xmax) / 2y_center = (ymax + ymin) / 2w = (xmax - xmin)h = (ymax - ymin)x, y, w, h = x_center * dw, y_center * dh, w * dw, h * dh# 写入f.write(str(classes) + ' ' + str(x) + ' ' + str(y) + ' ' + str(w) + ' ' + str(h) + ' ' + '\\n')f.close()  # 关闭txt文件if __name__ == '__main__':dic = {'zero': "0",  # 创建字典用来对类型进行转换'one': "1",   # 此处的字典要与自己的classes.txt文件中的类对应,且顺序要一致'two': "2",'three': "3",'four': "4",'five': "5",'six': "6",'seven': "7",'eight': "8",'nine': "9",}xmls_ori_path = r"xml"         # xml文件所在的文件夹txts_save_path = r"txt"         # txt文件所在的文件夹os.mkdir(txts_save_path) if not os.path.exists(xmls_ori_path) else Nonevoc2txt()

2.2 需要修改的地方

  • 目标的类别
    LabelImg标注完会生成“classes.txt”,如下为真实类别名称,从上到下类别代号分别为0、1、2、…
    在这里插入图片描述
    因此,需要建立字典映射,将classes.txt的真实类别名称(如下左列)分别映射到代号0、1、2…(如下右列)
    在这里插入图片描述

  • 修改数据集路径
    修改为自己的xml文件夹路径以及保存的txt文件夹路径即可
    在这里插入图片描述

3. 转换后的txt格式

在这里插入图片描述
每行表示(类别,中心x相对坐标,中心y相对坐标,相对宽度、相对高度)