在CV的目标检测中,我们经常需要对数据集进行数据分析,比如分析数据集中的类别的GT框的数量、图片的像素尺寸、GT框的尺寸和长宽比等。下面的代码就是用python脚本实现对类别的GT框的数量的分析。
这是我们常见是标签格式是yolo的数据集的样式,分析类别的GT框数量只需要使用待分析的lables的路径即可。
读取的数据集目标的格式:
目录:
dataset:绝对路径:"C:\Desktop\dataset"
--images:绝对路径:"C:\Desktop\dataset\images"
----.jpg
--labels:绝对路径:"C:\Desktop\dataset\labels"
.....txt
.txt文件的标签格式yolo格式(例子):
3 0.385417 0.498148 0.0625 0.033333
数据集是这样子的,同时给出了标签的格式。labels目录中的.txt中的数据是目标检测的标签数据,每一行数据分别对应一个GT框,每一行数据从左到右分别是:id, x,y,w,h。列1 - 目标类别id , 列2 - 目标中心位置x, 列3 - 目标中心位置y, 列4 - 目标宽度w,列5 - 目标高度h。x,y,w,h是小于1的浮点数,因为是经过对图像进行了归一化处理得到的值,也就是目标的真实的x,w值除以图像的宽度,y,h除以图像的高度。
完整的python脚本如下:
import os
from collections import Counter
from tqdm import tqdm
def count_classes_in_labels(labels_directory):
"""
统计给定目录(包括所有子目录)中所有.txt标签文件内各个类别的GT框数量,
并按类别GT框数量占比从大到小排序输出。同时输出所有类别的GT框总数。
参数:
labels_directory (str): 存放.txt标签文件的根目录。
返回:
None: 结果直接打印到控制台。
"""
# 创建一个Counter对象来存储每个类别的GT框计数
category_counts = Counter()
# 获取所有标签文件的完整路径
label_files = [os.path.join(root, file)
for root, dirs, files in os.walk(labels_directory)
for file in files if file.endswith(".txt")]
# 使用tqdm遍历所有标签文件
for filepath in tqdm(label_files, desc="Processing label files", unit="file"):
# 打开并读取文件
with open(filepath, 'r') as file:
for line in file:
# 分割每行数据,获取类别ID
try:
category_id = int(line.split()[0])
category_counts[category_id] += 1
except (ValueError, IndexError):
print(f"Warning: Could not parse line in file {filepath}. Line: {line.strip()}")
# 计算所有GT框的总数
total_gt_boxes = sum(category_counts.values())
# 创建一个列表,其中包含每个类别的GT框数量和占比
results = []
for category_id, count in category_counts.items():
percentage = (count / total_gt_boxes) * 100
results.append((category_id, count, percentage))
# 按照占比从大到小排序
sorted_results = sorted(results, key=lambda x: x[2], reverse=True)
# 输出排序后的每个类别的GT框数量和占比
for category_id, count, percentage in sorted_results:
print(f"Category {category_id}: GT Boxes = {count}, Percentage = {percentage:.2f}%")
# 输出所有类别的GT框总数
print(f"Total GT boxes: {total_gt_boxes}")
# 调用函数
source_labels_dir = #标签label目录路径
count_classes_in_labels(source_labels_dir)