lxml读取VOC_2012标注数据

前言:

看了好多博文都是很早的代码,用的还是python2下的xml模块,但是博主使用的是python3,import mxl.domin会报错,显示python3下没有domin模块,因此是用不了他们的方法。所以博主使用lxml模块,模块下载地址: lxml下载地址。

lxml读取VOC_2012标注数据_第1张图片

安装lxml:

lxml读取VOC_2012标注数据_第2张图片

博主使用的是windows10平台下的anaconda python3.6.5,点击下载好后,打开anaconda prompt输入:

pip install 文件名

进行安装。 

正文:

VOC_2012标注数据xml如下:


	VOC2012
	2007_000027.jpg
	
		The VOC2007 Database
		PASCAL VOC2007
		flickr
	
	
		486
		500
		3
	
	0
	
		person
		Unspecified
		0
		0
		
			174
			101
			349
			351
		
		
			head
			
				169
				104
				209
				146
			
		
		
			hand
			
				278
				210
				297
				233
			
		
		
			foot
			
				273
				333
				297
				354
			
		
		
			foot
			
				319
				307
				340
				326
			
		
	

标注数据的文件结构如下所示: 

 lxml读取VOC_2012标注数据_第3张图片

 由于数据量还是比较大的,将函数写为生成器

VOC2012_Enum = enum.Enum("VOC2012_Enum", ("person", "bird", "cat", "cow", "dog", "horse", "sheep",
                                          "aeroplane", "bicycle", "boat", "bus", "car", "motorbike",
                                          "train", "bottle", "chair", "diningtable", "pottedplant",
                                          "sofa", "tvmonitor"))  # python下的枚举

def load_xml(xml_path):
    data_list = []
    tree_root = etree.parse(xml_path)
    data_list.append(tree_root.find("filename").text)
    for object in tree_root.iterfind("//object"):
        obj_class = VOC2012_Enum[object.find("name").text].value
        data_list.append(obj_class)
        iter = object.getiterator(tag="bndbox")
        iter_list = (i for i in iter)
        bbox_list = []
        for bbox in iter_list.__next__().getchildren():
            bbox_list.append(round(float(bbox.text), 2))
        data_list.append(bbox_list)
    return data_list

输出数据格式:

['2007_000323.jpg', 1, [277, 3, 500, 375], 1, [12, 3, 305, 375]]
对应格式:
[图片文件名,bbox1类别对应标号,[bbox1对角坐标],bbox2类别对应标号,[bbox2对角坐标]]

修改:

之前没有充分分析标注数据,错误的以为标注数据的坐标全是顺序排列的,但实际上并不是xmin,xmax,ymin,ymax是打乱顺序出现的,所以上述代码结果就不对了修正代码为:

def load_xml(xml_path):
    data_list = []
    tree_root = etree.parse(xml_path)
    data_list.append(tree_root.find("filename").text)
    class_list = []
    coord_list = []
    for object in tree_root.findall("object"):
        obj_class = VOC2012_Enum[object.find("name").text].value
        class_list.append(obj_class)
        bbox = object.find("bndbox")
        bbox_list = []
        bbox_list.append(int(round(float(bbox.find("xmin").text), 2)))
        bbox_list.append(int(round(float(bbox.find("ymin").text), 2)))
        bbox_list.append(int(round(float(bbox.find("xmax").text), 2)))
        bbox_list.append(int(round(float(bbox.find("ymax").text), 2)))
        coord_list.append(bbox_list)
    data_list.append(class_list)
    data_list.append(coord_list)
    return data_list

输出格式为:

['2007_000323.jpg', [1,2], [[277, 3, 500, 375], [12, 3, 305, 375]]]
[图片文件名,[bbox1类别对应标号,bbox2类别对应标号], [[bbox1对角坐标], [bbox2对角坐标]]]

 

你可能感兴趣的:(深度学习,mxnet,xml,深度学习)