python 读取voc格式的标注xml文件

本文介绍了一种从测试集中的XML文件读取并统计车牌尺寸信息的方法,旨在为设置priorbox尺寸提供参考,通过解析XML文件获取图像尺寸及车牌边界框坐标,计算并统计了车牌宽度、高度及比例等关键数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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
    '''

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值