关于对象标注文件的转换(xml转json)

背景介绍

手上有一个工程
https://github.com/aditya-vora/FCHD-Fully-Convolutional-Head-Detector
该工程是一个预测人头位置的目标检测工程。

也就是说,该工程的输出是一个个的对头的方框标注
关于对象标注文件的转换(xml转json)_第1张图片
因此所需要的label文件是关于当前图片所有目标的像素点位置记录,是一个json文件,如下所示
关于对象标注文件的转换(xml转json)_第2张图片
我的目标就是在普通图片上实现该文件的输出。

方案说明

采取的方案是用labelImg应用得到xml文件,再从xml文件中提取需要的部分生成对应json文件

labelImg可自行寻找。

xml文件一般格式
关于对象标注文件的转换(xml转json)_第3张图片
所需要的便是‘bndbox’内的数据。

代码(基于Python3)

import os
import json
import xmltodict
import numpy as np
import random
'''得到关于所有框位置的数据'''
def get(path,txt):
    
    with open(path) as f:
        dic=xmltodict.parse(f.read())
    
        dd=dic["annotation"]["object"]
    
        type(dd)
    
        for i in range(len(dd)):
            
            x1=[dd[i]["bndbox"]["xmin"]+'.0']
            x2=[dd[i]["bndbox"]["xmax"]+'.0']
            y1=[dd[i]["bndbox"]["ymin"]+'.0']
            y2=[dd[i]["bndbox"]["ymax"]+'.0']

            txt=txt+x1+x2+y1+y2
            
        return txt
'''制作json文件,dic为最终输出的字典格式'''
def makejson(dic,save_path): 
        
    #dic={"image_ath":data_path,"rects":boxes[1:]}
    
    #obj=json.dumps(dic)
    
    with open(save_path, 'w') as f:
        json.dump(dic, f, sort_keys=True, indent=2, separators=(',', ': '))
    
    f.close()
'''读取txt文件内的内容,分别读取train,test,val的数据,返回以list格式'''
def readtxt(txtpath,name):
    txt = txtpath+name+'.txt'
    f = open(txt,"r")   #设置文件对象

    line = f.readline()
    train=[line[:-1]]

    while line:             #直到读取完文件
    
        line = f.readline()  #读取一行文件,包括换行符
        line = line[:-1]     #去掉换行符,也可以不去
        train.append(line)

    train=train[:-1]
    return train
    #print(train)

    f.close() #关闭文件
'''根据地址读取xml文件名,再根据比例进行分配,分别保存为三个txt文件,用于后续读取'''
def divide(xmlfilepath,txtsavepath, test_percent = 0.2,val_percent = 0.2,train_percent = 0.6):

    total_xml = os.listdir(xmlfilepath)

    num = len(total_xml)

#list = range(num)

    tr = int(num * train_percent)

    te = int(num * test_percent)+tr
#train = int(tv * train_percent)

#val = int()
#train = random.sample(list, tr)
#train = random.sample(trainval, tr)
#test = random.sample(list, te)
    ftrain = open('/home/tjw/Desktop/change/xml_to_json_idl/txt/train.txt', 'w')
    ftest = open('/home/tjw/Desktop/change/xml_to_json_idl/txt/test.txt', 'w')
    fval = open('/home/tjw/Desktop/change/xml_to_json_idl/txt/val.txt', 'w')

    xml_num=0

    for xml in total_xml:
        name = xml[:-4] + '\n'
        if (xml_num
if __name__ == '__main__':
    #data_path='/home/tjw/Desktop/change/xml_to_json_idl/xml/00000000_640x480.xml'
    xml_data_path = '/home/tjw/Desktop/change/xml_to_json_idl/xml/'#xml文件地址
    
    img_paths='/home/tjw/Desktop/change/xml_to_json_idl/img/'
    
    save_path='/home/tjw/Desktop/change/xml_to_json_idl/json/data.json'#json文件的保存位置
    
    #xmlfilepath = '/home/tjw/Desktop/change/xml_to_json_idl/xml/'

    txtsavepath = '/home/tjw/Desktop/change/xml_to_json_idl/txt/'#txt文件的保存位置
    
    divide(xml_data_path,txtsavepath) #根据读取到的xml路径进行分配,制作txt文件
    
    '''分别得到三种类型数据的列表'''
    txt_train = readtxt(txtsavepath,'train')
    txt_test = readtxt(txtsavepath,'test')
    txt_val = readtxt(txtsavepath,'val')
    
    unreshape_box=[]#用于存储未reshape的框位置信息
    
    dic=[]#用于存储最后的文件
    
    #labeltxt_path = os.path.join('/home/tjw/Desktop/change/xml_to_json_idl/xml/')#获取所有xml文件名
    #filenames = os.listdir(labeltxt_path)
    
    #for filename in filenames:
    for filename in txt_train:   
        img_path=(filename[:-4]+'.png')
        
        unreshape_box=get(xml_data_path+filename+'.xml',unreshape_box)#得到关于x,y的数据
    
        b=np.array(unreshape_box)#此时得到的是一长串的数字,s数组格式
    
        b=b.reshape(-1,4)#四个为一组
    
        a=len(b)
    
        boxes={"x1":b[0][0],"x2":b[0][1],"y1":b[0][2],"y2":b[0][3]},#这个是元组,reshape好的框位置信息
    
        i=1
        #搭建rects
        for i in range(a):
            box={"x1":b[i][0],"x2":b[i][1],"y1":b[i][2],"y2":b[i][3]},#元组
            boxes=boxes+box#元组可直接拼接
    
        dic1={"image_path":img_paths+img_path,"rects":boxes}#此时为dict格式
        
        dic.append(dic1)#通过list的append操作进行存储
        
        #print(dic)
    #makejson(dic,save_path)#根据dic创建json文件
    #obj=json.dumps(dic)
    
    #print(obj)

你可能感兴趣的:(学习历程)