代码:
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)