paddleLabe标注文件转labelImg

代码:

import os
import xml.etree.ElementTree as ET


# 增加换行符
def __indent(elem, level=0):
    i = "\n" + level * "\t"
    if len(elem):
        if not elem.text or not elem.text.strip():
            elem.text = i + "\t"
        if not elem.tail or not elem.tail.strip():
            elem.tail = i
        for elem in elem:
            __indent(elem, level + 1)
        if not elem.tail or not elem.tail.strip():
            elem.tail = i
    else:
        if level and (not elem.tail or not elem.tail.strip()):
            elem.tail = i


# paddle标注文件转成labelImg标注
def paddle_data_labelImg(paddle_path, labelImg_path):
    Label_path = os.path.join(paddle_path, 'Label.txt')
    with open(Label_path, 'r', encoding='utf-8') as f:
        while True:
            line = f.readline()
            if line:
                list_line = line.split('	')
                image_name = os.path.basename(list_line[0])
                image_path = os.path.join(paddle_path, image_name)
                global false
                false = ''
                texts = eval(list_line[1])
                # 开始写入xml文件
                root = ET.Element('annotation')  # 创建节点
                # root.set('verified', 'yes')
                tree = ET.ElementTree(root)  # 创建文档

                folder = ET.Element('folder')
                folder.text = 'images'
                root.append(folder)

                filename = ET.Element('filename')
                filename.text = image_name
                root.append(filename)

                path = ET.Element('path')
                path.text = image_path
                root.append(path)

                source = ET.Element('source')
                database = ET.Element('database')
                database.text = 'Unknown'
                source.append(database)
                root.append(source)

                size = ET.Element('size')
                width = ET.Element('width')
                width.text = '1124'
                size.append(width)
                height = ET.Element('height')
                height.text = '796'
                size.append(height)
                depth = ET.Element('depth')
                depth.text = '1'
                size.append(depth)
                root.append(size)

                segmented = ET.Element('segmented')
                segmented.text = '0'
                root.append(segmented)

                for text in texts:
                    object = ET.Element('object')
                    transcription = text['transcription']
                    name = ET.Element('name')
                    name.text = transcription
                    object.append(name)

                    pose = ET.Element('pose')
                    pose.text = 'Unspecified'
                    object.append(pose)

                    truncated = ET.Element('truncated')
                    truncated.text = '0'
                    object.append(truncated)

                    difficult = ET.Element('difficult')
                    difficult.text = '0'
                    object.append(difficult)
                    # 坐标
                    bndbox = ET.Element('bndbox')
                    points = text['points']
                    if points[0][0] < points[3][0]:
                        xmin_p = points[0][0]
                    else:
                        xmin_p = points[3][0]
                    xmin = ET.Element('xmin')
                    xmin.text = str(xmin_p)
                    bndbox.append(xmin)
                    if points[0][1] < points[1][1]:
                        ymin_p = points[0][1]
                    else:
                        ymin_p = points[1][1]
                    ymin = ET.Element('ymin')
                    ymin.text = str(ymin_p)
                    bndbox.append(ymin)
                    if points[1][0] > points[2][0]:
                        xmax_p = points[1][0]
                    else:
                        xmax_p = points[2][0]
                    xmax = ET.Element('xmax')
                    xmax.text = str(xmax_p)
                    bndbox.append(xmax)
                    if points[2][1] > points[3][1]:
                        ymax_p = points[2][1]
                    else:
                        ymax_p = points[3][1]
                    ymax = ET.Element('ymax')
                    ymax.text = str(ymax_p)
                    bndbox.append(ymax)

                    object.append(bndbox)
                    root.append(object)
                __indent(root)
                xml_path = os.path.join(labelImg_path, image_name.replace('.png', '.xml'))
                print(xml_path)
                tree.write(xml_path, encoding='utf-8', xml_declaration=True)
            else:
                break


# labelImg标注文件转成paddle标注
def labelImg_data_paddle(paddle_path, labelImg_path):
    list_paddle = []
    list_paddle_zhang = []
    filenames = os.listdir(labelImg_path)
    f_dir = os.path.basename(paddle_path)
    for filename in filenames:
        if '.txt' in filename:
            continue
        print(filename)
        labelImg_xml_path = os.path.join(labelImg_path, filename)
        tree = ET.ElementTree(file=labelImg_xml_path)
        root = tree.getroot()
        list_point, list_point_zhang = [], []
        file_url = ''
        for child in root:
            if child.tag == 'filename':
                file_url = os.path.join(f_dir, child.text)
            if child.text.isspace() and child.tag == 'object':
                dict = {}
                for child2 in child:
                    if child2.tag == 'name':
                        dict['transcription'] = child2.text
                    xmin, ymin, xmax, ymax = 0, 0, 0, 0
                    if child2.text.isspace():
                        for child3 in child2:
                            if child3.tag == 'xmin':
                                xmin = int(child3.text)
                            if child3.tag == 'ymin':
                                ymin = int(child3.text)
                            if child3.tag == 'xmax':
                                xmax = int(child3.text)
                            if child3.tag == 'ymax':
                                ymax = int(child3.text)
                        point = [[xmin, ymin], [xmax, ymin], [xmax, ymax], [xmin, ymax]]
                        dict['points'] = point
                dict['difficult'] = 'false'
                if dict['transcription'] == 'zhang':
                    list_point_zhang.append(dict)
                else:
                    list_point.append(dict)
        result_point = file_url + '	' + str(list_point)
        result_point_zhang = file_url + '	' + str(list_point_zhang)
        result_point = result_point.replace('\'false\'', 'false').replace('\\', '/')
        result_point_zhang = result_point_zhang.replace('\'false\'', 'false').replace('\\', '/')
        list_paddle.append(result_point)
        list_paddle_zhang.append(result_point_zhang)
    print(len(list_paddle))
    with open(os.path.join(paddle_path, 'Label.txt'), 'w', encoding='utf-8')as f:
        for one_paddle in list_paddle:
            f.writelines(one_paddle + '\n')
    with open(os.path.join(paddle_path, 'Label_zhang.txt'), 'w', encoding='utf-8')as f:
        for one_paddle in list_paddle_zhang:
            if '[]' not in one_paddle:
                f.writelines(one_paddle + '\n')
    with open(os.path.join(paddle_path, 'fileState.txt'), 'w', encoding='utf-8')as f:
        for one_paddle in list_paddle:
            file_url = one_paddle.split('	')[0]
            filename = os.path.basename(file_url)
            image_url = os.path.join(paddle_path, filename)
            paddle_image = image_url + '	' + str(1)
            f.writelines(paddle_image + '\n')


if __name__ == '__main__':
    # paddle标注文件转成labelImg标注
    # paddle_path = r'C:\Users\lpj\Desktop\OCR\error'
    # labelImg_path = r'C:\Users\lpj\Desktop\OCR\liuxml'
    # paddle_data_labelImg(paddle_path, labelImg_path)

    # labelImg标注文件转成paddle标注
    labelImg_path = r'C:\Users\lpj\Desktop\OCR\xml'
    paddle_path = r'C:\Users\lpj\Desktop\OCR\images'
    labelImg_data_paddle(paddle_path, labelImg_path)

你可能感兴趣的:(labelme,paddlepaddle,深度学习,python)