传入:存储 xml 的根路径
返回:一个 xml 文件中的标注存储为一条字典记录,返回出入根路径中所有 xml 标记的数据信息
1 import os 2 import xml.dom.minidom 3 4 ### 传入存储 xml 文件的根路径 --> 以字典的形式返回 xml 文件中存储的数据信息,一个 xml 文件构成一条字典记录 5 def xml_label_names(xml_root_path): 6 xml_files = os.listdir(xml_root_path) 7 # print(xml_root_path, ' 路径下有文件个数:', len(xml_files)) 8 xml_dict_list = [] 9 for xml_file in xml_files: 10 xml_path = os.path.join(xml_root_path, xml_file) 11 # 打开xml文档 12 DOMTree = xml.dom.minidom.parse(xml_path) 13 # 得到文档元素对象 14 collection = DOMTree.documentElement 15 16 ### 获取文件夹名和文件名 17 folder_name = collection.getElementsByTagName("folder")[0].childNodes[0].data 18 filename = collection.getElementsByTagName("filename")[0].childNodes[0].data 19 # print('\n', 'folder_name: {} ,filename {}'.format(folder_name, filename)) 20 21 ### 获取 xml 标记中的 size 信息 22 size_list = collection.getElementsByTagName("size") 23 size_depth = size_list[0].getElementsByTagName('depth')[0].childNodes[0].data 24 size_width = size_list[0].getElementsByTagName('width')[0].childNodes[0].data 25 size_height = size_list[0].getElementsByTagName('height')[0].childNodes[0].data 26 # print('size 部分: depth: {} ,\t {} ,\theight: {}'.format(size_depth, size_width, size_height)) 27 28 ### 得到标签名为object的信息 29 objectlist = collection.getElementsByTagName("object") 30 bbox_list = [] 31 for objects in objectlist: 32 ### 获得标记框的标签名,每个 object 中得到子标签名为 name 的信息 33 bndbox_label = objects.getElementsByTagName('name')[0].childNodes[0].data 34 if bndbox_label == 'D00': 35 bndbox_label = 'D01' 36 # print('标签名原为 D00 , 现改为 D01') 37 elif bndbox_label == 'D01': 38 bndbox_label = 'D00' 39 # print('标签名原为 D01 , 现改为 D00') 40 elif bndbox_label == 'D10': 41 bndbox_label = 'D11' 42 # print('标签名原为 D10 , 现改为 D11') 43 elif bndbox_label == 'D11': 44 bndbox_label = 'D10' 45 # print('标签名原为 D11 , 现改为 D10') 46 ### 获取标记框的标记信息, 每个 bndbox 中只有一组标记框信息 47 bndbox = objects.getElementsByTagName('bndbox') 48 xmin = int(bndbox[0].getElementsByTagName('xmin')[0].childNodes[0].data) 49 ymin = int(bndbox[0].getElementsByTagName('ymin')[0].childNodes[0].data) 50 xmax = int(bndbox[0].getElementsByTagName('xmax')[0].childNodes[0].data) 51 ymax = int(bndbox[0].getElementsByTagName('ymax')[0].childNodes[0].data) 52 bbox = [xmin, ymin, xmax, ymax] 53 bbox_list.append([bndbox_label, bbox]) 54 # print('标签名 {}, \t标签名类型 {}, \t标记框 {}'.format(bndbox_label, type(bndbox_label), bbox)) 55 56 ### 向字典中添加数据 57 xml_dict = {'folder_name':folder_name, 58 'filename':filename, 59 'size_depth':size_depth, 'size_width':size_width, 'size_height':size_height, 60 'objects':bbox_list} 61 # print(xml_dict) 62 xml_dict_list.append(xml_dict) 63 return xml_dict_list 64 65 66 xml_root_path = '../data/xml' # 存储 xml 的根路径 67 xml_dict_list = xml_label_names(xml_root_path) # 传入 xml 的根路径,显示 xml 中所有的数据信息 68 for i, xml_dict in enumerate(xml_dict_list): 69 print('{:<4d} {}'.format(i, xml_dict))
运行结果如下:
1 0 {'folder_name': 'images', 'filename': 'Czech_003467.jpg', 'size_depth': '3', 'size_width': '600', 'size_height': '600', 'objects': [['D01', [348, 459, 392, 528]], ['D11', [212, 452, 273, 471]], ['D01', [66, 467, 113, 517]], ['D01', [128, 437, 183, 508]]]} 2 1 {'folder_name': 'images', 'filename': 'Czech_003510.jpg', 'size_depth': '3', 'size_width': '600', 'size_height': '600', 'objects': [['D11', [1, 466, 171, 485]], ['D11', [1, 446, 171, 465]], ['D40', [135, 408, 201, 436]]]}