11、修改voc数据集中xml文件内容(path)、修改图像文件名

1、修改voc数据集中xml文件内容(path)、修改图像文件名

import xml.etree.ElementTree as ET
import os
import argparse
import cv2
class ModifyXml(object):
    '''
    修改mxl文件内容
    '''
    def __init__(self,xml_path,modify_tags,save_xml_path,rewrite_txt):
        '''
        xml_path:xml地址
        modify_tags:需要修改内容所在的标签
        save_xml_path:新的xml保存地址
        rewrite_txt:新的写入内容
        '''
        self.xml_path = xml_path
        self.modify_tags = modify_tags
        self.save_xml_path = save_xml_path
        self.rewrite_txt = rewrite_txt
    def readxml(self,new_path):
        doc = ET.parse(new_path)
        root = doc.getroot()
        sub1 = root.find(self.modify_tags)  # 找到filename标签,
        #xml文件中图像名 602.jpg
        new_images_name = sub1.text.split('/')[-1]
        #新的替换文本:/home/chenzhenyu/桌面/证件照片检测/my_data/JPEGImages/602.jpg
        replace_text = self.rewrite_txt + '/'+new_images_name
        #标签内容修改
        sub1.text = replace_text
        #最终保存的xml文件名及路径
        finally_save_new_xml_path=str(self.save_xml_path)+'/'+new_images_name.split('.')[0]+'.xml'
        print("当前保存:",finally_save_new_xml_path)
        #保存
        doc.write(finally_save_new_xml_path,'utf-8')  # 保存修改
        return 0
    def save_xml(self):
        if os.path.isdir(self.xml_path):
            for i in os.listdir(self.xml_path):
                new_path = os.path.join(self.xml_path,i)
                print("new_path:",new_path)
                self.readxml(new_path)
            print("..........转化完成..........")
        elif os.path.isfile(self.xml_path):
            self.readxml(self.xml_path)
        return 0
def excute_modify():
    '''
    执行修改xml内容主函数
    '''
    rootpath = os.getcwd()
    parser = argparse.ArgumentParser()
    parser.add_argument('--xml_path', type=str, default=os.path.join(rootpath, 'VOCdevkit/VOC2007/Annotations'), help='xml路径')
    parser.add_argument('--modify_tags', type=str, default='path', help='model path(s)')
    parser.add_argument('--save_xml_path', type=str, default=os.path.join(rootpath, 'VOCdevkit/VOC2007/newAnnotations'), help='新的xml保存地址')
    parser.add_argument('--rewrite_txt',type=str, default=os.path.join(rootpath,'VOCdevkit/VOC2007/JPEGImages'), help='新的写入内容')
    opt = parser.parse_args()

    os.makedirs(opt.save_xml_path,exist_ok=True)
    print(opt)
    ab = ModifyXml(opt.xml_path, opt.modify_tags, opt.save_xml_path, opt.rewrite_txt)
    ab.save_xml()
    return 0

class ReName_file(object):
    '''
    修改图像文件名,使图像后缀保持一致,避免麻烦
    '''
    def __init__(self,file_name):
        self.file_name = file_name
    def re_names_images_name(self):
        file_list = os.listdir(self.file_name)
        os.makedirs(self.file_name.replace('JPEGImages','JPEGImages'),exist_ok=True)
        counter_images_number = 0
        for i in file_list:
            counter_images_number += 1
            img = cv2.imread(self.file_name+'/'+str(i))
            # print(img.shape)
            print(self.file_name.replace('JPEGImages','JPEGImages')+'/'+str(i.split('.')[0])+'.jpg')
            cv2.imwrite(self.file_name.replace('JPEGImages','JPEGImages')+'/'+str(i.split('.')[0])+'.jpg',img)
        print("该目录下总共有图像文件:%s \n读取并重新命名成功的数量为:%s \n新生成的图像保存在:%s"
              %(len(file_list),counter_images_number,self.file_name.replace('JPEGImages','JPEGImages')))
def excute_ReName_file():
    '''
    修改图像名称的运行主函数
    '''
    root_path = os.getcwd()
    filename = os.path.join(root_path,'JPEGImages')
    print(filename)
    parser = argparse.ArgumentParser()
    parser.add_argument('--filename', type=str, default=filename, help='主路径')
    opt = parser.parse_args()
    abc = ReName_file(opt.filename)
    abc.re_names_images_name()

if __name__=='__main__':
    # excute_ReName_file()
    excute_modify()
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
VOC格式的XML文件包括对象的标注信息,可以使用以下代码将普通的XML文件转换为VOC格式的XML文件: ```python import os import xml.etree.ElementTree as ET def convert_voc(xml_path, save_path): # 打开xml文件 tree = ET.parse(xml_path) root = tree.getroot() # 创建XML文件 new_root = ET.Element('annotation') # 添加文件名 filename = ET.SubElement(new_root, 'filename') filename.text = os.path.basename(xml_path).split('.')[0] + '.jpg' # 添加标注信息 for obj in root.findall('object'): # 获取对象的名称 name = obj.find('name').text # 获取对象的位置信息 bbox = obj.find('bndbox') xmin = int(bbox.find('xmin').text) ymin = int(bbox.find('ymin').text) xmax = int(bbox.find('xmax').text) ymax = int(bbox.find('ymax').text) # 创建新的对象 new_obj = ET.SubElement(new_root, 'object') new_name = ET.SubElement(new_obj, 'name') new_name.text = name new_bbox = ET.SubElement(new_obj, 'bndbox') new_xmin = ET.SubElement(new_bbox, 'xmin') new_xmin.text = str(xmin) new_ymin = ET.SubElement(new_bbox, 'ymin') new_ymin.text = str(ymin) new_xmax = ET.SubElement(new_bbox, 'xmax') new_xmax.text = str(xmax) new_ymax = ET.SubElement(new_bbox, 'ymax') new_ymax.text = str(ymax) # 保存XML文件 new_tree = ET.ElementTree(new_root) new_tree.write(save_path) xml_path = 'example.xml' save_path = 'example_voc.xml' convert_voc(xml_path, save_path) ``` 在上面的代码中,`xml_path` 参数是需要转换的普通XML文件的路径,`save_path` 参数是转换后的VOC格式XML文件的保存路径。代码中,我们首先打开原始XML文件,然后创建一个新的XML文件,并将文件名添加到新的XML文件中。接下来,我们遍历原始XML文件中的每个对象,并获取对象的名称和位置信息。然后,我们将这些信息添加到新的XML文件中,并将其保存。注意,我们假设原始XML文件中的图像文件名与其对应的JPEG文件名相同,只是扩展名不同。因此,在保存VOC格式的XML文件时,我们将文件名更改为原始XML文件名的基础上加上'.jpg' 扩展名。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小树苗m

您的打赏,是我的动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值