【目标检测】YOLO数据集信息统计:各类别实例数量&标注框

博客主要围绕统计YOLO格式数据集展开,涉及统计各类别实例数量以及目标框信息,运用Python和深度学习相关技术,属于目标检测领域。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

统计YOLO格式数据集的各类别实例数量&目标框信息:

import os
import random
import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
import seaborn as sn
from glob import glob
from PIL import Image, ImageDraw

category = ['class1']  
num_classes = len(category) 
print(num_classes)
colors = [(random.randint(0,255),random.randint(0,255),random.randint(0,255)) for _ in range(num_classes)] 

def plot_labels(labels, names=(), save_dir=''):
    # plot dataset labels
    print('Plotting labels... ')
    c, b = labels[:, 0], labels[:, 1:].transpose()  # classes, boxes
    nc = int(c.max() + 1)  # number of classes


    x = pd.DataFrame(b.transpose(), columns=['x', 'y', 'width', 'height'])

    # seaborn correlogram
    sn.pairplot(x, corner=True, diag_kind='auto', kind='hist', diag_kws=dict(bins=50), plot_kws=dict(pmax=0.9))
    plt.savefig(os.path.join(save_dir, 'labels_correlogram.jpg'), dpi=200)
    plt.close()

    # matplotlib labels
    matplotlib.use('svg')  # faster
    ax = plt.subplots(2, 2, figsize=(8, 8), tight_layout=True)[1].ravel()
    y = ax[0].hist(c, bins=np.linspace(0, nc, nc + 1) - 0.5, rwidth=0.8)
    data = {'category':names, 'nums':y[0]}
    df0 = pd.DataFrame(data)
    df0.to_excel(os.path.join(save_dir, 'labels.xlsx'), na_rep=False)

    # [y[2].patches[i].set_color([x / 255 for x in colors(i)]) for i in range(nc)]  # update colors bug #3195
    ax[0].set_ylabel('instances')
    if 0 < len(names) < 30:
        ax[0].set_xticks(range(len(names)))
        ax[0].set_xticklabels(names, rotation=90, fontsize=10)
    else:
        ax[0].set_xlabel('classes')

    sn.histplot(x, x='x', y='y', ax=ax[2], bins=50, pmax=0.9)
    sn.histplot(x, x='width', y='height', ax=ax[3], bins=50, pmax=0.9)

    # rectangles
    labels[:, 1:3] = 0.5  # center
    labels[:, 1:] = xywh2xyxy(labels[:, 1:]) * 2000
    img = Image.fromarray(np.ones((2000, 2000, 3), dtype=np.uint8) * 255)
    for cls, *box in labels[:1000]:
        ImageDraw.Draw(img).rectangle(box, width=1, outline=colors[int(cls)])  # plot
    ax[1].imshow(img)
    ax[1].axis('off')

    for a in [0, 1, 2, 3]:
        for s in ['top', 'right', 'left', 'bottom']:
            ax[a].spines[s].set_visible(False)

    plt.savefig(os.path.join(save_dir, 'labels.jpg'), dpi=200)
    matplotlib.use('Agg')
    plt.close()

def xywh2xyxy(x):
    # Convert nx4 boxes from [x, y, w, h] to [x1, y1, x2, y2] where xy1=top-left, xy2=bottom-right
    y = np.copy(x)
    y[:, 0] = x[:, 0] - x[:, 2] / 2  # top left x
    y[:, 1] = x[:, 1] - x[:, 3] / 2  # top left y
    y[:, 2] = x[:, 0] + x[:, 2] / 2  # bottom right x
    y[:, 3] = x[:, 1] + x[:, 3] / 2  # bottom right y
    return y

all_files = glob(r'old\labels\*.txt')
shapes = [] 
ids = []  
for file in all_files:
    if file.endswith('classes.txt'):
        continue
    with open(file, 'r') as f:
        for l in f.readlines():
            line = l.split()  # ['11' '0.724877' '0.309082' '0.073938' '0.086914']
            if len(line) == 0:
                print('Escape empty line')
            else:
                ids.append([int(line[0])])
                shapes.append(list(map(float, line[1:])))

shapes = np.array(shapes)
ids = np.array(ids)
lbs = np.hstack((ids, shapes))

# print(lbs)
plot_labels(labels=lbs, names=np.array(category))

### 处理YOLO模型训练时无类别标签的情况 当遇到YOLO模型训练过程中缺少类别标签的问题时,可以采取多种方法来解决问题并确保模型能够正常工作。 #### 1. 数据集准备与验证 确保数据集中存在有效的类别标签文件。通常情况下,YOLO格式的数据集应包含图像及其对应的`.txt`标注文件,其中每一行代表一个目标框以及其所属类别的索引编号[^1]。如果发现某些图片缺失相应的标签文件,则需补充这些信息;对于确实不存在任何物体的场景图,可以在对应位置创建空白(即仅含一行表示背景类或置信度极低的目标)的`.txt`文件以告知网络该处不含特定对象实例。 #### 2. 修改配置文件(dataset.yaml) 在定义自定义数据集结构时,通过编辑`dataset.yaml`中的`nc`参数指定实际拥有的分类数目,并调整`names`列表使其匹配各个整数ID所指代的具体名称。即使当前阶段仅有单一类别甚至暂时未知具体种类,也应当给予合理的初始设定以便后续扩展维护: ```yaml train: ./data/images/train/ val: ./data/images/valid/ nc: 1 # 类别数量 names: [&#39;object&#39;] # 对象名数组 ``` #### 3. 自动化工具辅助标记 考虑到手动添加大量样本可能耗费过多时间精力,在资源允许的情况下可借助第三方平台如LabelImg、VoTT等图形界面应用程序快速完成初步打标作业;亦或是利用一些开源项目提供的API接口实现一定程度上的自动化批量处理流程[^2]。 #### 4. 调试模式下的模拟测试 为了进一步排查是否存在其他潜在错误影响到整个系统的运行状态,建议开启调试选项观察程序执行过程中的日志输出情况。例如设置Python环境中变量`DEBUG=True`或将命令行调用语句附加相应标志位让框架提供更多内部细节供开发者分析定位问题所在[^3]。 ```python import os os.environ[&#39;DEBUG&#39;] = &#39;True&#39; from ultralytics import YOLO model = YOLO(&quot;yolov8n.yaml&quot;) results = model.train(data=&quot;custom_dataset.yaml&quot;, epochs=50, imgsz=640) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值