首页 > 其他分享 >YOLO目标检测—XML标签文件与TXT标签文件相互转换

YOLO目标检测—XML标签文件与TXT标签文件相互转换

时间:2024-12-23 14:43:27浏览次数:4  
标签:XML 文件 标签 image height file ET path txt

XML标签文件转换为TXT标签文件

import os
import xml.etree.ElementTree as ET

# 类别编号和名称的映射
class_mapping = {       # 替换为自己的类别编号和名称映射
    'person': '0',
    'car': '1',
    'bike': '2'
}

# 更新后的源文件夹和目标文件夹路径
source_folder = r'F:\data\xml'      # 替换为需要转换为txt的xml文件的路径
target_folder = r'F:\data\txt'      # 替换为txt文件的保存路径

# 确保目标文件夹存在
os.makedirs(target_folder, exist_ok=True)

# 初始化图像宽度和高度变量
image_width = 0
image_height = 0

# 遍历源文件夹中的所有XML文件
for xml_file in os.listdir(source_folder):
    if xml_file.endswith('.xml'):
        # 构建完整的文件路径
        xml_path = os.path.join(source_folder, xml_file)
        
        # 解析XML文件
        tree = ET.parse(xml_path)
        root = tree.getroot()
        
        # 获取图像尺寸
        size = root.find('size')
        if size is not None:
            width = int(size.find('width').text)
            height = int(size.find('height').text)
            # 更新图像宽度和高度
            image_width = max(image_width, width)
            image_height = max(image_height, height)
        
        # 创建TXT文件名
        txt_file_name = xml_file.replace('.xml', '.txt')
        txt_file_path = os.path.join(target_folder, txt_file_name)
        
        # 写入TXT文件
        with open(txt_file_path, 'w') as txt_file:
            # 遍历所有对象
            for obj in root.findall('object'):
                # 获取类别编号
                name = obj.find('name').text
                category_id = class_mapping.get(name, None)
                if category_id is None:
                    continue  # 如果类别名称不在映射中,则跳过
                
                # 获取边界框坐标
                bndbox = obj.find('bndbox')
                xmin = float(bndbox.find('xmin').text)
                ymin = float(bndbox.find('ymin').text)
                xmax = float(bndbox.find('xmax').text)
                ymax = float(bndbox.find('ymax').text)
                
                # 计算中心坐标 (x_center, y_center) 和宽高 (width, height)
                x_center = (xmin + xmax) / 2
                y_center = (ymin + ymax) / 2
                width = xmax - xmin
                height = ymax - ymin
                
                # 归一化中心坐标和宽高
                normalized_x_center = x_center / image_width
                normalized_y_center = y_center / image_height
                normalized_width = width / image_width
                normalized_height = height / image_height
                
                # 写入对象信息,格式为类别编号 x_center y_center width height
                txt_file.write(f'{category_id} {normalized_x_center} {normalized_y_center} {normalized_width} {normalized_height}\n')

## 打印完成信息
print('Conversion from XML to TXT completed.')

TXT标签文件转换为XML标签文件

import os
import xml.etree.ElementTree as ET
from PIL import Image

# 类别编号和名称的映射
class_mapping = {       # 替换为自己的类别编号和名称的映射
    '0': 'person',
    '1': 'car',
    '2': 'bike'
}

# 源文件夹和目标文件夹路径
source_folder = r'F:\data\txt'      # 替换为存放txt标签的文件夹路径
target_folder = r'F:\data\xml'      # 替换为保存xml文件的文件夹路径
image_folder = r'F:\data\images'    # 替换为存放图片的文件夹路径

# 确保目标文件夹存在
os.makedirs(target_folder, exist_ok=True)

# 遍历源文件夹中的所有TXT文件
for txt_file in os.listdir(source_folder):
    if txt_file.endswith('.txt'):
        # 构建完整的文件路径
        txt_path = os.path.join(source_folder, txt_file)
        
        # 创建XML文件名
        xml_file_name = txt_file.replace('.txt', '.xml')
        xml_file_path = os.path.join(target_folder, xml_file_name)
        
        # 获取图像文件名(假设图像文件和TXT文件同名)
        image_file_name = txt_file.replace('.txt', '.png')  # 图像文件是PNG格式
        image_path = os.path.join(image_folder, image_file_name)
        
        # 检查图像文件是否存在
        if not os.path.exists(image_path):
            print(f"Image file not found: {image_path}")
            continue
        
        # 使用PIL库获取图像尺寸
        with Image.open(image_path) as img:
            image_width, image_height = img.size
        
        # 解析TXT文件并创建XML结构
        with open(txt_path, 'r') as txt_file:
            tree = ET.ElementTree(ET.Element('annotation'))
            root = tree.getroot()
            
            # 添加folder, filename, path元素
            folder = ET.SubElement(root, 'folder')
            folder.text = os.path.basename(os.path.dirname(image_path))  # 获取图片所在的文件夹名称
            filename = ET.SubElement(root, 'filename')
            filename.text = image_file_name
            path = ET.SubElement(root, 'path')
            path.text = os.path.abspath(image_path)  # 获取图片的绝对路径
            
            # 添加source元素
            source = ET.SubElement(root, 'source')
            database = ET.SubElement(source, 'database')
            database.text = 'Unknown'
            
            # 添加size元素
            size = ET.SubElement(root, 'size')
            width = ET.SubElement(size, 'width')
            width.text = str(image_width)
            height = ET.SubElement(size, 'height')
            height.text = str(image_height)
            depth = ET.SubElement(size, 'depth')
            depth.text = '1'
            
            # 添加segmented元素
            segmented = ET.SubElement(root, 'segmented')
            segmented.text = '0'
            
            # 遍历TXT文件中的每一行
            for line in txt_file:
                values = line.strip().split()
                category_id = values[0]
                x_center = float(values[1]) * image_width
                y_center = float(values[2]) * image_height
                bbox_width = float(values[3]) * image_width
                bbox_height = float(values[4]) * image_height
                
                # 创建object元素
                obj = ET.SubElement(root, 'object')
                name = ET.SubElement(obj, 'name')
                name.text = class_mapping[category_id]
                pose = ET.SubElement(obj, 'pose')
                pose.text = 'Unspecified'
                truncated = ET.SubElement(obj, 'truncated')
                truncated.text = '0'
                difficult = ET.SubElement(obj, 'difficult')
                difficult.text = '0'
                
                # 创建bounding_box元素
                bndbox = ET.SubElement(obj, 'bndbox')
                xmin = ET.SubElement(bndbox, 'xmin')
                xmin.text = str(int(x_center - bbox_width / 2))
                ymin = ET.SubElement(bndbox, 'ymin')
                ymin.text = str(int(y_center - bbox_height / 2))
                xmax = ET.SubElement(bndbox, 'xmax')
                xmax.text = str(int(x_center + bbox_width / 2))
                ymax = ET.SubElement(bndbox, 'ymax')
                ymax.text = str(int(y_center + bbox_height / 2))
            
            # 保存XML文件
            tree.write(xml_file_path, encoding='utf-8', xml_declaration=True)

