Python將VOC數據集歸一化後的labels(.txt)文件批量轉成xml文件

BDD100K數據集的Annotations包含了被標記對象的:標籤類別、大小(起始座標、結束座標、寬度和高度)、截斷、遮擋和交通燈顏色、車道線、可駕駛區域等大量信息。
這裏寫圖片描述
爲了用於darknet框架下tiny-yolo模型的訓練,先提取標定框的類別、大小信息,然後轉化成歸一化的labels文件。代碼改天再傳~~~
這裏寫圖片描述
想看一下BDD100K數據集在原圖上的標定框,所以把labels文件轉成了xml文件(只生成了圖片標註工具LabelImg中需要的關鍵信息),是以下這種風格:
這裏寫圖片描述
以下是完整的代碼labels2xml.py
附:存放標定框類別的BDD100K_10.names文件的內容截圖
這裏寫圖片描述

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

img_path = '/home/anngic/BDD100K/JPEGImages/'                   #原圖.jpg文件的路徑
labels_path = '/home/anngic/BDD100K/labels/'                    #labels中.txt文件的路徑
annotations_path = '/home/anngic/BDD100K/Annotations/'          #生成的xml文件需要保存的路徑
labels = os.listdir(labels_path)
clsnames_path = '/home/anngic/label/bdd100k_labels/BD100K_10.names'     #names文件的路徑   
with open(clsnames_path,'r') as f:
    classes = f.readlines()
    classes = [cls.strip('\n') for cls in classes]
def write_xml(imgname,filepath,labeldicts):                     #參數imagename是圖片名(無後綴)
    root = ET.Element('Annotation')                             #創建Annotation根節點
    ET.SubElement(root, 'filename').text = str(imgname)         #創建filename子節點(無後綴)
    sizes = ET.SubElement(root,'size')                          #創建size子節點            
    ET.SubElement(sizes, 'width').text = '1280'                 #沒帶腦子直接寫了原圖片的尺寸......
    ET.SubElement(sizes, 'height').text = '720'
    ET.SubElement(sizes, 'depth').text = '3'                    #圖片的通道數:img.shape[2]
    for labeldict in labeldicts:
        objects = ET.SubElement(root, 'object')                 #創建object子節點
        ET.SubElement(objects, 'name').text = labeldict['name']        #BDD100K_10.names文件中  
                                                                       #的類別名
        ET.SubElement(objects, 'pose').text = 'Unspecified'
        ET.SubElement(objects, 'truncated').text = '0'
        ET.SubElement(objects, 'difficult').text = '0'
        bndbox = ET.SubElement(objects,'bndbox')
        ET.SubElement(bndbox, 'xmin').text = str(int(labeldict['xmin']))
        ET.SubElement(bndbox, 'ymin').text = str(int(labeldict['ymin']))
        ET.SubElement(bndbox, 'xmax').text = str(int(labeldict['xmax']))
        ET.SubElement(bndbox, 'ymax').text = str(int(labeldict['ymax']))
    tree = ET.ElementTree(root)
    tree.write(filepath, encoding='utf-8')


for label in labels:                                           #批量讀.txt文件
    with open(labels_path + label, 'r') as f:
        img_id = os.path.splitext(label)[0]
        contents = f.readlines()
        labeldicts = []
        for content in contents:
            img = np.array(Image.open(img_path+label.strip('.txt') + '.jpg'))
            sh,sw = img.shape[0],img.shape[1]                  #img.shape[0]是圖片的高度720
                                                               #img.shape[1]是圖片的寬度720
            content = content.strip('\n').split()
            x=float(content[1])*sw
            y=float(content[2])*sh
            w=float(content[3])*sw
            h=float(content[4])*sh
            new_dict = {'name': classes[int(content[0])],
                        'difficult': '0',
                        'xmin': x+1-w/2,                      #座標轉換公式看另一篇文章....
                        'ymin': y+1-h/2,
                        'xmax': x+1+w/2,
                        'ymax': y+1+h/2
                        }
            labeldicts.append(new_dict)
        write_xml(img_id, annotations_path + label.strip('.txt') + '.xml', labeldicts)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章