关于图像分类任务中划分数据集,并且生成分类类别的josn字典文件

1. 前言

在做图像分类任务的时候,数据格式是文件夹格式,相同文件夹下存放同一类型的类别

不少网上的数据,没有划分数据集,虽然代码简单,每次重新编写还是颇为麻烦,这里记录一下

如下,有的数据集这样摆放:

可以看出这是个三分类任务,不过没有划分测试集、验证集

代码存放位置:和数据集dataset 同一路径

2. 完整代码

如下:

python 复制代码
import random
import os
import shutil
from tqdm import tqdm
import json


def split_data(root, test_rate, flag=True):
    # 待分类数据的当前目录
    classes_directory = [i for i in os.listdir(root) if os.path.isdir(os.path.join(root, i))]

    # 建立生成后的目录,方便拷贝
    for i in classes_directory:
        os.makedirs(os.path.join('./data/train', i))  # 训练集
        os.makedirs(os.path.join('./data/test', i))  # 测试集

    # 是否生成类别的 json 字典文件,默认生成
    if flag:
        class_indices = dict((k, v) for v, k in enumerate(classes_directory))
        json_str = json.dumps(dict((val, key) for key, val in class_indices.items()), indent=4)
        with open('class_indices.json', 'w') as json_file:
            json_file.write(json_str)

    # 遍历每个文件夹下的文件
    for cla in classes_directory:
        cla_path = os.path.join(root, cla)  # 每个文件夹的路径
        images_path = [os.path.join(root, cla, i) for i in os.listdir(cla_path)]

        # 按比例随机采样测试集样本
        test_split_path = random.sample(images_path, k=int(len(images_path) * test_rate))

        # 划分数据
        for i in tqdm(images_path, desc=cla):
            if i in test_split_path:
                shutil.copy(i, os.path.join('./data/test', cla))
            else:
                shutil.copy(i, os.path.join('./data/train', cla))


if __name__ == '__main__':
    rawDataSet = './dataset'  # 原始数据的路径

    if os.path.exists('./data'):  # 如果之前有,那么删除
        shutil.rmtree('./data')

    os.makedirs('./data/train')
    os.makedirs('./data/test')

    # 划分数据
    split_data(root=rawDataSet, test_rate=0.2)

运行代码过程:

运行结果:

生成的json文件:

3. 代码介绍

首先,rawDataSet 传入的是待划分的数据集根目录,这里会将之前划分的删掉,这样每次生成的结果不一样。训练集和测试集的比例为0.2

这里按照本人平时的习惯,划分好的目录结构如下

--data-train- 不同类别的文件夹

--data-test- 不同类别的文件夹

接下来这部分是读取每个子文件夹,或者说分类的classes(因为分类任务的文件夹就是class)

这里根据子文件夹名生成对应的json字典文件

划分数据,测试集会根据总数据的个数 * 划分比例 (test_rate)

遍历全部的数据,如果目标在测试集,那么就是测试集数据;否则为训练数据

如果是目标检测或者分割,数据和标签是分开的单独文件,划分的过程类似,后续会看着写写看

相关推荐
羊小猪~~10 分钟前
数据库学习笔记(十七)--触发器的使用
数据库·人工智能·后端·sql·深度学习·mysql·考研
摸爬滚打李上进28 分钟前
重生学AI第十六集:线性层nn.Linear
人工智能·pytorch·python·神经网络·机器学习
HuashuiMu花水木29 分钟前
PyTorch笔记1----------Tensor(张量):基本概念、创建、属性、算数运算
人工智能·pytorch·笔记
lishaoan7733 分钟前
使用tensorflow的线性回归的例子(四)
人工智能·tensorflow·线性回归
AI让世界更懂你41 分钟前
【ACL系列论文写作指北15-如何进行reveiw】-公平、公正、公开
人工智能·自然语言处理
牛客企业服务2 小时前
2025年AI面试推荐榜单,数字化招聘转型优选
人工智能·python·算法·面试·职场和发展·金融·求职招聘
视觉语言导航2 小时前
RAL-2025 | 清华大学数字孪生驱动的机器人视觉导航!VR-Robo:面向视觉机器人导航与运动的现实-模拟-现实框架
人工智能·深度学习·机器人·具身智能
**梯度已爆炸**2 小时前
自然语言处理入门
人工智能·自然语言处理
ctrlworks3 小时前
楼宇自控核心功能:实时监控设备运行,快速诊断故障,赋能设备寿命延长
人工智能·ba系统厂商·楼宇自控系统厂家·ibms系统厂家·建筑管理系统厂家·能耗监测系统厂家
BFT白芙堂3 小时前
睿尔曼系列机器人——以创新驱动未来,重塑智能协作新生态(上)
人工智能·机器学习·机器人·协作机器人·复合机器人·睿尔曼机器人