python代码xml转成txt(适用于YOLO版txt)

第一步:导包

import os
import xml.etree.ElementTree as ET

第二步:写入类名

# 定义类别名称和ID的对应关系(根据实际情况修改)
CLASS_MAPPING = {
    0: '类名',
    1: '类名',
    2: '类名'
}

第三步:两个路径,输入的文件夹路径和输出文件夹路径

# 定义输入和输出文件夹路径
input_folder = ''
output_folder = ''

第四步:如果没有输出文件夹就创建输出文件夹,有的话可以不写

# 创建输出文件夹(如果不存在)
os.makedirs(output_folder, exist_ok=True)

第五步:制作出yolo需要的边界框坐标

# 遍历所有XML文件并转换为TXT文件
for filename in os.listdir(input_folder):
    if not filename.endswith('.xml'):
        continue

    # 解析XML文件
    tree = ET.parse(os.path.join(input_folder, filename))
    root = tree.getroot()

    # 获取图像宽度和高度
    size = root.find('size')
    width = int(size.find('width').text)
    height = int(size.find('height').text)

    # 打开输出TXT文件
    txt_filename = os.path.splitext(filename)[0] + '.txt'
    with open(os.path.join(output_folder, txt_filename), 'w') as f:
        # 遍历所有对象
        for obj in root.findall('object'):
            # 获取类别名称和边界框坐标
            cls_name = obj.find('name').text
            cls_id = CLASS_MAPPING.get(cls_name)
            bbox = obj.find('bndbox')
            x_min = int(bbox.find('xmin').text)
            y_min = int(bbox.find('ymin').text)
            x_max = int(bbox.find('xmax').text)
            y_max = int(bbox.find('ymax').text)

            # 将边界框坐标转换为中心点坐标和宽高
            x = (x_min + x_max) / 2 / width
            y = (y_min + y_max) / 2 / height
            w = (x_max - x_min) / width
            h = (y_max - y_min) / height

            # 写入TXT文件
            f.write(f'{cls_id} {x:.6f} {y:.6f} {w:.6f} {h:.6f}\n')

完整代码如下:

import os
import xml.etree.ElementTree as ET

# 定义类别名称和ID的对应关系(根据实际情况修改)
CLASS_MAPPING = {
    0: '类名',
    1: '类名',
    2: '类名'
}

# 定义输入和输出文件夹路径
input_folder = ''
output_folder = ''

# 创建输出文件夹(如果不存在)
os.makedirs(output_folder, exist_ok=True)

# 遍历所有XML文件并转换为TXT文件
for filename in os.listdir(input_folder):
    if not filename.endswith('.xml'):
        continue

    # 解析XML文件
    tree = ET.parse(os.path.join(input_folder, filename))
    root = tree.getroot()

    # 获取图像宽度和高度
    size = root.find('size')
    width = int(size.find('width').text)
    height = int(size.find('height').text)

    # 打开输出TXT文件
    txt_filename = os.path.splitext(filename)[0] + '.txt'
    with open(os.path.join(output_folder, txt_filename), 'w') as f:
        # 遍历所有对象
        for obj in root.findall('object'):
            # 获取类别名称和边界框坐标
            cls_name = obj.find('name').text
            cls_id = CLASS_MAPPING.get(cls_name)
            bbox = obj.find('bndbox')
            x_min = int(bbox.find('xmin').text)
            y_min = int(bbox.find('ymin').text)
            x_max = int(bbox.find('xmax').text)
            y_max = int(bbox.find('ymax').text)

            # 将边界框坐标转换为中心点坐标和宽高
            x = (x_min + x_max) / 2 / width
            y = (y_min + y_max) / 2 / height
            w = (x_max - x_min) / width
            h = (y_max - y_min) / height

            # 写入TXT文件
            f.write(f'{cls_id} {x:.6f} {y:.6f} {w:.6f} {h:.6f}\n')

print('转换完成!')

你可能感兴趣的:(YOLO,python,xml,YOLO)