#coding : utf-8
import os
import cv2
import abc
import xml.dom.minidom as xml
import math
import matplotlib.pyplot as plt
'''
读取测试集中的xml文件,统计下测试图片中车牌的大小信息,可以用来参考设置priorbox的大小
'''
class XmlReader(object):
__metaclass__ = abc.ABCMeta
def __init__(self):
pass
def read_content(self,filename):
content = None
if (False == os.path.exists(filename)):
return content
filehandle = None
try:
filehandle = open(filename,'rb')
except FileNotFoundError as e:
print(e.strerror)
try:
content = filehandle.read()
except IOError as e:
print(e.strerror)
if (None != filehandle):
filehandle.close()
if(None != content):
return content.decode("utf-8","ignore")
return content
@abc.abstractmethod
def load(self,filename):
pass
class XmlTester(XmlReader):
def __init__(self):
XmlReader.__init__(self)
def load(self, filename):
filecontent = XmlReader.read_content(self,filename)
if None != filecontent:
dom = xml.parseString(filecontent)
root = dom.getElementsByTagName('annotation')[0]
im_size = root.getElementsByTagName('size')[0]
im_w = int((im_size.getElementsByTagName('width')[0]).childNodes[0].data)
im_h = int((im_size.getElementsByTagName("height")[0]).childNodes[0].data)
im_shape=[im_w,im_h]
obj = dom.getElementsByTagName('object')[0]
box = obj.getElementsByTagName('bndbox')[0]
b_xmin=int((box.getElementsByTagName("xmin")[0]).childNodes[0].data)
b_ymin=int((box.getElementsByTagName("ymin")[0]).childNodes[0].data)
b_xmax=int((box.getElementsByTagName("xmax")[0]).childNodes[0].data)
b_ymax=int((box.getElementsByTagName("ymax")[0]).childNodes[0].data)
bbox=[b_xmin,b_ymin,b_xmax,b_ymax]
return im_shape,bbox
if __name__ == "__main__":
xml_dir="E:/dataset/CarPlate/cucumber_test/Annotations"
xmls=os.listdir(xml_dir)
sizes=[]
ws=[]
hs=[]
ratios=[]
ratios_320=[]
for xml_file in xmls:
reader = XmlTester()
xml_path=xml_dir+"/"+xml_file
#bboxes,im_w,im_h=GetAnnotBoxLoc(xml_dir+"/"+xml)
im_shape,bbox=reader.load(xml_path)
#priorbox大小是针对输入图像的大小的,这里输入图像被resize成了320x320,所以bbox的大小也要缩放
w_r=320.0/im_shape[0]
h_r=320.0/im_shape[1]
ratios.append(im_shape[0]*1.0/im_shape[1])
bbox_w=int((bbox[2]-bbox[0])* w_r)
bbox_h=int((bbox[3]-bbox[1])* h_r)
sizes.append(math.sqrt(bbox_w*bbox_h))
ws.append(bbox_w)
hs.append(bbox_h)
#print (bbox_w,bbox_h)
ratios_320.append(bbox_w*1.0/bbox_h)
print (bbox_w*1.0/bbox_h)
print ("max w:",max(ws))
print("min w:",min(ws))
print ("max h:",max(hs))
print("min h:",min(hs))
print("max side:",int(max(sizes)))
print("min side:",int(min(sizes)))
print("max ratio:",max(ratios))
print("min ratio:",min(ratios))
# plt.hist(sizes)
# plt.show()
# plt.hist(ws)
# plt.show()
# plt.hist(hs)
# plt.show()
plt.hist(ratios)
plt.show()
'''
bbox信息如下
max w: 139
min w: 17
max h: 95
min h: 7
max side: 96 (正方形边长)
min side: 13
'''