github链接,里面有我最近写的一些标签的转换脚本
这是一份将json格式的数据集标签转为xml类型标签的脚本,供大家参考
先说下我的应用场景:天池街景识别提供的json文件,用于制作VOC格式数据集。
json文件打开如下图:
其中包含以下5个参数:
VOC数据集标签格式:
<annotation>
<folder>VOC2012</folder>
<filename>2007_000392.jpg</filename> //文件名
<source> //图像来源(不重要)
<database>The VOC2007 Database</database>
<annotation>PASCAL VOC2007</annotation>
<image>flickr</image>
</source>
<size> //图像尺寸(长宽以及通道数)
<width>500</width>
<height>332</height>
<depth>3</depth>
</size>
<segmented>1</segmented> //是否用于分割(在图像物体识别中01无所谓)
<object> //检测到的物体
<name>horse</name> //物体类别
<pose>Right</pose> //拍摄角度
<truncated>0</truncated> //是否被截断(0表示完整)
<difficult>0</difficult> //目标是否难以识别(0表示容易识别)
<bndbox> //bounding-box(包含左下角和右上角xy坐标)
<xmin>100</xmin>
<ymin>96</ymin>
<xmax>355</xmax>
<ymax>324</ymax>
</bndbox>
</object>
<object> //检测到多个物体
<name>person</name>
<pose>Unspecified</pose>
<truncated>0</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>198</xmin>
<ymin>58</ymin>
<xmax>286</xmax>
<ymax>197</ymax>
</bndbox>
</object>
</annotation>
按照此格式编写自己的脚本(对应的图像数据集,需要准备json文件,xml存储路径):
按照此脚本自己按需求改!
# -*- coding: utf-8 -*-
"""
Created on Thu April 8 20:30:10 2021
@author: WU-JL
"""
import os
import json
import cv2
import codecs
try:
import xml.etree.cElementTree as ET
except ImportError:
import xml.etree.ElementTree as ET
def json_to_xml(image_path,json_path,save_path):
if not os.path.exists(save_path):
os.mkdir(save_path)
data = json.load(open(json_path))
for key in data:
img = cv2.imread(image_path+key)
img_width=img.shape[1]
img_height=img.shape[0]
img_depth=img.shape[2]
label = data[key]['label']
left = data[key]['left']
top = data[key]['top']
height = data[key]['height']
width = data[key]['width']
with codecs.open(save_path + key[0:-4] + '.xml', 'w', 'utf-8') as xml:
xml.write('\n')
xml.write('<annotation>')
xml.write('\t<folder>' + "Annotation" + '</folder>\n')
xml.write('\t<filename>' + key + '</filename>\n')
xml.write('\t<path>')
xml.write('path not record')
xml.write('\t</path>')
xml.write('\t<source>\n')
xml.write('\t\t<database>' + 'Unknown' + '</database>\n')
xml.write('\t</source>')
xml.write('\t<size>\n')
xml.write('\t\t<width>' + str(img_width) + '</width>\n')
xml.write('\t\t<height>' + str(img_height) + '</height>\n')
xml.write('\t\t<depth>' + str(img_depth) + '</depth>\n')
xml.write('\t</size>\n')
xml.write('\t\t<segmented>0</segmented>\n')
for i in range(len(label)):
xmin = str(left[i])
ymin = str(top[i])
xmax = str(left[i] + width[i])
ymax = str(top[i] + height[i])
label_obj= str(label[i])
xml.write('\t<object>\n')
xml.write('\t\t<name>' + label_obj+ '</name>\n')
xml.write('\t\t<pose>Unspecified</pose>\n')
xml.write('\t\t<truncated>0</truncated>\n')
xml.write('\t\t<difficult>0</difficult>\n')
xml.write('\t\t<bndbox>\n')
xml.write('\t\t\t<xmin>' + xmin + '</xmin>\n')
xml.write('\t\t\t<ymin>' + ymin + '</ymin>\n')
xml.write('\t\t\t<xmax>' + xmax + '</xmax>\n')
xml.write('\t\t\t<ymax>' + ymax + '</ymax>\n')
xml.write('\t\t</bndbox>\n')
xml.write('\t</object>\n')
xml.write('</annotation>')
xml.close()
print('json->xml Done.')
json_to_xml('./images/','./mchar.json','./xml/')
结果: