import os
import glob
# 定义面积阈值
Area_Tiny = 16 * 16 # Tiny Object
Area_Small = 32 * 32 # Small Object
# 获取所有标注文件
annotation_files = glob.glob(r'D:\PCB_defect\datasets\Joint_PCB_A\labels\val/*.txt')
# 初始化计数器字典
category_total_counts = {} # 存储每种类别的总个数
category_size_counts = {} # 存储每种类别下不同大小目标的数量
category_max_area = {} # 存储每种类别的最大面积目标的长宽值
category_min_area = {} # 存储每种类别的最小面积目标的长宽值
# 遍历标注文件,统计每种类别下不同大小目标的数量和最大面积目标的长宽值
for annotation_file in annotation_files:
with open(annotation_file, 'r') as f:
for line in f:
# 解析标注信息
parts = line.strip().split()
class_id, x_center, y_center, width, height = map(float, parts)
class_id = int(class_id) # 将类别ID转换为整数
# 计算目标的宽度和高度(以像素为单位)
width_pixel = width * 640 # 假设图片宽度为640像素
height_pixel = height * 480 # 假设图片高度为480像素
# 计算面积
area = width_pixel * height_pixel
# 更新每种类别的总计数
category_total_counts[class_id] = category_total_counts.get(class_id, 0) + 1
# 判断目标尺寸并更新计数器
if area <= Area_Tiny:
size = 'Tiny_Object'
elif area <= Area_Small:
size = 'Small_Object'
else:
size = 'Medium_Object'
# 更新每种类型的目标计数
key = f'类别{class_id}_{size}'
category_size_counts[key] = category_size_counts.get(key, 0) + 1
# 更新每种类别的最大面积目标的长宽值
if class_id not in category_max_area or area > category_max_area[class_id]['area']:
category_max_area[class_id] = {'width': width_pixel, 'height': height_pixel, 'area': area}
# 更新每种类别的最小面积目标的长宽值
if class_id not in category_min_area or area < category_min_area[class_id]['area']:
category_min_area[class_id] = {'width': width_pixel, 'height': height_pixel, 'area': area}
# 输出每种类别的总个数
for class_id, count in category_total_counts.items():
print(f"类别{class_id}的总数量:{count}")
# 输出每种类别下不同大小目标的数量
for key, count in category_size_counts.items():
print(f"{key}数量:{count}")
# 输出像素面积最大的类别及其像素的宽和高
max_class_id = max(category_max_area, key=lambda class_id: category_max_area[class_id]['area'])
max_width = category_max_area[max_class_id]['width']
max_height = category_max_area[max_class_id]['height']
print(f"像素面积最大的类别:类别{max_class_id}")
print(f"最大面积目标的长宽值:{max_width}x{max_height}像素")
# 输出像素面积最小的类别及其像素的宽和高
min_class_id = min(category_min_area, key=lambda class_id: category_min_area[class_id]['area'])
min_width = category_min_area[min_class_id]['width']
min_height = category_min_area[min_class_id]['height']
print(f"像素面积最小的类别:类别{min_class_id}")
print(f"最小面积目标的长宽值:{min_width}x{min_height}像素")
根据标注文件统计不同大小目标的数量
于 2024-03-19 19:41:11 首次发布