废话不多说,直接上代码
import xml.etree.ElementTree as ET
import os
import json
# 定义函数convert_annotation(xml_files_path, save_txt_files_path),
# 该函数接受两个参数,分别为xml文件的路径(xml_files_path),转换成txt文件之后的保存路径(save_txt_files_path)。
def convert_annotation(xml_files_path, save_txt_files_path):
xml_files = os.listdir(xml_files_path)
print(xml_files)
out_txt_path = os.path.join(save_txt_files_path + '.txt')
out_txt_f = open(out_txt_path, 'w')
for xml_name in xml_files: # 遍历文件夹内所有的xml文件名
print(xml_name)
xml_file = os.path.join(xml_files_path, xml_name)
#out_txt_path = os.path.join(save_txt_files_path, xml_name.split('.')[0] + '.txt')
#out_txt_f = open(out_txt_path, 'w')
tree = ET.parse(xml_file) # 使用xml树,遍历当前的xml文件
root = tree.getroot() # 获取到当前xml树的根节点
size = root.find('size') # 在当前的xml文件内找到子元素size
w = int(size.find('width').text)
h = int(size.find('height').text)
# 以上两行代码表示在当前的xml文件内找到目标框的宽度和高度
img_path= 'images/'+xml_name.split('.')[0] + '.jpg'
out_txt_f.write(img_path)
out_txt_f.write('\t')
data={}
annotations=[]
for ann in root.iter('annotation'):
for obj in ann.findall('object'):
points = []
transcription = '文字'
for xmlbox in obj.findall('bndbox'):
points.append([[int(float(xmlbox.find('x1').text)),int(float(xmlbox.find('y1').text))],[int(float(xmlbox.find('x2').text)),int(float(xmlbox.find('y2').text))],[int(float(xmlbox.find('x3').text)),int(float(xmlbox.find('y3').text))],[int(float(xmlbox.find('x4').text)),int(float(xmlbox.find('y4').text))]])
annotations.append({
"transcription": transcription,
"points": points[0]
})
#防止双引号被转义成单引号
annotations = json.dumps(annotations, ensure_ascii=False, indent=None)
out_txt_f.write(annotations)
out_txt_f.write('\n')
if __name__ == "__main__":
# 1、WTW数据集xml标签文件路径
xml_files1 = r'.\test-xml-revise'
# 2、转化为PPOCRLabel格式的txt标签文件存储路径
save_txt_files1 = r'.\labels'
convert_annotation(xml_files1, save_txt_files1)
可用于训练OCR检测模型