CV计算机视觉的数据集分析python脚本:数据集中的标签信息可视化,将标签文件中定义的边界框(Bbox)绘制到对应的图像上,并保存这些带有边界框的图像。

这段代码的主要目的是处理一个数据集中的图像和标签文件,将标签文件中定义的边界框(Bbox)绘制到对应的图像上,并保存这些带有边界框的图像。通过这种方式,可以将数据集中的标签信息可视化,便于进一步的分析和处理。常用于CV中的目标检测数据集的标签质量检查。

这是我们常见是标签格式是yolo的数据集的格式:
目录:
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除以图像的高度。

以下是代码的详细思路和步骤:

  1. 定义路径

    • root_dir:数据集的根目录路径(需要用户自行指定)。
    • images_dir:存放原始图像的目录路径。
    • labels_dir:存放标签文件的目录路径。
    • output_images_plot_dir:存放绘制了边界框的图像的输出目录路径。
  2. 创建

### YOLO 数据集统计分析 对于YOLO目标检测数据集的统计分析,可以分为以下几个方面:类别分布、图像形状以及随机样本可视化。以下是详细的实现方法。 #### 类别分布统计 通过读取标注文件中的类别标签,计算每种类别的数量绘制柱状图来展示类别分布情况。 ```python import os from collections import Counter import matplotlib.pyplot as plt def count_classes(annotations_dir): class_counts = Counter() for annotation_file in os.listdir(annotations_dir): with open(os.path.join(annotations_dir, annotation_file), 'r') as f: lines = f.readlines() for line in lines: parts = line.strip().split(' ') class_id = int(parts[0]) class_counts[class_id] += 1 return dict(class_counts) # 假设标注目录为 annotations/ class_distribution = count_classes("annotations/") plt.bar(range(len(class_distribution)), list(class_distribution.values())) plt.xticks(range(len(class_distribution)), list(class_distribution.keys())) plt.xlabel("Class ID") plt.ylabel("Count") plt.title("Category Distribution of Dataset") plt.show() ``` 上述代码实现了对YOLO格式标注文件中类别的统计,生成了类别分布的柱状图[^1]。 #### 图像尺寸统计 通过对数据集中所有图片的高度和宽度进行遍历,记录下它们的分辨率分布情况。 ```python from PIL import Image def get_image_sizes(image_dir): sizes = [] for image_file in os.listdir(image_dir): img_path = os.path.join(image_dir, image_file) try: with Image.open(img_path) as img: width, height = img.size sizes.append((width, height)) except Exception as e: print(f"Error processing {img_path}: {e}") return sizes image_sizes = get_image_sizes("images/") sizes_counter = Counter(image_sizes) # 绘制直方图显示不同分辨率的数量 fig, ax = plt.subplots(figsize=(8,6)) ax.bar(sizes_counter.keys(), sizes_counter.values()) ax.set_xlabel("Image Size (Width x Height)") ax.set_ylabel("Frequency") ax.set_title("Distribution of Image Sizes") plt.xticks(rotation=90) plt.tight_layout() plt.show() ``` 这段脚本会扫描指定路径下的所有图片文件,获取其宽高信息,最终绘制成频率直方图。 #### 随机样本可视化 为了直观理解数据质量及多样性,可以从数据集中抽取若干张带有边界框标记的图片作为样例查看。 ```python import random import cv2 import numpy as np COLORS = np.random.uniform(0, 255, size=(len(class_distribution), 3)) def visualize_random_sample(image_dir, annotations_dir, num_samples=5): all_images = os.listdir(image_dir) sampled_images = random.sample(all_images, min(num_samples, len(all_images))) fig, axes = plt.subplots(1, len(sampled_images), figsize=(15, 5)) for i, image_name in enumerate(sampled_images): img_path = os.path.join(image_dir, image_name) ann_path = os.path.join(annotations_dir, os.path.splitext(image_name)[0]+'.txt') img = cv2.imread(img_path) h, w, _ = img.shape with open(ann_path, 'r') as f: bboxes = [list(map(float, l.split())) for l in f.read().strip().splitlines()] for bbox in bboxes: cls_idx = int(bbox[0]) color = COLORS[cls_idx % len(COLORS)] cx, cy, bw, bh = map(lambda x: float(x)*w if idx%2==0 else float(x)*h, bbox[1:]) xmin, ymin = int(cx-bw//2), int(cy-bh//2) xmax, ymax = int(cx+bw//2), int(cy+bh//2) cv2.rectangle(img, (xmin,ymin),(xmax,ymax),color=color,thickness=2) axes[i].imshow(cv2.cvtColor(img,cv2.COLOR_BGR2RGB)) axes[i].axis('off') visualize_random_sample("images/", "annotations/") ``` 此函数选取一定数量的数据点,在原始图像上画出预测边框以便观察效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值