from lxml.etree import Element, SubElement, tostring
from xml.dom.minidom import parseString
import os
from PIL import Image
def make_xml(xmin_tuple, ymin_tuple, xmax_tuple, ymax_tuple, clname, image_name):
node_root = Element('annotation')
node_folder = SubElement(node_root, 'folder')
node_folder.text = 'VOC'
node_filename = SubElement(node_root, 'filename')
node_filename.text = image_name
node_object_num = SubElement(node_root, 'object_num')
node_object_num.text = str(len(xmin_tuple))
node_size = SubElement(node_root, 'size')
node_width = SubElement(node_size, 'width')
im = Image.open("images/" + image_name)
width, height = im.size
node_width.text = str(width)
node_height = SubElement(node_size, 'height')
node_height.text = str(height)
node_depth = SubElement(node_size, 'depth')
node_depth.text = '3'
for i in xrange(len(xmin_tuple)):
node_object = SubElement(node_root, 'object')
node_name = SubElement(node_object, 'name')
node_name.text = str(clname[i])
node_difficult = SubElement(node_object, 'difficult')
node_difficult.text = '0'
node_bndbox = SubElement(node_object, 'bndbox')
node_xmin = SubElement(node_bndbox, 'xmin')
node_xmin.text = str(xmin_tuple[i])
node_ymin = SubElement(node_bndbox, 'ymin')
node_ymin.text = str(ymin_tuple[i])
node_xmax = SubElement(node_bndbox, 'xmax')
node_xmax.text = str(xmax_tuple[i])
node_ymax = SubElement(node_bndbox, 'ymax')
node_ymax.text = str(ymax_tuple[i])
xml = tostring(node_root, pretty_print = True)
dom = parseString(xml)
return dom
save_xml_path = "Annotations/" #生成的.xml保存路径
f = open("pascla_voc.txt") #所有的bbox数据,将同一幅图片的bbox放在一起
result = []
n = 0
for line in f.readlines():
result.append(line.split(' '))
n = n + 1
img_nameinit = result[0][0]
xmin = []
ymin = []
xmax = []
ymax = []
clname = []
for i in range(0, n):
if img_nameinit == result[i][0]:
clname.append(result[i][1])
xmin.append(result[i][2])
ymin.append(result[i][3])
xmax.append(result[i][4])
ymax.append(result[i][5])
else:
dom = make_xml(xmin, ymin, xmax, ymax, clname, img_nameinit)
por = os.path.splitext(img_nameinit)
xml_name = os.path.join(save_xml_path, por[0] + '.xml')
with open(xml_name, 'w') as f:
f.write(dom.toprettyxml(indent='\t', encoding='utf-8'))
xmin = []
ymin = []
xmax = []
ymax = []
clname = []
img_nameinit = result[i][0]
print(img_nameinit)
dom = make_xml(xmin, ymin, xmax, ymax, clname, img_nameinit)
por = os.path.splitext(img_nameinit)
xml_name = os.path.join(save_xml_path, por[0] + '.xml')
with open(xml_name, 'w') as f:
f.write(dom.toprettyxml(indent='\t', encoding='utf-8'))
#dom = make_xml(xmin_tuple, ymin_tuple, xmax_tuple, ymax_tuple, image_name)
#xml_name = os.path.join(save_xml_path, image_name + '.xml')
#with open(xml_name, 'w') as f:
#f.write(dom.toprettyxml(indent='\t', encoding='utf-8'))
pascal_voc.txt文件的格式是.txt,每一行为:
<图片名.jpg><空格><类别名称><空格><bbox_topleft_x><空格><bbox_topleft_y><空格><bbox_bottomright_x><空格><bbox_bottomright_y>,我的类别用数字表示的,也可以用字符串表示