VOC数据格式下标注.xml文件filename及path属性更改

问题描述

在大家帮助下制作了voc格式数据集,由于一开始图片命名采用了中文括号,担心后续训练报错(反正就是不满意就对啦,强迫症患者必须要保证图片名称规范且连号),就对xml文件和jpg格式图片进行了批量改名,具体见该专栏下另一篇文章。改名成功之后,发现xml文件内filename和path属性与文件名对不上了(呜呜呜…太难了),具体问题见下图吧!

							改名成功前后问题描述

改名成功前后图
在这里插入图片描述

解决办法

直接上代码,目录结构及修改结果如图
在这里插入图片描述

# coding=utf-8
# 文件目录结构如下,需要注意两个文件夹下文件名称必须要对应
# ——————————————————————————
# |--annotations
# |----1.xml
# |----2.xml
# |----需要修改的xml文件
# |--images
# |----1.jpg
# |----2.jpg
# |----与xml文件对应的图片
# ——————————————————————————
# 适用范围:①voc数据格式;②请他人帮你标注数据,做整合时希望xml文件中path与训练路径一致,以防出错
# ③昨晚标注后才发现图片命名不规范不连续,更改图片名和标签名,此时xml中filename和图片名称不对应
# ④亲测③问题存在时,voc转coco数据格式时,filename问题会导致coco数据集有问题
import os
import xml.dom.minidom

file_path = "D:/woyaobiye/data/xml_path_test/annotations"       # 修改为上述xml文件所在路径
img_path = "D:/woyaobiye/data/xml_path_test/images"             # 修改为上述图片所在路径
xml_files = os.listdir(file_path)       # xml文件名列表
img_files = os.listdir(img_path)        # 图片文件名列表,由于xml文件以及图片名称(图片均为.jpg)后缀一一对应,因此列表内也一一对应
                                        # 必须承认这样会存在问题,比如图片后缀不一样等等肯定会bug,遇到问题再修改吧
for i, xmlFile in enumerate(xml_files):     # 遍历xml文件夹
    if not os.path.isdir(xmlFile):          # 不是文件夹,打开xml文件
        print("\n",xmlFile)
        dom = xml.dom.minidom.parse(os.path.join(file_path, xmlFile))   # 读取xml文件,送入dom解析
        root = dom.documentElement                                      # 返回整个xml文档的内容
        original_path = root.getElementsByTagName('path')               # 根据标签名称获取path节点
        p0 = original_path[0]       # 上述返回值是一个list,观察xml文件发现path和filename长度均为1
        # print(p0)                 # p0其实是机器编码,不是具体文本
        path0 = p0.firstChild.data  # 使用data是将其具体的文本内容提取出来
        # print(path0)
        original_filename = root.getElementsByTagName('filename')  # 根据标签名称获取filename节点
        f0 = original_filename[0]   # 同上
        print(f0)
        fn0 = f0.firstChild.data   # 同上

        img_name = img_files[i]     # 获取和xml对应的图片名称
        modify_path = img_path + "/" + img_name       # 修改path
        modify_filename = img_name                    # 修改filename
        # print(modify_path)
        p0.firstChild.data = modify_path              # 把修改后的path值赋给path的机器码
        f0.firstChild.data = modify_filename         # 把修改后的filename值赋给path的机器码

        with open(os.path.join(file_path, xmlFile), 'w') as fh:
            dom.writexml(fh)
            print('修改path和filename DONE!')
  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值