Python代码xml文件转txt(yolov3)可用格式

Python代码xml文件转txt(yolov3)可用格式

说明

首先感谢提供参考与支持!
参考博客 https://blog.csdn.net/u012966194/article/details/80004647

训练自己神经网络模型需要自己标注,像最常用的Yolov3神经网络。标注的缺陷坐标大多是VOC格式的xml文件,Yolov3模型训练,需要将缺陷坐标,VOC格式的xml文件转换为txt文件。这里做一下技术分享。

前期准备:生成xml索引文件

因为代码中有一段
“image_ids_train = open(‘C:/Users/Admin/PycharmProjects/ReadName/ImageXML.txt’).read().strip().split() # 读取xml文件名索引”
所以在运行代码之前需要创建一个txt文件作为读取xml文件名的索引,txt文件里包含了所有需要转换的xml文件名。如下图所示:
需要读取的xml文件:

Python代码xml文件转txt(yolov3)可用格式_第1张图片
生成的xml索引文件:

Python代码xml文件转txt(yolov3)可用格式_第2张图片Python代码xml文件转txt(yolov3)可用格式_第3张图片
注意:读取的文件名不能带有文件.xml后缀,否则会在读取路径时报错!后续代码在检索时会自动加上.xml后缀。读取文件名的具体操作,详情请见我的另一篇技术分享:

Python批量读取修改文件名 https://blog.csdn.net/GeekYao/article/details/105074574

生成xml索引文件后,就可以愉快的运行代码了。代码如下。

代码

# 缺陷坐标xml转txt

import xml.etree.ElementTree as ET

classes = ["b"]  # 输入缺陷名称,必须与xml标注名称一致

def convert(size, box):
    dw = 1. / size[0]
    dh = 1. / size[1]
    x = (box[0] + box[1]) / 2.0
    y = (box[2] + box[3]) / 2.0
    w = box[1] - box[0]
    h = box[3] - box[2]
    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('G:/修改为本地路径/outputs/%s.xml' % (image_id))  # 读取xml文件路径

    out_file = open('G:/修改为本地路径/outputs/%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
        if cls not in classes:  # 检索xml中的缺陷名称
            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')


image_ids_train = open('C:/修改为本地路径/ImageXML.txt').read().strip().split()  # 读取xml文件名索引

for image_id in image_ids_train:
    convert_annotation(image_id)

运行截图

生成对应的txt格式的缺陷坐标文件:

Python代码xml文件转txt(yolov3)可用格式_第4张图片
txt中缺陷坐标:

Python代码xml文件转txt(yolov3)可用格式_第5张图片数值说明:
一共有5位数字,第一位为整数,代表缺陷类别,后四位为小数,代表缺陷坐标;
第一位数: 0 表示缺陷类别的编号,第一类缺陷为 0,第二类缺陷为 1,第三类缺陷为 2,以此类推;
第二位数: 0.435185… 表示标注缺陷归一化后的中心的X坐标;
第三位数:0.398840… 表示标注缺陷归一化后的中心的y坐标;
第四位数:0.774691… 表示标注缺陷归一化后的目标框宽度weight;
第五位数:0.770618… 表示标注缺陷归一化后的目标框高度height。

得到txt格式的缺陷标注后,就可以开始训练模型了。

后记

这次的技术分享就到此结束了,希望有所帮助,后续还会更新更多的神经网络模型训练的技术分享。

你可能感兴趣的:(数据集预处理)