xml与python文件常用转换

文章目录

  • 一、Python批量修改图片文件名和xml文件信息
  • 二、python获取图像名称保存成一个txt文件
  • 三、xml格式的label转换为yolo-darknet版的label

一、Python批量修改图片文件名和xml文件信息

# coding:utf-8
from PIL import Image
import os.path
import glob
import xml.etree.ElementTree as ET
import xml.dom.minidom

i = 0
xmldir = r"D:\outputs"
imgsdir = r"D:\images"

for xmlfile in os.listdir(xmldir):
    xmlname = os.path.splitext(xmlfile)[0]
    for pngfile in os.listdir(imgsdir):
        pngname = os.path.splitext(pngfile)[0]
        if pngname == xmlname:
            # 修改图片文件名
            # 图片文件名修改前后的路径
            olddir = os.path.join(os.path.abspath(imgsdir), pngname + ".jpg")
            newdir = os.path.join(os.path.abspath(imgsdir), str(i) + ".jpg")
            os.rename(olddir, newdir)
            print(xmlfile, '----->', str(i) + '.png')
            # 修改filename结点属性
            # 读取xml文件
            dom = xml.dom.minidom.parse(os.path.join(xmldir, xmlfile))
            root = dom.documentElement

            # 获取标签对filename之间的值并赋予新值i
            root.getElementsByTagName('filename')[0].firstChild.data = str(i) + '.png'

            # 将修改后的xml文件保存
            # xml文件修改前后的路径
            old_xmldir = os.path.join(xmldir, xmlfile)
            new_xmldir = os.path.join(xmldir, str(i) + '.xml')
            # 打开并写入
            with open(old_xmldir, 'w') as fh:
                dom.writexml(fh)
            os.rename(old_xmldir, new_xmldir)
            i += 1
print('total number is ', i)

效果:
xml与python文件常用转换_第1张图片xml与python文件常用转换_第2张图片

二、python获取图像名称保存成一个txt文件

# -*- coding:utf-8 -*-
import sys
sys.path.append('D:\\Program files\\Anaconda\\libs')
import os #os:操作系统相关的信息模块
import random #导入随机函数
#存放原始图片地址
data_base_dir = "D:\images"
file_list = [] #建立列表,用于保存图片信息
#读取图片文件,并将图片地址、图片名和标签写到txt文件中
write_file_name = 'image.txt'
write_file = open(write_file_name, "w") #以只写方式打开write_file_name文件
for file in os.listdir(data_base_dir): #file为current_dir当前目录下图片名
    if file.endswith(".jpg"): #如果file以jpg结尾
        write_name = file #图片路径 + 图片名 + 标签
        file_list.append(write_name) #将write_name添加到file_list列表最后
    sorted(file_list) #将列表中所有元素随机排列
    number_of_lines = len(file_list) #列表中元素个数
    #将图片信息写入txt文件中,逐行写入
for current_line in range(number_of_lines):
    write_file.write(file_list[current_line][:-4] + '\n')#关闭文件

效果:
在这里插入图片描述

三、xml格式的label转换为yolo-darknet版的label

# 坐标xml转txt
import os
import xml.etree.ElementTree as ET

classes = ["play cards"]  # 输入名称,必须与xml标注名称一致

def convert(size, box):
    print(size, box)
    dw = 1. / size[0]
    dh = 1. / size[1]
    x = (box[0] + box[1]) / 2.0
    y = (box[2] + box[3]) / 2.0
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return (x, y, w, h)


def convert_annotation(image_id):
    print(image_id)
    in_file = open(r'./data/Annotations/%s.xml' % (image_id), 'rb')  # 读取xml文件路径

    out_file = open('./data/labels/%s.txt' % (image_id), 'w')  # 需要保存的txt格式文件路径
    tree = ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)

    for obj in root.iter('object'):
        cls = obj.find('name').text
        if cls not in classes:  # 检索xml中的名称
            continue
        cls_id = classes.index(cls)
        xmlbox = obj.find('bndbox')
        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
             float(xmlbox.find('ymax').text))
        bb = convert((w, h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')


image_ids_train = open('./ImageXML.txt').read().strip().split()  # 读取xml文件名索引

for image_id in image_ids_train:
    print(image_id)
    convert_annotation(image_id)

你可能感兴趣的:(python)