labelmg标定后数据的验证

import xml.etree.ElementTree as ET
import os
xml_root = r"C:\deep-learning-for-image-processing-master\pytorch_object_detection\ssd\VOCdevkit\VOC2012\Annotations"
# new_xml_root = "./data"
image_root = "./data"
xml_name_list = sorted(os.listdir(xml_root))
def check_bbox():
    # if not os.path.exists(new_xml_root):
    #     os.makedirs(new_xml_root)
    print('为了方便测试,该函数额外提供一种测试即根据所有的annatations数据来获取最大的xmin,ymin,xmax,ymax,方便形如regress range的设置')
    max=[]
    min=[]
    max_photo_size=[]
    min_photo_size=[]
    for xml_name in xml_name_list:
        xml_path = os.path.join(xml_root, xml_name)
        tree = ET.parse(xml_path)   #使用ET模块的parse()函数来从指定的XML文件构造一个ElementTree对象
        root = tree.getroot()       # 获取 XML 文档对象的根结点 Element
        # print(root)
        for obj in root.findall("object"):
            bnd_box = obj.find("bndbox")
            bbox = [
                int(float(bnd_box.find("xmin").text)),
                int(float(bnd_box.find("ymin").text)),
                int(float(bnd_box.find("xmax").text)),
                int(float(bnd_box.find("ymax").text)),
            ]

            length = bbox[2] - bbox[0]
            width  = bbox[3] - bbox[1]
            area = length * width

            if len(max) == 0:
                max.append([length,width,area])
                for i in bbox:
                    max.append(i)
            if len(min) == 0:
                min.append([length, width, area])
                for i in bbox:
                    min.append(i)
                continue

            if area > max[0][2]:
                max = []
                max.append([length, width, area])
                for i in bbox:
                    max.append(i)

            if area < min[0][2]:
                min = []
                min.append([length, width, area])
                for i in bbox:
                    min.append(i)



            if bbox[0] >= bbox[2] or bbox[1] >= bbox[3]:
                print("bbox[0] >= bbox[2] or bbox[1] >= bbox[3]", bbox, xml_name)
        # xml_str = ET.tostring(root)
        # for f in root.findall("filename"):
        #     filename = f.test
        filename = root.find("filename").text
        # print(filename)
        for s in root.findall("size"):
            # print(s,s.find("width").text)
            size = [
                int(float(s.find("width").text)),
                int(float(s.find("height").text)),
                int(float(s.find("depth").text))
            ]
            photo_size = size[0]*size[1]
            if len(max_photo_size) == 0 and len(min_photo_size) == 0:
                max_photo_size.append(photo_size)
                min_photo_size.append(photo_size)
                for i in size[:2]:
                    max_photo_size.append(i)
                    min_photo_size.append(i)
                max_photo_size.append(filename)
                min_photo_size.append(filename)
                continue
            if photo_size > max_photo_size[0]:
                max_photo_size = []
                max_photo_size.append(photo_size)
                for i in size[:2]:
                    max_photo_size.append(i)
                max_photo_size.append(filename)
            if photo_size < min_photo_size[0]:
                min_photo_size=[]
                min_photo_size.append(photo_size)
                for i in size[:2]:
                    min_photo_size.append(i)
                min_photo_size.append(filename)


    print('finished','如果没有打印则说明坐标没有问题')
    print(max,end='         \n最大的[length,width,area] xmin,ymin,xmax,ymax\n')
    print(min,end='         \n最小的[length,width,area] xmin,ymin,xmax,ymax\n')
    print(max_photo_size,'\n',min_photo_size,end='\n第一个参数为最大图片面积与最小图片面积\n后面列表保存的是[width,height]\n最后保存的是图片名称')

    max_mean=(max[0][0]+max[0][1])/2             #最大的框的width和height的mean
    min_mean=(min[0][0]+min[0][1])/2             #最小的框的width和height的mean
    num_level = 4
    range_dict = []
    range_left = 0
    range_right = 0
    num = (max_mean-min_mean)/num_level
    for i in range(num_level):
        range_right +=num
        range_dict.append((int(range_left),int(range_right)))
        range_left = range_right
    print('\n',range_dict,'\n根据残差网络输出四个范围(每个范围都是根据最大的mean和最小mean划分的)')

    range_number = [0,0,0,0]

    for xml_name in xml_name_list:
        xml_path = os.path.join(xml_root, xml_name)
        tree = ET.parse(xml_path)   #使用ET模块的parse()函数来从指定的XML文件构造一个ElementTree对象
        root = tree.getroot()       # 获取 XML 文档对象的根结点 Element
        # print(root)
        for obj in root.findall("object"):
            bnd_box = obj.find("bndbox")
            bbox = [
                int(float(bnd_box.find("xmin").text)),
                int(float(bnd_box.find("ymin").text)),
                int(float(bnd_box.find("xmax").text)),
                int(float(bnd_box.find("ymax").text)),
            ]

            length = bbox[2] - bbox[0]
            width = bbox[3] - bbox[1]
            mean_number = (length+width)/2
            for i in range(num_level):
                if range_dict[i][0] < mean_number <range_dict[i][1]:
                    range_number[i] +=1
    print(range_number,end='\n统计的是各个level上的符合range_dict条件的框的个数')

    range_new = []
    range_new_left = 0
    range_new_right = 0
    chance = 1
    for i in range_dict:
        while i[1] > 2**chance:
            chance +=1
        range_new_right = 2**chance
        range_new.append((range_new_left,range_new_right))

        range_new_left = int(range_new_right/2)
    print('\n',range_new,end='\n这里是经过了取2处理后的range,方便直接用于regress range的设置')










check_bbox()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值