xml文件中类别数&xml和jpg文件名不一致

1. 解析xml

注意uft-8编码

from lxml import etree
import os


def parse_xml_to_dict(xml):
        """
        将xml文件解析成字典形式, 参考tensorflow的recursive_parse_xml_to_dict
        Args:
            xml: xml tree obtained by parsing XML file contents using lxml.etree

        Returns:
            Python dictionary holding XML contents.
        """

        if len(xml) == 0:  # 遍历到底层,直接返回tag对应的信息
            return {xml.tag: xml.text}

        result = {}
        for child in xml:
            child_result = parse_xml_to_dict(child)  # 递归遍历标签信息
            if child.tag != 'object':
                result[child.tag] = child_result[child.tag]
            else:
                if child.tag not in result:  # 因为object可能有多个,所以需要放入列表里
                    result[child.tag] = []
                result[child.tag].append(child_result[child.tag])
        return {xml.tag: result}


xml_folder = '/Data02/decoded_det_seg/det_img/xmls'
name_list = []
for file in os.listdir(xml_folder):
    if file.endswith('xml'):
        file_path = os.path.join(xml_folder, file)
        print(file_path)
        with open(file_path) as fid:
            xml_str = fid.read()
        xml_str = xml_str.encode('utf-8')  # ascii
        xml = etree.fromstring(xml_str)
        data = parse_xml_to_dict(xml)["annotation"]
        if 'object' in data.keys():
            for obj in data["object"]:
                name = obj['name']
                if name not in name_list:
                    name_list.append(name)

print(name_list)

2.xml和jpg名字不同

jpeg的文件名如下
在这里插入图片描述
截取的xml文件名如下
在这里插入图片描述
如上所示,一些jpg中的图片,并没有相应的标注文件,这是不利于训练过程的。

2.1 几行程序搞定匹配

将匹配成功的xml和jpg保存到新的路径下

import os
import shutil


# 原始路径
xml_path = r"F:\BaiduNetdiskDownload\VOCdevkit\VOC2007\Annotations"
jpg_path = r"F:\BaiduNetdiskDownload\VOCdevkit\VOC2007\JPEGImages"
# 保存路径
save_xml = r"F:\BaiduNetdiskDownload\VOCdevkit\VOC2007\labels"
save_jpg = r"F:\BaiduNetdiskDownload\VOCdevkit\VOC2007\images"

if not os.path.exists(save_xml):
    print("保存路径不存在,创建路径")
    os.mkdir(save_xml)
if not os.path.exists(save_jpg):
    os.mkdir(save_jpg)

xml_folder = os.listdir(xml_path)
# print(len(xml_folder))

jpg_folder = os.listdir(jpg_path)
# print(len(jpg_folder))

# 获取文件名,保存在列表中
xml_folder = os.listdir(xml_path)
jpg_folder = os.listdir(jpg_path)
# 取出xml和jpg文件名所有的前缀,保存在列表中,每个元素为str类型
xml_all = []
jpg_all = []
for i in range(len(xml_folder)):
    xml_all.append(xml_folder[i].split(".")[0])
for i in range(len(jpg_folder)):
    jpg_all.append(jpg_folder[i].split(".")[0])

# common_all找出xml和jpg中共同的前缀
common_all = []
for file in xml_all:
    if file in jpg_all:
        common_all.append(file)

# 将共同前缀中的文件,分别存储到新的文件夹中
for file in common_all:
    xml = os.path.join(xml_path, file+'.xml')
    jpg = os.path.join(jpg_path, file+ '.jpg')
    shutil.copy(xml, save_xml)
    shutil.copy(jpg, save_jpg)

最终结果

新的xml文件目录
在这里插入图片描述
新的jpg文件目录
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值