# 打印完成信息
print('Conversion from TXT to XML completed.')

标签:XML,文件,标签,image,height,file,ET,path,txt
From: https://www.cnblogs.com/Timesi/p/18623967

相关文章

  • DooTask | 提升效率与协作:解锁Dootask任务模板与标签的强大功能
    文章目录前言一、什么是任务模板二、任务模板的优势三、任务标签的优势四、如何使用任务模板与标签五、快速选择并应用模板与标签六、确保任务的细节无误结束语......
  • 若引用JS文件,或者CSS文件,应直接写入HTML文件
    <scriptsrc="https://cdn.bootcdn.net/ajax/libs/quill/2.0.2/quill.js"></script><linkhref="https://cdn.bootcdn.net/ajax/libs/quill/2.0.2/quill.snow.css"rel="stylesheet"><script>/*!Forlicense......
  • Linux之文件描述符配置
    文件描述符文件描述符(FileDescriptor)是计算机编程中用于表示打开文件或其他输入/输出资源的抽象概念。在Unix和类Unix操作系统中,如Linux,每个打开的文件或网络连接都会被操作系统分配一个文件描述符,这是一个非负整数。文件描述符在操作系统中用于追踪打开的文件和网络连接的状态......
  • 记录一次「OSS上传文件的前置处理机制」实例剖析
    作者:京东物流陈雨引言在云计算环境中,对象存储服务(OSS)是一种提供存储和访问任意类型数据(如网站内容、企业备份数据、游戏、IoT设备数据等)的服务,支持从任何地点、任何时间访问数据。在很多应用场景中,用户需要上传文件到OSS,这可能包括图片、视频、文档等多种格式的文件。为了提......
  • 实验6 模版类、文件I/O和异常处理
    任务4:Vector.hpp:1#pragmaonce2#include<iostream>3usingnamespacestd;45template<typenameT>6classVector{7private:8intsize_;9T*data_;1011public:1213Vector(intn);1415Vector(intn,T......
  • 融云IM干货丨pages.json 文件用来对 uni-app 进行全局配置
    在uni-app中,`pages.json`文件是一个非常重要的配置文件,它用于定义应用中的页面路径、窗口表现以及全局配置等。以下是`pages.json`文件的一些关键配置项和它们的作用:1.**pages**:  -这个数组定义了应用中的所有页面路径,每个对象代表一个页面。数组中的每个对象至少包含......
  • Ftrans文件摆渡系统 让跨网文件传输更快捷、更安全!
    很多含有敏感信息的行业,包括但不限于:集成电路、政府、金融、能源、医疗、制造以及一些高新技术企业,都会采用网络隔离的方式来保护核心数据,这就产生了跨网文件传输的业务场景。面临这种场景,最好是采用专业的文件摆渡系统来解决传输和管控问题。 一、跨网文件传输的业务需求安......
  • 实验7 文件应用编程
    实验任务41#include<stdio.h>2#include<stdlib.h>34intmain(){5FILE*fp;6charch;7intlines=0,characters=0;89fp=fopen("data4.txt","r");10if(fp==NULL){11pr......
  • 文件包含tomato靶机通关
    连接到靶机将网址放到dirb中扫描一下得到了三个目录我们挨个访问一下第一个是主目录第二个是主页面第三个报错我们在主目录页面继续访问发现了info.php打开发现存在文件包含我们查看页面源代码现存在文件包含的参数是image我们通过读取/etc/passwd来......
  • 文件解析漏洞
    IIS解析漏洞在iis6.x中,.asp文件夹中的任意文件都会被当做asp文件去执行在默认网站里创建一个a.asp文件夹并创建一个1.jpg写进我们的asp代码单独创建一个1.jpg发现并不能解析在a.asp下被解析Nginx解析漏洞(nginx_parsing&CVE-2013-454)nginx_parsing访问网站写一个图......