python实现ICDAR2015&17数据转VOC格式(txt转xml)

本文介绍如何使用Python脚本icdar2voc.py将ICDAR2015/2017的数据集中的jpg图片及其txt标注转换为VOC格式的XML文件,包括读取txt文件、解析标签和坐标,并生成相应的XML结构。
摘要由CSDN通过智能技术生成

ICDAR2015&2017数据是一张jpg图片对应一张txt标注文件,文件内容形式如下:
在这里插入图片描述
创建icdar2voc.py文件,代码如下:

# coding:utf-8

import os
import numpy as np
import cv2

def xml(num,width,height,labelname,box,imageName,imagePath):
    """
    写xml文件
    :param num: 第num个文件
    :param width: 图的宽
    :param height: 图的高
    :param ImgArray: 存放图的list
    :param labelname: 贴的图的名字
    :param box: 贴图的框坐标
    :return: 写好的xml文件
    """
    xml_file = open(num,'w')  ######################gai res1,res2
    xml_file.write('<annotation>\n')
    xml_file.write('    <folder>IMage</folder>\n')
    xml_file.write('    <filename>' + imageName + '</filename>\n')
    xml_file.write('    <path>' + imagePath + '</path>\n')
    xml_file.write('    <source>\n')
    xml_file.write('        <database>' + 'Unknown' + '</database>\n')
    xml_file.write('    </source>\n')
    xml_file.write('    <size>\n')
    xml_file.write('        <width>' + str(width) + '</width>\n')
    xml_file.write('        <height>' + str(height) + '</height>\n')
    xml_file.write('        <depth>3</depth>\n')
    xml_file.write('    </size>\n')
    xml_file.write('    <segmented>0</segmented>\n')
    for i in range(len(labelname)):
        xml_file.write('    <object>\n')
        xml_file.write('        <name>' + str(labelname[i]) + '</name>\n')
        xml_file.write('        <pose>Unspecified</pose>\n')
        xml_file.write('        <truncated>0</truncated>\n')
        xml_file.write('        <Difficult>0</Difficult>\n')
        xml_file.write('        <bndbox>\n')
        xml_file.write('            <xmin>' + str(box[i][0]) + '</xmin>\n')
        xml_file.write('            <ymin>' + str(box[i][1]) + '</ymin>\n')
        xml_file.write('            <xmax>' + str(box[i][2]) + '</xmax>\n')
        xml_file.write('            <ymax>' + str(box[i][3]) + '</ymax>\n')
        xml_file.write('        </bndbox>\n')
        xml_file.write('    </object>\n')

    xml_file.write('</annotation>')
    return xml_file

def load_annoataion(p):
    text_polys = []
    text_tags = []
    label = 'text'
    with open(p, "r",encoding='UTF-8-sig') as f:
    # with open(p, "r", encoding='unicode_escape') as f:
        data = f.readlines()
        for item2 in data:
            # print(p,item2)

            # print(item.split(','))
            item=item2.split(',')
            if int(item[0])>1 and int(item[1])>1 and int(item[4])>1 and int(item[5])>1:
                text_polys.append([item[0], item[1], item[4], item[5]])
                text_tags.append(label)
        # print(data)
    return np.array(text_polys, dtype=np.int32), np.array(text_tags, dtype=np.str)

base_dir = "ICDAR2017/VOC2007"

if __name__ == "__main__":
    txt_path = "ICDAR2017/ICDAR2017/txt/"     #自定义训练集Ground Truth路径
    xml_path = base_dir+'/Annotations/'       #自定义生成的xml文件路径
    img_path = "ICDAR2017/ICDAR2017/image/"   #自定义训练集图片路径
    print(os.path.exists(txt_path))
    txts = os.listdir(txt_path)
    for count, t in enumerate(txts):
        print(os.path.join(txt_path, t))
        boxes, labels = load_annoataion(os.path.join(txt_path, t))
        print(len(boxes),len(labels))
        filepath, tmpfilename = os.path.split(t)
        shotname, extension = os.path.splitext(tmpfilename)
        print('****************',shotname)

        # realName=shotname.split("_")[1]+"_"+shotname.split("_")[2]       # ICDAR2015
        realName = os.path.splitext(shotname)[0]                           # ICDAR2017 去除后缀
        print(realName)
        saveXml=xml_path+realName+".xml"
        img = cv2.imread(img_path+realName+'.jpg')
        print(img_path+realName+'.jpg')
        h, w, d = img.shape
        print(h,w,d)
        # for item in boxes:
        #     print(len(item))
        xml(saveXml,w,h,labels,boxes,realName,img_path+realName+'.jpg')

运行代码即可批量转换得到每张jpg对应的xml标注文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值