统计数据会集目标大、中、小个数【必要用到yolo的txt标注文件数据,其他格

[复制链接]
查看622 | 回复0 | 2023-8-23 11:46:57 | 显示全部楼层 |阅读模式
统计数据会集目标大、中、小个数

近来看到一篇论文,此中在数据集介绍部分统计了大、中、小目标信息。因此,为了获取数据集的统计信息,我参考了作者写的代码基于tensorpack统计coco数据会集大、中、小目标的数量

精简版代码如下(内有多个参数必要修改,细致查看表明)
  1. # 1、统计数据集中小、中、大 GT的个数
  2. # 2、统计某个类别小、中、大 GT的个数
  3. # 3、统计数据集中ss、sm、sl GT的个数
  4. import os
  5. from pathlib import Path
  6. import matplotlib.pyplot as plt
  7. # 设置中文字体为微软雅黑
  8. plt.rcParams['font.sans-serif'] = 'SimHei'
  9. def getGtAreaAndRatio(label_dir):
  10.     """
  11.     得到不同尺度的gt框个数
  12.     :params label_dir: label文件地址
  13.     :return data_dict: {dict: 3}  3 x {'类别':{’area':[...]}, {'ratio':[...]}}
  14.     """
  15.     data_dict = {}
  16.     assert Path(label_dir).is_dir(), "label_dir is not exist"
  17.     txts = os.listdir(label_dir)  # 得到label_dir目录下的所有txt GT文件
  18.     for txt in txts:  # 遍历每一个txt文件
  19.         with open(os.path.join(label_dir, txt), 'r') as f:  # 打开当前txt文件 并读取所有行的数据
  20.             lines = f.readlines()
  21.         for line in lines:  # 遍历当前txt文件中每一行的数据
  22.             temp = line.split()  # str to list{5}
  23.             coor_list = list(map(lambda x: x, temp[1:]))  # [x, y, w, h]
  24.             area = float(coor_list[2]) * float(coor_list[3])  # 计算出当前txt文件中每一个gt的面积
  25.             # center = (int(coor_list[0] + 0.5*coor_list[2]),
  26.             #           int(coor_list[1] + 0.5*coor_list[3]))
  27.             ratio = round(float(coor_list[2]) / float(coor_list[3]), 2)  # 计算出当前txt文件中每一个gt的 w/h
  28.             if temp[0] not in data_dict:
  29.                 data_dict[temp[0]] = {}
  30.                 data_dict[temp[0]]['area'] = []
  31.                 data_dict[temp[0]]['ratio'] = []
  32.             data_dict[temp[0]]['area'].append(area)
  33.             data_dict[temp[0]]['ratio'].append(ratio)
  34.     return data_dict
  35. def getSMLGtNumByClass(data_dict, class_num):
  36.     """
  37.     计算某个类别的小物体、中物体、大物体的个数
  38.     params data_dict: {dict: 3}  3 x {'类别':{’area':[...]}, {'ratio':[...]}}
  39.     params class_num: 类别  0, 1, 2
  40.     return s: 该类别小物体的个数  0 < area <= 0.5%
  41.            m: 该类别中物体的个数  0.5% < area <= 1%
  42.            l: 该类别大物体的个数  area > 1%
  43.     """
  44.     s, m, l = 0, 0, 0
  45.     # 图片的尺寸大小 注意修改!!!
  46.     h = 960
  47.     w = 540
  48.     for item in data_dict['{}'.format(class_num)]['area']:
  49.         if item * h * w <= h * w * 0.005:
  50.             s += 1
  51.         elif item * h * w <= h * w * 0.010:
  52.             m += 1
  53.         else:
  54.             l += 1
  55.     return s, m, l
  56. def getAllSMLGtNum(data_dict, isEachClass=False):
  57.     """
  58.     数据集所有类别小、中、大GT分布情况
  59.     isEachClass 控制是否按每个类别输出结构
  60.     """
  61.     S, M, L = 0, 0, 0
  62.     # 需要手动初始化下,有多少个类别就需要写多个
  63.     classDict = {'0': {'S': 0, 'M': 0, 'L': 0}, '1': {'S': 0, 'M': 0, 'L': 0}, '2': {'S': 0, 'M': 0, 'L': 0},
  64.                  '3': {'S': 0, 'M': 0, 'L': 0}}
  65.     print(classDict['0']['S'])
  66.     # range(class_num)类别数 注意修改!!!
  67.     if isEachClass == False:
  68.         for i in range(4):
  69.             s, m, l = getSMLGtNumByClass(data_dict, i)
  70.             S += s
  71.             M += m
  72.             L += l
  73.         return [S, M, L]
  74.     else:
  75.         for i in range(4):
  76.             S = 0
  77.             M = 0
  78.             L = 0
  79.             s, m, l = getSMLGtNumByClass(data_dict, i)
  80.             S += s
  81.             M += m
  82.             L += l
  83.             classDict[str(i)]['S'] = S
  84.             classDict[str(i)]['M'] = M
  85.             classDict[str(i)]['L'] = L
  86.         return classDict
  87. # 画图函数
  88. def plotAllSML(SML):
  89.     x = ['S:[0, 32x32]', 'M:[32x32, 96x96]', 'L:[96*96, 640x640]']
  90.     fig = plt.figure(figsize=(10, 8))  # 画布大小和像素密度
  91.     plt.bar(x, SML, width=0.5, align="center", color=['skyblue', 'orange', 'green'])
  92.     for a, b, i in zip(x, SML, range(len(x))):  # zip 函数
  93.         plt.text(a, b + 0.01, "%d" % int(SML[i]), ha='center', fontsize=15, color="r")  # plt.text 函数
  94.     plt.xticks(fontsize=15)
  95.     plt.yticks(fontsize=15)
  96.     plt.xlabel('gt大小', fontsize=16)
  97.     plt.ylabel('数量', fontsize=16)
  98.     plt.title('广佛手病虫害训练集小、中、大GT分布情况(640x640)', fontsize=16)
  99.     plt.show()
  100.     # 保存到本地
  101.     # plt.savefig("")
  102. if __name__ == '__main__':
  103.     labeldir = r'E:\project\py-project\network\dataset\UA-DETRAC-G2\labels\val'
  104.     data_dict = getGtAreaAndRatio(labeldir)
  105.     # 1、数据集所有类别小、中、大GT分布情况
  106.     # 控制是否按每个类别输出结构
  107.     isEachClass = False
  108.     SML = getAllSMLGtNum(data_dict, isEachClass)
  109.     print(SML)
  110.     if not isEachClass:
  111.         plotAllSML(SML)
复制代码
来源:https://blog.csdn.net/lafsca5/article/details/129203698
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则