Как читать картинки из большой папки и разбивать их на обучающие, проверочные и тестовые наборы? - PullRequest
0 голосов
/ 12 октября 2019

Я работаю над классификатором жестового языка с использованием pytorch, у меня есть картинки, напоминающие каждую букву, находящиеся в папке, озаглавленной этой конкретной буквой. Например, папка "A" содержит "1_A_1.jpg", "1_A_2.jpg", "21_A_3.jpg" .. и т. Д.

Я пытаюсь создать функцию, которая:

  1. Перебирает различные папки
  2. Разбивает данные на обучающие, проверочные и тестовые наборы
  3. Помечает эти изображения соответствующими именами папок (т.е. буквенной меткой)
  4. Возвращает 3созданные папки, которые обучаются, тестируются и проверяются

Весь онлайн-код показывает примеры разделения данных, поступающих из наборов данных torchvision (встроенных наборов данных), ничего с нуля.

Iобнаружил следующее в 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 Ответ

1 голос
/ 12 октября 2019

Попробуй:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...