【图像分类】将目标文件数据划分训练集、验证集和测试集三个文件夹,并加载数据

 一、训练集、验证集和测试集三个文件夹的划分:

代码:

import os
import random
from shutil import copy2


def data_set_split(src_data_folder, target_data_folder, slice_data = [0.4,0.3,0.3]):
    '''
    读取源数据文件夹,生成划分好的文件夹,分为trian、val、test三个文件夹进行
    :param src_data_folder: r"D:\Desktop\segmentation_2021\data"
    :param target_data_folder: 目标文件夹 r"D:\Desktop\segmentation_2021\a"
    :param slice_data: 划分数据比例比例  训练 验证 测试所占百分比
    :return:
    '''
    print("开始数据集划分")
    class_names = os.listdir(src_data_folder)
    # 在目标目录下创建文件夹
    split_names = ['train', 'val', 'test']
    for split_name in split_names:
        split_path = os.path.join(target_data_folder, split_name)
        if os.path.isdir(split_path):
            pass
        else:
            os.mkdir(split_path)
        # 然后在split_path的目录下创建类别文件夹
        for class_name in class_names:
            class_split_path = os.path.join(split_path, class_name)
            if os.path.isdir(class_split_path):
                pass
            else:
                os.mkdir(class_split_path)

    # 按照比例划分数据集,并进行数据图片的复制
    # 首先进行分类遍历
    for class_name in class_names:
        current_class_data_path = os.path.join(src_data_folder, class_name)
        current_all_data = os.listdir(current_class_data_path)
        current_data_length = len(current_all_data)
        current_data_index_list = list(range(current_data_length))
        random.shuffle(current_data_index_list)

        train_folder = os.path.join(os.path.join(target_data_folder, 'train'), class_name)
        val_folder = os.path.join(os.path.join(target_data_folder, 'val'), class_name)
        test_folder = os.path.join(os.path.join(target_data_folder, 'test'), class_name)
        train_stop_flag = current_data_length * slice_data[0]
        val_stop_flag = current_data_length * (slice_data[0] + slice_data[1])
        current_idx = 0
        train_num = 0
        val_num = 0
        test_num = 0
        for i in current_data_index_list:
            src_img_path = os.path.join(current_class_data_path, current_all_data[i])
            if current_idx <= train_stop_flag:
                copy2(src_img_path, train_folder)
                # print("{}复制到了{}".format(src_img_path, train_folder))
                train_num = train_num + 1
            elif (current_idx > train_stop_flag) and (current_idx <= val_stop_flag):
                copy2(src_img_path, val_folder)
                # print("{}复制到了{}".format(src_img_path, val_folder))
                val_num = val_num + 1
            else:
                copy2(src_img_path, test_folder)
                # print("{}复制到了{}".format(src_img_path, test_folder))
                test_num = test_num + 1

            current_idx = current_idx + 1

        print("*********************************{}*************************************".format(class_name))
        print(
            "{}类按照{}:{}:{}的比例划分完成,一共{}张图片".format(class_name, slice_data[0], slice_data[1], slice_data[2], current_data_length))
        print("训练集{}:{}张".format(train_folder, train_num))
        print("验证集{}:{}张".format(val_folder, val_num))
        print("测试集{}:{}张".format(test_folder, test_num))


if __name__ == '__main__':
    src_data_folder = r"D:\Desktop\segmentation_2021\data"
    target_data_folder = r"D:\Desktop\segmentation_2021\a"
    data_set_split(src_data_folder, target_data_folder, slice_data=[0.6,0.2,0.2])

参考:https://zhuanlan.zhihu.com/p/199238910

 二、数据加载

         划分之后的数据加载。

代码:

import torch.utils.data as Data
import numpy as np
import torchvision
import matplotlib.pyplot as plt

data_transform = torchvision.transforms.Compose([
    torchvision.transforms.Resize((128,128)), # 将图片的尺寸 Resize 到128*128
    torchvision.transforms.ToTensor(), # 转为张量并归一化到[0,1](是将数据除以255),且会把H*W*C会变成C *H *W
    torchvision.transforms.Normalize(mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225],)]) # 数据归一化处理
path = r"D:\Desktop\train"  # train数据的上一层目录(即数据的上一层目录)
train_data = torchvision.datasets.ImageFolder(root=path,transform=data_transform)

train_data_loader = Data.DataLoader(
    dataset=train_data,
    batch_size=32,
    shuffle=True,
)

  • 12
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个Python代码示例,可以按照指定的比例划分数据集为训练集验证集测试集,并将结果保存在三个文件夹中: ```python import os import shutil import random # 设置数据集路径和划分比例 data_dir = "/path/to/dataset" train_ratio = 0.6 val_ratio = 0.2 test_ratio = 0.2 # 创建保存训练集验证集测试集文件夹 train_dir = os.path.join(data_dir, "train") val_dir = os.path.join(data_dir, "val") test_dir = os.path.join(data_dir, "test") os.makedirs(train_dir, exist_ok=True) os.makedirs(val_dir, exist_ok=True) os.makedirs(test_dir, exist_ok=True) # 遍历数据文件夹,将文件名和对应的标签存储到列表中 data = [] for label in os.listdir(data_dir): label_dir = os.path.join(data_dir, label) if os.path.isdir(label_dir): file_list = os.listdir(label_dir) for file_name in file_list: file_path = os.path.join(label_dir, file_name) data.append((file_path, label)) # 打乱数据集顺序 random.shuffle(data) # 计算数据集的大小 data_size = len(data) train_size = int(data_size * train_ratio) val_size = int(data_size * val_ratio) test_size = data_size - train_size - val_size # 将数据划分训练集验证集测试集 train_data = data[:train_size] val_data = data[train_size:train_size+val_size] test_data = data[-test_size:] # 将训练集验证集测试集文件复制到对应的文件夹中 for file_path, label in train_data: label_dir = os.path.join(train_dir, label) os.makedirs(label_dir, exist_ok=True) shutil.copy(file_path, label_dir) for file_path, label in val_data: label_dir = os.path.join(val_dir, label) os.makedirs(label_dir, exist_ok=True) shutil.copy(file_path, label_dir) for file_path, label in test_data: label_dir = os.path.join(test_dir, label) os.makedirs(label_dir, exist_ok=True) shutil.copy(file_path, label_dir) ``` 请注意,上述代码假设数据集的每个类别都存储在一个单独的文件夹中,并且每个文件夹包含该类别的所有图像。如果您的数据集不符合这种结构,您需要相应地修改代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清纯世纪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值