如何从一个大文件夹中读取图片并将其拆分为训练,验证和测试集?

时间:2019-10-12 00:05:58

标签: python deep-learning pytorch training-data

我正在使用pytorch来开发手语手势分类器,我的图片类似于位于以该特定字母为标题的文件夹中的每个字母。例如。文件夹“ A”具有“ 1_A_1.jpg”,“ 1_A_2.jpg”,“ 21_A_3.jpg”等。

我正在尝试构建一个功能:

  1. 遍历不同的文件夹
  2. 将数据分为训练,验证和测试集
  3. 用相应的文件夹名称(即字母标签)标记这些图片
  4. 返回3个经过训练,测试和验证的已创建文件夹

所有在线代码都显示了从Torchvision数据集(内置数据集)中分离数据的示例,而不是从头开始。

我在stackoverflow上发现了以下内容:

import os
import numpy as np
import argparse

def get_files_from_folder(path):

    files = os.listdir(path)
    return np.asarray(files)

def main(path_to_data, path_to_test_data, train_ratio):
    # get dirs
    _, dirs, _ = next(os.walk(path_to_data))

    # calculates how many train data per class
    data_counter_per_class = np.zeros((len(dirs)))

    for i in range(len(dirs)):
        path = os.path.join(path_to_data, dirs[i])
        files = get_files_from_folder(path)
        data_counter_per_class[i] = len(files)
    test_counter = np.round(data_counter_per_class * (1 - train_ratio))

    # transfers files
    for i in range(len(dirs)):
        path_to_original = os.path.join(path_to_data, dirs[i])
        path_to_save = os.path.join(path_to_test_data, dirs[i])

        #creates dir
        if not os.path.exists(path_to_save):
            os.makedirs(path_to_save)
        files = get_files_from_folder(path_to_original)
        # moves data
        for j in range(int(test_counter[i])):
            dst = os.path.join(path_to_save, files[j])
            src = os.path.join(path_to_original, files[j])
            shutil.move(src, dst)

,当我尝试执行以下操作时:

path_to_data= r'path\A'
path_to_test_data=r"path\test"
train_ratio=0.8

main(path_to_data,path_to_test_data,train_ratio)

什么都没发生。

如果我可以将其用于培训和测试,则可以轻松地将其扩展以进行验证。

1 个答案:

答案 0 :(得分:1)

尝试一下:

from pathlib import Path

def main(data_path, out_path, train_ratio):
    #1
    dir_paths = [child for child in Path(data_path).iterdir() if child.is_dir()]

    for i, dir_path in enumerate(dir_paths):
        #2
        files = list(dir_path.iterdir())
        train_len = int(len(files) * (1 - train_ratio)) 

        #3
        out_dir = Path(out_path).joinpath(dir_path.name)
        if not out_dir.exists():
            out_dir.mkdir(parents=True)

        #4
        for file_ in files[:train_len]:
            file_.replace(out_dir.joinpath(file_.name))

if __name__ == '__main__':
    main('data', 'test', 0.8)