json标注转为pascal_voc xml

数据来源为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()
                  
                  

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值