• 【XML文件数据预处理】获取xml文件中所有标签名称及数量||提取某个特定标签的数量||生成包含某个标签的图片索引txt并复制图片到指定文件夹


    目录

    1.获取xml文件中所有标签名称及数量

    2.提取某个特定标签的数量

    3.生成包含某个标签的图片索引txt并复制图片到指定文件夹


    1.获取xml文件中所有标签名称及数量

    【需求】自己标注的数据集,想要看看有多少个标签,并且想知道每一个标签的数量,又或者是需在标注完成后需要对标注好的XML文件校验,比如看看标签名有没有写错,都有啥标签名。

    代码如下,只需将【indir】字段换成自己需要统计的xml的文件夹,随后运行即可~~~

    1. import os
    2. from unicodedata import name
    3. import xml.etree.ElementTree as ET
    4. import glob
    5. def count_num(indir):
    6. # 提取xml文件列表
    7. os.chdir(indir)
    8. annotations = os.listdir('.')
    9. annotations = glob.glob(str(annotations) + '*.xml')
    10. dict = {} # 新建字典,用于存放各类标签名及其对应的数目
    11. for i, file in enumerate(annotations): # 遍历xml文件
    12. # actual parsing
    13. in_file = open(file, encoding='utf-8')
    14. tree = ET.parse(in_file)
    15. root = tree.getroot()
    16. # 遍历文件的所有标签
    17. for obj in root.iter('object'):
    18. name = obj.find('name').text
    19. if (name in dict.keys()):
    20. dict[name] += 1 # 如果标签不是第一次出现,则+1
    21. else:
    22. dict[name] = 1 # 如果标签是第一次出现,则将该标签名对应的value初始化为1
    23. KeyDict = sorted(dict)
    24. # 打印结果
    25. print("%d kind labels and %d labels in total" % (len(KeyDict), sum(dict.values())))
    26. print('labels:',KeyDict)
    27. print('\n')
    28. print("Label Name and it's number//各类标签的数量分别为:")
    29. for key in dict.keys():
    30. print(key + ': ' + str(dict[key]))
    31. print("\n总标签数目:{}个".format(sum(dict.values())))
    32. print('\t')
    33. print('检索完成!')
    34. indir = '/data_1T/xd1/VOCdevkit/VOC2012/Annotations/' # xml文件所在的目录
    35. count_num(indir) # 调用函数用来统计各类标签数目

    2.提取某个特定标签数量

    【需求】自己标注的数据集,想要看看某个标签有多少个,又或者是需在标注完成后需要对标注好的XML文件校验。

    代码如下,需将下面几个字段进行修改,随后运行即可~~~

    【test_dir】【train_dir】【trainval_dir】【xml_dir】【label】

    1. # -- coding: utf-8 --
    2. import pickle
    3. import os
    4. import glob
    5. from os import listdir, getcwd
    6. from os.path import join
    7. import xml.etree.ElementTree as ET # 导入xml模块
    8. test_dir = '/data_1T/xd1/VOCdevkit/VOC2012/ImageSets/Main/test.txt' #修改读取的test_dir文件路径
    9. train_dir = '/data_1T/xd1/VOCdevkit/VOC2012/ImageSets/Main/train.txt' #修改读取的train_dir文件路径
    10. trainval_dir = '/data_1T/xd1/VOCdevkit/VOC2012/ImageSets/Main/trainval.txt' #修改读取的trainval_dir文件路径
    11. xml_dir = '/data_1T/xd1/VOCdevkit/VOC2012/Annotations/' # 修改保存xml文件的路径
    12. read_xmlfile = trainval_dir #修改读取的xml文件索引路径
    13. xml_index = open(read_xmlfile).readlines()
    14. print('【{}】中XML文件的数量为'.format(read_xmlfile),len(xml_index),'个') # 计算测试集的xml文件的数量
    15. label = 'metal' #修改检索指定标签的名字
    16. nums = 0
    17. c = 0
    18. for i in range(len(xml_index)):
    19. index = xml_index[i].strip('\n') # 截取xml文件名
    20. # print(xml_dir+index+'.xml')
    21. xml_file = open(xml_dir + index + '.xml', encoding="utf-8")
    22. xml = ET.parse(xml_file)
    23. for name in xml.iter('object'):
    24. nums = nums + 1
    25. if name.find("name").text == label: # 按标注的标签名进行统计
    26. c = c + 1
    27. xml_file.close()
    28. print('标签为',label,'的个数:', c)
    29. print('\t')
    30. print('检索完成!')

    3.生成包含某个标签的图片索引txt并复制图片到指定文件夹

    【需求】经过上述步骤,发现自己标注的数据集有个标签是标注错的,想自己看下是那个文件的错误,又或者自己想把它删除,下面代码可以解决!!!

    代码如下,需将下面几个字段进行修改,随后运行即可~~~

    【test_dir】【train_dir】【trainval_dir】【xml_dir】【label】

    1. # -- coding: utf-8 --
    2. import xml.etree.ElementTree as ET # 导入xml模块
    3. import os
    4. test_dir = '/data_1T/xd1/VOCdevkit/VOC2012/ImageSets/Main/test.txt' # 修改读取的test_dir文件路径
    5. train_dir = '/data_1T/xd1/VOCdevkit/VOC2012/ImageSets/Main/train.txt' # 修改读取的train_dir文件路径
    6. trainval_dir = '/data_1T/xd1/VOCdevkit/VOC2012/ImageSets/Main/trainval.txt' # 修改读取的trainval_dir文件路径
    7. xml_dir = '/data_1T/xd1/VOCdevkit/VOC2012/Annotations/' # 修改保存xml文件的路径
    8. read_xmlfile = trainval_dir # 修改读取的xml文件索引路径
    9. xml_index = open(read_xmlfile).readlines()
    10. save_file = "./" # 保存包含指定标签的图片的索引文件txt
    11. if not os.path.exists(save_file):
    12. os.makedirs(save_file)
    13. label = 'd' #修改检索指定标签的名字
    14. fsave = open(save_file + "/label【{}】_imgpath.txt".format(label), "w", encoding="utf-8")\
    15. for i in range(len(xml_index)):
    16. index = xml_index[i].strip('\n') # 截取xml文件名
    17. # print(xml_dir+index+'.xml')
    18. xml_file = open(xml_dir + index + '.xml', encoding="utf-8")
    19. xml = ET.parse(xml_file)
    20. for path in xml.iter('annotation'):
    21. for name in path.iter('object'):
    22. if name.find("name").text == label:
    23. img_path = path.find('path').text.split("\\")[-1]
    24. fsave.write(img_path + '\n')
    25. print("开始生成包括label为【{}】的图片索引文件!".format(label))
    26. print("生成结束//extract label success!")

     生成的指定标签图片索引txt为:

    【需求】那么,找到文件是什么,怎么把这些图片提取出来呢?

    下面代码帮你解决!

    代码如下,需将下面几个字段进行修改,随后运行即可复制图片到指定文件夹~~~

    【path】【save_img_path】【read_label_file】

    1. # -- coding: utf-8 --
    2. import os, shutil
    3. path = '/data_1T/xd1/VOCdevkit/VOC2012//JPEGImages/' #原数据集图片文件夹
    4. img_path = os.listdir(path)
    5. save_img_path = './mail_box_img/' #存放提取出来的图片文件夹
    6. if not os.path.exists(save_img_path):
    7. os.makedirs(save_img_path)
    8. read_label_file = './label【d】_imgpath.txt' #上一步生成的包含指定标签的txt索引文档
    9. f = open(read_label_file, "r")
    10. while True:
    11. line = f.readline()
    12. for img in img_path:
    13. if img.split('.')[0] == line.split('.')[0]:
    14. print('包含指定label的图片为:',img)
    15. shutil.copy(path + img, save_img_path + img)
    16. if not line:
    17. break

     

     

     

    生成的图片文件夹为:

      

    好了,大功告成,完结撒花!

    欢迎关注、点赞、收藏、评论、分享给好友,一起学习有趣的新知识!!! 

  • 相关阅读:
    一个依赖解决 Spring Boot 反爬虫,防止接口盗刷
    嘉华股份上交所上市:市值25亿 一年采购8亿元非转基因大豆
    【HTML】通过焦点,获取部分上下文内容
    病理图像反卷积
    vue2和vue3中 ref/refs 使用示例
    【Linux】——初识程序地址空间
    [附源码]计算机毕业设计疫情防控管理系统Springboot程序
    Apache 部署配置
    计算机毕业设计springboot+vue基本安卓/微信小程序的驾校考试预约系统 uniapp
    ROS2在RVIZ2中加载机器人urdf模型
  • 原文地址:https://blog.csdn.net/Thebest_jack/article/details/127401607