看了好多博文都是很早的代码,用的还是python2下的xml模块,但是博主使用的是python3,import mxl.domin会报错,显示python3下没有domin模块,因此是用不了他们的方法。所以博主使用lxml模块,模块下载地址: lxml下载地址。
博主使用的是windows10平台下的anaconda python3.6.5,点击下载好后,打开anaconda prompt输入:
pip install 文件名
进行安装。
VOC_2012标注数据xml如下:
VOC2012
2007_000027.jpg
486
500
3
0
标注数据的文件结构如下所示:
由于数据量还是比较大的,将函数写为生成器
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对角坐标]]]