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)