使用 Pytorch 或 Python 将包含图像的目录拆分为子文件夹

Bak*_*war 4 python pytorch

我有一个包含两个子目录的目录。每个子目录都有一堆图像。这些子目录还指定了两类图像。

我想要 3 个目录(训练、验证、测试),并且在这 3 个子目录中的每一个中,我想要每个类的 2 个子目录分别带有图像。

我想通过随机抽样将 no.of 图像分成 train、val、test 目录。所以大约 60% 的图像用于训练,20、val 和 20 用于测试。

初始结构:

Main_folder
 - Good
 - Bad 
Run Code Online (Sandbox Code Playgroud)

我想要的是:

Main_folder: 
 - Train 
  - Good
  - Bad
 - Val
  - Good 
  - Bad
 - Test 
  - Good 
  - Bad
Run Code Online (Sandbox Code Playgroud)

我想将每个子目录分成两个目录,随机分配图像(

Szy*_*zke 6

有一种pytorch方法可以做到这一点(我建议使用单个库来完成如此简单的任务)。

创建数据集

里面有一个预制的torchvision,即ImageFolder.

只需像这样使用它:

import torchvision

dataset = torchvision.datasets.ImageFolder("./my_data")
Run Code Online (Sandbox Code Playgroud)

这将创建一个数据集,其中Good文件夹分别具有0标签和这些文件夹中每个图像的Bad标签1

分为训练、验证、测试

不需要sklearn这么简单的工作 +torch也有大部分numpy功能,我宁愿坚持使用一个库而不是 3 个(尽管train_test_split可以连续使用两次,类似于@ESZ提出的)。

国际海事组织更简单的是:

def get_subset(indices, start, end):
    return indices[start : start + end]


TRAIN_PCT, VALIDATION_PCT = 0.6, 0.2  # rest will go for test
train_count = int(len(dataset) * TRAIN_PCT)
validation_count = int(len(dataset) * TRAIN_PCT)

indices = torch.randperm(len(dataset))

train_indices = get_subset(indices, 0, train_count)
validation_indices = get_subset(indices, train_count, validation_count)
test_indices = get_subset(indices, train_count + validation_count, len(dataset))
Run Code Online (Sandbox Code Playgroud)

这将为创建指数SubsetRandomSamplertorch.utils.data.DataLoader。所以,再次类似于@ESZ

dataloaders = {
    "train": torch.utils.data.DataLoader(
        dataset, sampler=SubsetRandomSampler(train_indices)
    ),
    "validation": torch.utils.data.DataLoader(
        dataset, sampler=SubsetRandomSampler(validation_indices)
    ),
    "test": torch.utils.data.DataLoader(
        dataset, sampler=SubsetRandomSampler(test_indices)
    ),
}
Run Code Online (Sandbox Code Playgroud)

您可以指定batch_size和其他参数DataLoader,如果您需要更多信息,请参阅文档