数据来源为https://cg.cs.tsinghua.edu.cn/traffic-sign/
标注格式为json,使用json.load解析后为字典格式。
pascal_voc xml格式为:
<?xml version="1.0" encoding="utf-8"?>
<annotation>
<folder>VOC2007</folder>
<filename>36319.jpg</filename>
<path>/Users/chenhonghu/Downloads/data/image/36319.jpg</path>
<source>
<database>Unknown</database>
</source>
<size>
<width>2048</width>
<height>2048</height>
<depth>3</depth>
</size>
<segmented>0</segmented>
<object>
<name>pne</name>
<pose>Unspecified</pose>
<truncated>1</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>1140.0</xmin>
<ymin>906.0</ymin>
<xmax>1164.0</xmax>
<ymax>930.0</ymax>
</bndbox>
</object>
<object>
<name>i4</name>
<pose>Unspecified</pose>
<truncated>1</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>1273.0</xmin>
<ymin>912.0</ymin>
<xmax>1296.0</xmax>
<ymax>934.0</ymax>
</bndbox>
</object>
<object>
<name>pl70</name>
<pose>Unspecified</pose>
<truncated>1</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>1440.0</xmin>
<ymin>929.0</ymin>
<xmax>1457.0</xmax>
<ymax>949.0</ymax>
</bndbox>
</object>
<object>
<name>pl50</name>
<pose>Unspecified</pose>
<truncated>1</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>1460.0</xmin>
<ymin>933.0</ymin>
<xmax>1476.0</xmax>
<ymax>950.0</ymax>
</bndbox>
</object>
<object>
<name>pn</name>
<pose>Unspecified</pose>
<truncated>1</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>1478.0</xmin>
<ymin>932.0</ymin>
<xmax>1497.0</xmax>
<ymax>953.0</ymax>
</bndbox>
</object>
<object>
<name>pl40</name>
<pose>Unspecified</pose>
<truncated>1</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>1513.0</xmin>
<ymin>932.0</ymin>
<xmax>1529.0</xmax>
<ymax>951.0</ymax>
</bndbox>
</object>
<object>
<name>io</name>
<pose>Unspecified</pose>
<truncated>1</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>1529.0</xmin>
<ymin>935.0</ymin>
<xmax>1546.0</xmax>
<ymax>954.0</ymax>
</bndbox>
</object>
<object>
<name>i2</name>
<pose>Unspecified</pose>
<truncated>1</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>1550.0</xmin>
<ymin>933.0</ymin>
<xmax>1567.0</xmax>
<ymax>952.0</ymax>
</bndbox>
</object>
<object>
<name>p10</name>
<pose>Unspecified</pose>
<truncated>1</truncated>
<difficult>0</difficult>
<bndbox>
<xmin>1496.0</xmin>
<ymin>992.0</ymin>
<xmax>1509.0</xmax>
<ymax>1006.0</ymax>
</bndbox>
</object>
</annotation>
转化代码:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat Oct 12 20:55:14 2019
@author: chenhonghu
"""
from xml.dom.minidom import Document
import os
import os.path
from PIL import Image
import cv2
import json
#file='/Users/chenhonghu/Downloads/data/annotations.json'
#data2 = json.loads(open('/Users/chenhonghu/Downloads/data/annotations.json'))
#print(data2)
xml_path='/Users/chenhonghu/Downloads/data/xml/'
img_path='/Users/chenhonghu/Downloads/data/image/'
#train_path='/Users/chenhonghu/Downloads/data/train/'
#test_path='/Users/chenhonghu/Downloads/data/test/'
train_list=os.listdir(train_path)
test_list=os.listdir(test_path)
with open("/Users/chenhonghu/Downloads/data/annotations.json",'r')as load_f:
item=json.load(load_f)
for key1 in item['imgs']:
# print(key1)
num=key1
doc=Document()
annotation=doc.createElement('annotation')
doc.appendChild(annotation)
folder=doc.createElement('folder')
annotation.appendChild(folder)
folder_txt=doc.createTextNode('VOC2007')
folder.appendChild(folder_txt)
imgname=key1+'.jpg'
# print(imgname)
filename=doc.createElement('filename')
annotation.appendChild(filename)
filename_txt=doc.createTextNode(imgname)
filename.appendChild(filename_txt)
imgpath=img_path+imgname
path=doc.createElement('path')
annotation.appendChild(path)
path_txt=doc.createTextNode(imgpath)
path.appendChild(path_txt)
source=doc.createElement('source')
annotation.appendChild(source)
database=doc.createElement('database')
source.appendChild(database)
database_txt=doc.createTextNode('Unknown')
database.appendChild(database_txt)
size=doc.createElement('size')
annotation.appendChild(size)
width=doc.createElement('width')
size.appendChild(width)
width_txt=doc.createTextNode("2048")
width.appendChild(width_txt)
height=doc.createElement('height')
size.appendChild(height)
height_txt=doc.createTextNode("2048")
height.appendChild(height_txt)
depth=doc.createElement('depth')
size.appendChild(depth)
depth_txt=doc.createTextNode("3")
depth.appendChild(depth_txt)
segmented=doc.createElement('segmented')
annotation.appendChild(segmented)
segmented_txt=doc.createTextNode("0")
segmented.appendChild(segmented_txt)
#for key2 in item['imgs'][key1]:
# print(key2)
# count=0
for key3 in item['imgs'][key1]['objects']:
#print(key3)
#for key4 in key3:
#print(key4)#bbox,ellipse_org,ellipse,category
#print(key3[key4])
#if key4=='category':
category=key3['category']
#if key4=='bbox':
# print(key3[key4]['xmin'])
xmin=key3['bbox']['xmin']
ymin=key3['bbox']['ymin']
xmax=key3['bbox']['xmax']
ymax=key3['bbox']['ymax']
objectnode=doc.createElement('object')
annotation.appendChild(objectnode)
namenode=doc.createElement('name')
objectnode.appendChild(namenode)
namenode_txt=doc.createTextNode(category)
namenode.appendChild(namenode_txt)
posenode=doc.createElement('pose')
objectnode.appendChild(posenode)
pose_txt=doc.createTextNode('Unspecified')
posenode.appendChild(pose_txt)
truncated=doc.createElement('truncated')
objectnode.appendChild(truncated)
truncated_txt=doc.createTextNode("1")
truncated.appendChild(truncated_txt)
difficult=doc.createElement('difficult')
objectnode.appendChild(difficult)
difficult_txt=doc.createTextNode("0")
difficult.appendChild(difficult_txt)
bndbox=doc.createElement('bndbox')
objectnode.appendChild(bndbox)
xminnode=doc.createElement('xmin')
bndbox.appendChild(xminnode)
xmin_txt=doc.createTextNode(str(xmin))
xminnode.appendChild(xmin_txt)
yminnode=doc.createElement('ymin')
bndbox.appendChild(yminnode)
ymin_txt=doc.createTextNode(str(ymin))
yminnode.appendChild(ymin_txt)
xmaxnode=doc.createElement('xmax')
bndbox.appendChild(xmaxnode)
xmax_txt=doc.createTextNode(str(xmax))
xmaxnode.appendChild(xmax_txt)
ymaxnode=doc.createElement('ymax')
bndbox.appendChild(ymaxnode)
ymax_txt=doc.createTextNode(str(ymax))
ymaxnode.appendChild(ymax_txt)
# print(img_name)
savename=os.path.join(xml_path, imgname.split('.')[0]+'.xml')
#print(savename)
with open(savename,'wb') as f:
f.write(doc.toprettyxml(indent='\t',encoding='utf-8'))
f.close()