前言:
安裝好python環境與編譯器
轉換:
將標注文件從文本格式(.txt
)轉換為 XML 格式(.xml
)可以通過以下步驟完成:
- 解析文本標注文件:打開
.txt
文件,逐行讀取每個標注,并解析邊界框坐標和類別信息。 - 創建 XML 文件:使用 Python 的內置庫
xml.etree.ElementTree
創建一個 XML 樹,然后逐個添加 XML 元素來表示圖像和標注信息。 - 將 XML 樹寫入文件:將構建的 XML 樹寫入一個新的
.xml
文件中,以實現標注信息的轉換。
PS:通常情況下,.txt
文件中的每一行應該包含一條標注信息,其中包括類別信息。以下是一種可能的 .txt
文件的格式:?
class_id x_min y_min x_max y_max
其中 x_min
、y_min
、x_max
、y_max
是標注框的坐標,class_id
是類別標識。如果在你的數據中類別信息不是放在每行的最后一列,你需要根據你的數據格式進行相應的調整。
按照上面的YOLO格式,具體代碼如下所示
import os
import xml.etree.ElementTree as ETdef convert_txt_to_xml(txt_folder, xml_folder, classes):txt_files = [f for f in os.listdir(txt_folder) if f.endswith('.txt')]for txt_file in txt_files:txt_path = os.path.join(txt_folder, txt_file)xml_path = os.path.join(xml_folder, os.path.splitext(txt_file)[0] + '.xml')with open(txt_path, 'r') as txt_file:lines = txt_file.readlines()root = ET.Element('annotation')for line in lines:line = line.strip().split()if len(line) < 5:continueclass_index = int(float(line[0])) # 類別索引class_name = classes[class_index] # 類別名稱xmin, ymin, xmax, ymax = map(int, map(float, line[1:5])) # 坐標轉換為整數obj = ET.SubElement(root, 'object')ET.SubElement(obj, 'name').text = class_namebbox = ET.SubElement(obj, 'bndbox')ET.SubElement(bbox, 'xmin').text = str(xmin)ET.SubElement(bbox, 'ymin').text = str(ymin)ET.SubElement(bbox, 'xmax').text = str(xmax)ET.SubElement(bbox, 'ymax').text = str(ymax)tree = ET.ElementTree(root)tree.write(xml_path)# 要轉換的文件夾路徑和輸出的文件夾路徑
txt_folder = 'labels' #txt文件夾
xml_folder = 'labels_xml_folder' #目標xml文件夾
classes = ['pig', 'stand', 'lie', 'drink', 'lie', 'eat'] # 類別列表convert_txt_to_xml(txt_folder, xml_folder, classes)
這段代碼會將txt文件夾中的每個txt文件轉換為相應的xml文件,并根據類別索引匹配對應的類別名稱。