xml标注文件转txt及对txt文件进行标签转换以及归一化

xml改txt

import os
import xml.etree.ElementTree as ET

def xml_to_txt(xml_folder, txt_folder):
    # 确保输出文本文件夹存在,如果不存在则创建
    if not os.path.exists(txt_folder):
        os.makedirs(txt_folder)

    # 遍历 XML 文件夹中的每个文件
    for filename in os.listdir(xml_folder):
        if filename.endswith('.xml'):
            xml_file = os.path.join(xml_folder, filename)
            txt_file = os.path.join(txt_folder, os.path.splitext(filename)[0] + '.txt')
            convert_single_xml_to_txt(xml_file, txt_file)

def convert_single_xml_to_txt(xml_file, txt_file):
    # 解析 XML 文件
    tree = ET.parse(xml_file)
    root = tree.getroot()

    # 打开文本文件以写入数据
    with open(txt_file, 'w') as f:
        # 遍历 XML 标签,提取文本信息并写入文本文件
        for obj in root.findall('object'):
            class_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)

            # 将信息写入文本文件
            f.write(f'{class_name} {xmin} {ymin} {xmax} {ymax}\n')

# 指定 XML 文件夹和要写入的文本文件夹
xml_folder = 'D:\\pp\\py\\chepai\\bitvehicle\\annotations'
txt_folder = 'D:\\pp\\py\\chepai\\bz'

# 调用函数将 XML 文件夹中的所有 XML 文件转换为文本文件
xml_to_txt(xml_folder, txt_folder)

对txt文件进行标签更改与归一化

import os
import cv2
def normalize_labels(input_folder, output_folder, img):
    # 确保输出文件夹存在,如果不存在则创建
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)

    # 遍历输入文件夹中的每个标签文件
    for filename,img_a in zip(os.listdir(input_folder),os.listdir(img)):
        if filename.endswith('.txt'):
            input_file_path = os.path.join(input_folder, filename)
            output_file_path = os.path.join(output_folder, filename)
            
            img_cv = cv2.imread('D:\\pp\\py\\chepai\\train\\{}'.format(img_a))
            image_width = img_cv.shape[1]
            image_height = img_cv.shape[0]
            # 打开原始标签文件进行读取
            with open(input_file_path, 'r') as file:
                lines = file.readlines()

            # 归一化坐标并写入新文件
            with open(output_file_path, 'w') as new_file:
                for line in lines:
                    # 解析每行数据
                    parts = line.strip().split(' ')
                    class_id = parts[0]  
                    # 类别索引,直接使用字符串
                    #按需更改自己的类别
                    if class_id == 'Bus':
                        class_id = '0'
                    if class_id == 'Microbus':
                        class_id = '1'
                    if class_id == 'Minivan':
                        class_id = '2'
                    if class_id == 'Sedan':
                        class_id = '3'
                    if class_id == 'SUV':
                        class_id = '4'
                    if class_id == 'Truck':
                        class_id = '5'
                    x_center, y_center, width, height = list(map(float, parts[1:5]))  # 浮点数坐标

                    # 归一化坐标
                    normalized_x_center = x_center / image_width
                    normalized_y_center = y_center / image_height
                    normalized_width = width / image_width
                    normalized_height = height / image_height

                    # 写入归一化后的坐标,类别索引保持为字符串
                    new_file.write(
                        f"{class_id} {normalized_x_center} {normalized_y_center} {normalized_width} {normalized_height}\n")

            print(f"Normalization completed for {filename}")

# 指定输入标签文件夹、输出标签文件夹以及图像的宽度和高度
input_folder = 'D:\\pp\\py\\chepai\\bz'
output_folder = 'D:\\pp\\py\\chepai\\temp'
#解决归一化图片尺寸不一样的问题
img = 'D:\\pp\\py\\chepai\\train'


# 调用函数批量归一化标签文件
normalize_labels(input_folder, output_folder,img)

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Python中的ElementTree库读取XML文件,并将其中的标注信息转换yolov5需要的格式,然后将转换后的结果保存到txt文件中。 下面是一个示例代码: ```python import xml.etree.ElementTree as ET # 定义类别标签和对应的数字编码 CLASS_LABELS = {'nomask': 0, 'mask': 1} def convert_annotation(xml_file, output_file): tree = ET.parse(xml_file) root = tree.getroot() with open(output_file, 'w') as f: for obj in root.iter('object'): cls_name = obj.find('name').text if cls_name not in CLASS_LABELS: continue cls_id = CLASS_LABELS[cls_name] bbox = obj.find('bndbox') xmin = float(bbox.find('xmin').text) xmax = float(bbox.find('xmax').text) ymin = float(bbox.find('ymin').text) ymax = float(bbox.find('ymax').text) # 计算归一化后的坐标 width = xmax - xmin height = ymax - ymin x_center = xmin + width / 2 y_center = ymin + height / 2 x_center /= float(root.find('size').find('width').text) y_center /= float(root.find('size').find('height').text) width /= float(root.find('size').find('width').text) height /= float(root.find('size').find('height').text) # 将结果保存到文件中 f.write(f"{cls_id} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}\n") ``` 上述代码中,`convert_annotation`函数的输入参数为XML文件路径和输出文件路径,输出文件中每行保存一条标注信息格式为`class_id x_center y_center width height`,其中`class_id`为类别编码,`x_center`和`y_center`为中心点的归一化坐标,`width`和`height`为归一化后的宽度和高度。 你只需要将对应的`xml_file`和`output_file`参数传入函数即可完成转换。注意,该函数只会处理`CLASS_LABELS`中定义的类别标签,其他标签会被忽略。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值