Python:目标检测中多个xml标签合并

新年快乐~

应用背景:

pascal_voc格式数据集采用的是xml超文本标记语义记录监督信息的。但是大型数据集的制作非一人之力可及。多人合作可能会涉及到针对同一张图片的不同xml标签合并。

适应:

目标检测中同一张图的多个xml标签,按照要求合并到一起,非直接拼接合并。

这里一个特点是,不管要把多少个文件夹里的xml合并,只需要把这些文件夹统一放到一个列表dir里面就可以。

然后实际上还是根据每一张图片,在这些文件夹里面检索有没有xml标签,所以不会遗漏。

代码如下:

# -*- coding: utf-8 -*-
'''
@ 南石北岸生
@ 2019.1.8
'''  
import os  

def readxml(xmlpath):
  lines=[]
  f=open(xmlpath,'r')  
  for line in f:
      lines.append(line)
  f.close()
  return lines
  
def insert_in_tail(list1,list2):
  list3=[]
  tail=list1[-1]
  list1=list1[0:-1]
  list1.extend(list2)
  list1.append(tail)
  return list1
  
if __name__ == "__main__":
  image_dir = ''
  dir =  []
  save_path=''
  files_list=os.listdir(image_dir)
  file_names=[]

  for line in files_list:
      line=line.replace('jpg','')
      file_names.append(line)
  for filename in file_names:
    flag=0
    list1=[]
    for d in dir:
        filedir=d+filename+"xml"
        print("正在处理文件:{}".format(filedir))
        if not os.path.exists(filedir):
           continue
        else:
           if flag==0:
              flag=1
              list1=readxml(filedir)
           else:
              list2=readxml(filedir)
              list1=insert_in_tail(list1,list2[13:-1])
              del list2
    if len(list1)!=0:
      fo=open(save_path+filename+"xml",'w')
      txt=''.join(list1)
      fo.write(txt)
      fo.close()
    else:
      continue

参数:

  image_dir = ' '      #图片集文件夹路径
  dir =  []                #多个人的xml标签集合文件夹路径集合列表
  save_path=' '       #合并之后的保存路径

如,读取00文件夹里面的图片,按图片名搜索文件夹01、02、03三个文件夹里面的该图像xml标签,进行合并,并输出到save_path路径下,得到合并后的xml。

扫描二维码关注公众号,回复: 6233000 查看本文章

xml可以用xml.etree.ElementTree解析,进行更结构化的操作,但是我觉得简单的合并,用最基本的语法就能做好,所以没有用解析xml并修改结构的方式来得到合并的xml,而是用了简单的文本处理方式。

猜你喜欢

转载自blog.csdn.net/gusui7202/article/details/86073305