新年快乐~
应用背景:
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,而是用了简单的文本处理方式。