voc格式标签读写操作

举报
风吹稻花香 发表于 2021/10/29 22:46:41 2021/10/29
1k+ 0 0
【摘要】 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

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。