:params label_dir: label文件地址
:return data_dict: {dict: 3} 3 x { 类别 :{’area :[...]}, { ratio :[...]}}
data_dict {}
assert Path(label_dir).is_dir(), label_dir is not exist
txts os.listdir(label_dir) # 得到label_dir目录下的所有txt GT文件
for txt in txts: # 遍历每一个txt文件
with open(os.path.join(label_dir, txt), r ) as f: # 打开当前txt文件 并读取所有行的数据
lines f.readlines()
for line in lines: # 遍历当前txt文件中每一行的数据
temp line.split() # str to list{5}
coor_list list(map(lambda x: x, temp[1:])) # [x, y, w, h]
area float(coor_list[2]) * float(coor_list[3]) # 计算出当前txt文件中每一个gt的面积
# center (int(coor_list[0] 0.5*coor_list[2]),
# int(coor_list[1] 0.5*coor_list[3]))
ratio round(float(coor_list[2]) / float(coor_list[3]), 2) # 计算出当前txt文件中每一个gt的 w/h
if temp[0] not in data_dict:
data_dict[temp[0]] {}
data_dict[temp[0]][ area ] []
data_dict[temp[0]][ ratio ] []
data_dict[temp[0]][ area ].append(area)
data_dict[temp[0]][ ratio ].append(ratio)
return data_dict
def getSMLGtNumByClass(data_dict, class_num):
计算某个类别的小物体、中物体、大物体的个数
params data_dict: {dict: 3} 3 x { 类别 :{’area :[...]}, { ratio :[...]}}
params class_num: 类别 0, 1, 2
return s: 该类别小物体的个数 0 area 32*32
m: 该类别中物体的个数 32*32 area 96*96
l: 该类别大物体的个数 area 96*96
s, m, l 0, 0, 0
for item in data_dict[ {} .format(class_num)][ area ]:
if item * 640 * 640 32 * 32:
elif item * 640 * 640 96 * 96:
else:
return s, m, l
def getAllSMLGtNum(data_dict):
数据集所有类别小、中、大GT分布情况
S, M, L 0, 0, 0
for i in range(3):
s, m, l getSMLGtNumByClass(data_dict, i)
return [S, M, L]
def analyAllSmallGt(data_dict):
ss, sm, sl 0, 0, 0
for c in range(3):
for item in data_dict[ {} .format(c)][ area ]:
if item * 640 * 640 8 * 8:
ss 1
elif item * 640 * 640 16 * 16:
sm 1
elif item * 640 * 640 32 * 32:
sl 1
return [ss, sm, sl]