json转xml
原始数据集文件夹中图片格式为bmp,标注文件为json,图片和标注文件放在同一个文件夹下面,将json转为xml格式,图片和标注文件分别存放在一个文件夹下面。
headstr = """\
<annotation>
<folder>VOC</folder>
<filename>%s</filename>
<source>
<database>My Database</database>
<annotation>COCO</annotation>
<image>flickr</image>
<flickrid>NULL</flickrid>
</source>
<owner>
<flickrid>NULL</flickrid>
<name>company</name>
</owner>
<size>
<width>%d</width>
<height>%d</height>
<depth>%d</depth>
</size>
<segmented>0</segmented>
"""
objstr = """\
<object>
<name>%s</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>%d</xmin>
<ymin>%d</ymin>
<xmax>%d</xmax>
<ymax>%d</ymax>
</bndbox>
</object>
"""
tailstr = '''\
</annotation>
'''
def write_xml(xml_path,head,labels,bboxs,tail):
f = open(xml_path,'w')
f.write(head)
for i in range(len(labels)):
bbox = bboxs[i]
f.write(objstr % (labels[i],bbox[0],bbox[1],bbox[2],bbox[3]))
f.write(tail)
def json_to_xml(json_file, xml_file):
with open(json_file, 'r') as f:
data = json.load(f)
labels = []
bboxs = []
for shape in data['shapes']:
label = shape['label']
labels.append(label)
xmin = int(shape['points'][0][0])
ymin = int(shape['points'][0][1])
xmax = int(shape['points'][1][0])
ymax = int(shape['points'][1][1])
bboxs.append([xmin, ymin, xmax, ymax])
image_name = data['imagePath']
imageWidth = data['imageWidth']
imageHeight = data['imageHeight']
head = headstr % (image_name,imageWidth, imageHeight, 3)
tail = tailstr
write_xml(xml_file, head, labels, bboxs, tail)
import os, shutil
from tqdm import tqdm
ori_path = "E:/projects/20240702181159-1Fs/"
img_path = "E:/projects/datasets/img/"
xml_path = "E:/projects/datasets/ann/"
for file in tqdm(os.listdir(ori_path)):
if '.json' in file:
json_to_xml(os.path.join(ori_path, file), os.path.join(xml_path, file.replace('json', 'xml')))
else:
shutil.copy(os.path.join(ori_path, file), os.path.join(img_path, file))