根据标注文件统计不同大小目标的数量

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}像素")

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值