首頁 > 軟體

Python實現xml格式轉txt格式的範例程式碼

2022-03-29 19:00:55

1、前言

最近學習Yolo v5是遇見了個問題,找的資料集全是xml檔案,VOC 的標註是 xml 格式的,而YOLO是.txt格式,那麼問題就來了,手動提取肯定是不可能的,那隻能借用程式解決咯。

2、分析xml、txt資料

這是xml樹形結構

這是txt格式

總結:

1.提取object->name、bndbox->xmin,ymin,xmax,ymin

2.格式轉化需要用公式轉換

YOLO資料集txt格式:

x_center :歸一化後的中心點x座標

y_center : 歸一化後的中心點y座標

w:歸一化後的目標框寬度

h: 歸一化後的目標況高度

(此處歸一化指的是除以圖片寬和高)

VOC資料集xml格式

yolo的四個資料xml->txt公式
x_center((x_min+x_max)/2-1)/w_image
y_center((y_min+y_max)/2-1)/h_image
w(x_max-x_min)/w_image
h(y_max-y_min)/h_image

3、轉換過程

定義兩個資料夾,train放xml資料, labels放txt資料。

程式碼解析:

import os
import xml.etree.ElementTree as ET
import io
find_path = './train/'    #xml所在的檔案
savepath='./labels/'   #儲存檔案

class Voc_Yolo(object):
    def __init__(self, find_path):
        self.find_path = find_path
    def Make_txt(self, outfile):
        out = open(outfile,'w') 
        print("建立成功:{}".format(outfile))
        return out
    def Work(self, count):
    #找到檔案路徑
        for root, dirs, files in os.walk(self.find_path):
        #找到檔案目錄中每一個xml檔案
            for file in files:
            #記錄處理過的檔案
                count += 1
                #輸入、輸出檔案定義
                input_file = find_path + file
                outfile = savepath+file[:-4]+'.txt'
                #新建txt檔案,確保檔案正常儲存
                out = self.Make_txt(outfile)
                #分析xml樹,取出w_image、h_image
                tree=ET.parse(input_file)
                root=tree.getroot()
                size=root.find('size')
                w_image=float(size.find('width').text)
                h_image=float(size.find('height').text)
                #繼續提取有效資訊來計算txt中的四個資料
                for obj in root.iter('object'):
                #將型別提取出來,不同目標型別不同,本文僅有一個類別->0
                    classname=obj.find('name').text
                    cls_id = classname
                    xmlbox=obj.find('bndbox')
                    x_min=float(xmlbox.find('xmin').text)
                    x_max=float(xmlbox.find('xmax').text)
                    y_min=float(xmlbox.find('ymin').text)
                    y_max=float(xmlbox.find('ymax').text)
                    #計算公式
                    x_center=((x_min+x_max)/2-1)/w_image
                    y_center=((y_min+y_max)/2-1)/h_image
                    w=(x_max-x_min)/w_image
                    h=(y_max-y_min)/h_image
                    #檔案寫入
                    out.write(str(cls_id)+" "+str(x_center)+" "+str(y_center)+" "+str(w)+" "+str(h)+'n')
                out.close()
        return count
if __name__ == "__main__":
    data = Voc_Yolo(find_path)
    number = data.Work(0)
    print(number)

4、最後結果對比

建立成功

與真實資料對比誤差很小

到此這篇關於Python實現xml格式轉txt格式的範例程式碼的文章就介紹到這了,更多相關Python xml轉txt內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com