voc格式标签读写操作
【摘要】
image.load(imagePath) imageShape = [image.height(), image.width(), 1 if image.isGrayscale() else 3] writer = PascalVocWriter...
-
image.load(imagePath)
-
imageShape = [image.height(), image.width(),
-
1 if image.isGrayscale() else 3]
-
writer = PascalVocWriter(imgFolderName, imgFileName,
-
imageShape, localImgPath=imagePath)
-
writer.verified = self.verified
-
-
for shape in shapes:
-
points = shape['points']
-
label = shape['label']
-
# Add Chris
-
difficult = int(shape['difficult'])
-
bndbox = LabelFile.convertPoints2BndBox(points)
-
writer.addBndBox(bndbox[0], bndbox[1], bndbox[2], bndbox[3], label, difficult)
-
-
writer.save(targetFile=filename)
pascal_voc.py文件:
-
#!/usr/bin/env python
-
# -*- coding: utf8 -*-
-
import sys
-
from xml.etree import ElementTree
-
from xml.etree.ElementTree import Element, SubElement
-
from lxml import etree
-
import codecs
-
-
XML_EXT = '.xml'
-
ENCODE_METHOD = 'utf-8'
-
-
class PascalVocWriter:
-
-
def __init__(self, foldername, filename, imgSize,databaseSrc='Unknown', localImgPath=None):
-
self.foldername = foldername
-
self.filename = filename
-
self.databaseSrc = databaseSrc
-
self.imgSize = imgSize
-
self.boxlist = []
-
self.localImgPath = localImgPath
-
self.verified = False
-
-
def prettify(self, elem):
-
"""
-
Return a pretty-printed XML string for the Element.
-
"""
-
rough_string = ElementTree.tostring(elem, 'utf8')
-
root = etree.fromstring(rough_string)
-
return etree.tostring(root, pretty_print=True, encoding=ENCODE_METHOD).replace(" ".encode(), "\t".encode())
-
# minidom does not support UTF-8
-
'''reparsed = minidom.parseString(rough_string)
-
return reparsed.toprettyxml(indent="\t", encoding=ENCODE_METHOD)'''
-
-
def genXML(self):
-
"""
-
Return XML root
-
"""
-
# Check conditions
-
if self.filename is None or \
-
self.foldername is None or \
-
self.imgSize is None:
-
return None
-
-
top = Element('annotation')
-
if self.verified:
-
top.set('verified', 'yes')
-
-
folder = SubElement(top, 'folder')
-
folder.text = self.foldername
-
-
filename = SubElement(top, 'filename')
-
filename.text = self.filename
-
-
if self.localImgPath is not None:
-
localImgPath = SubElement(top, 'path')
-
localImgPath.text = self.localImgPath
-
-
source = SubElement(top, 'source')
-
database = SubElement(source, 'database')
-
database.text = self.databaseSrc
-
-
size_part = SubElement(top, 'size')
-
width = SubElement(size_part, 'width')
-
height = SubElement(size_part, 'height')
-
depth = SubElement(size_part, 'depth')
-
width.text = str(self.imgSize[1])
-
height.text = str(self.imgSize[0])
-
if len(self.imgSize) == 3:
-
depth.text = str(self.imgSize[2])
-
else:
-
depth.text = '1'
-
-
segmented = SubElement(top, 'segmented')
-
segmented.text = '0'
-
return top
-
-
def addBndBox(self, xmin, ymin, xmax, ymax, name, difficult):
-
bndbox = {'xmin': xmin, 'ymin': ymin, 'xmax': xmax, 'ymax': ymax}
-
bndbox['name'] = name
-
bndbox['difficult'] = difficult
-
self.boxlist.append(bndbox)
-
-
def appendObjects(self, top):
-
for each_object in self.boxlist:
-
object_item = SubElement(top, 'object')
-
name = SubElement(object_item, 'name')
-
try:
-
name.text = unicode(each_object['name'])
-
except NameError:
-
# Py3: NameError: name 'unicode' is not defined
-
name.text = each_object['name']
-
pose = SubElement(object_item, 'pose')
-
pose.text = "Unspecified"
-
truncated = SubElement(object_item, 'truncated')
-
if int(each_object['ymax']) == int(self.imgSize[0]) or (int(each_object['ymin'])== 1):
-
truncated.text = "1" # max == height or min
-
elif (int(each_object['xmax'])==int(self.imgSize[1])) or (int(each_object['xmin'])== 1):
-
truncated.text = "1" # max == width or min
-
else:
-
truncated.text = "0"
-
difficult = SubElement(object_item, 'difficult')
-
difficult.text = str( bool(each_object['difficult']) & 1 )
-
bndbox = SubElement(object_item, 'bndbox')
-
xmin = SubElement(bndbox, 'xmin')
-
xmin.text = str(each_object['xmin'])
-
ymin = SubElement(bndbox, 'ymin')
-
ymin.text = str(each_object['ymin'])
-
xmax = SubElement(bndbox, 'xmax')
-
xmax.text = str(each_object['xmax'])
-
ymax = SubElement(bndbox, 'ymax')
-
ymax.text = str(each_object['ymax'])
-
-
def save(self, targetFile=None):
-
root = self.genXML()
-
self.appendObjects(root)
-
out_file = None
-
if targetFile is None:
-
out_file = codecs.open(
-
self.filename + XML_EXT, 'w', encoding=ENCODE_METHOD)
-
else:
-
out_file = codecs.open(targetFile, 'w', encoding=ENCODE_METHOD)
-
-
prettifyResult = self.prettify(root)
-
out_file.write(prettifyResult.decode('utf8'))
-
out_file.close()
-
-
-
class PascalVocReader:
-
-
def __init__(self, filepath):
-
# shapes type:
-
# [labbel, [(x1,y1), (x2,y2), (x3,y3), (x4,y4)], color, color, difficult]
-
self.shapes = []
-
self.filepath = filepath
-
self.verified = False
-
-
self.pic_width=0
-
self.pic_height=0
-
try:
-
self.parseXML()
-
except Exception as e:
-
print("parseXML error",e)
-
-
def getShapes(self):
-
return self.shapes
-
-
def addShape(self, label, bndbox, difficult):
-
xmin = int(float(bndbox.find('xmin').text))
-
ymin = int(float(bndbox.find('ymin').text))
-
xmax = int(float(bndbox.find('xmax').text))
-
ymax = int(float(bndbox.find('ymax').text))
-
points = [(xmin, ymin), (xmax, ymin), (xmax, ymax), (xmin, ymax)]
-
self.shapes.append((label, points, None, None, difficult))
-
-
def parseXML(self):
-
assert self.filepath.endswith(XML_EXT), "Unsupport file format"
-
parser = etree.XMLParser(encoding=ENCODE_METHOD)
-
xmltree = ElementTree.parse(self.filepath, parser=parser).getroot()
-
-
file_obj=xmltree.find('filename')
-
if file_obj is None:
-
filename="none"
-
else:
-
filename = file_obj.text
-
self.pic_width = xmltree.find('size').find('width').text
-
self.pic_height = xmltree.find('size').find('height').text
-
try:
-
verified = xmltree.attrib['verified']
-
if verified == 'yes':
-
self.verified = True
-
except KeyError:
-
self.verified = False
-
-
for object_iter in xmltree.findall('object'):
-
bndbox = object_iter.find("bndbox")
-
label = object_iter.find('name').text
-
# Add chris
-
difficult = False
-
if object_iter.find('difficult') is not None:
-
difficult = bool(int(object_iter.find('difficult').text))
-
self.addShape(label, bndbox, difficult)
-
return True
文章来源: blog.csdn.net,作者:AI视觉网奇,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/jacke121/article/details/121039256
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)