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()
labelmg标定后数据的验证
最新推荐文章于 2024-07-17 15:44:06 发布