Попытка разделить изображения на несколько папок для обучения и проверки папки, но код только читает / копирует последнюю папку - PullRequest
0 голосов
/ 11 января 2020

Мой текущий набор данных содержит изображения в нескольких папках, помеченных классом. Я хочу создать папку 'train' и 'test' и папки классов внутри этих каталогов. Затем я хочу поместить 70% изображений в папки 'train' и 30% изображений в папку 'test', например:

Train Folder
Папка Beans:

  • img1
  • img2
  • ...

Папка для тортов:

  • img1
  • ...

Мой код для этого прямо сейчас (сейчас я тестирую небольшой набор данных):

classes = ('BEANS', 'CAKE') #'Candy', 'Cereal', 'Chips', 'Chocolate',
          # 'Coffee', 'Corn', 'Fish', 'Flour', 'Honey', 'Jam', 'Juice',
          # 'Milk', 'Nuts', 'Oil', 'Pasta', 'Rice', 'Soda', 'Spices',
          # 'Sugar', 'Tea', 'Tomato Sauce', 'Vinegar', 'Water')

# create sub-folders for each class
OUTPATH = 'C:\\Users\\User\\Documents\\Dataset\\freiburg_groceries_dataset\\sets'
for x in classes:
    os.makedirs(OUTPATH+'\\train\\'+x, exist_ok=True)
    os.makedirs(OUTPATH+'\\test\\'+x, exist_ok=True)

INPATH = 'C:\\Users\\User\\Documents\\Dataset\\freiburg_groceries_dataset\\imgs'
filenames = os.listdir(INPATH + '\\' + x)
counts = {x:0 for x in classes}
for x in classes:
    print(len(filenames))
    print(filenames)

testset = len(filenames) / 10 * 0.3 # 30%

for fl in filenames:
    for cl in classes:
        if cl in fl:
            counts[cl] += 1 # increase count +1
            if counts[cl] < testset:
                shutil.move(INPATH + '\\' + x + '\\' + fl, OUTPATH+'\\test\\'+cl+'\\'+fl)
            else:
                shutil.move(INPATH + '\\' + x + '\\' + fl, OUTPATH+'\\train\\'+cl+'\\'+fl)

Мой код создает нужные мне папки, но затем он читает только папку CAKE и игнорирует папку BEANS. Он также перемещает все изображения тортов в папку поезда и оставляет пустую папку торт -> тест, и не перемещает изображения BEAN. Может кто-нибудь увидеть, где мой код не выполняет шаги по работе с папкой BEANS и перемещает 30% образов тортов в тестовую папку?

1 Ответ

0 голосов
/ 11 января 2020

Я думаю, что есть два места, где ваш код не работает должным образом.

OUTPATH = 'C:\\Users\\User\\Documents\\Dataset\\freiburg_groceries_dataset\\sets'
for x in classes:
    os.makedirs(OUTPATH+'\\train\\'+x, exist_ok=True)
    os.makedirs(OUTPATH+'\\test\\'+x, exist_ok=True)

INPATH = 'C:\\Users\\User\\Documents\\Dataset\\freiburg_groceries_dataset\\imgs'
filenames = os.listdir(INPATH + '\\' + x) # <------ source of error no. 1 `x` is already defined in the loop and holds the last value that it contained i.e. `cake`

необходимы исправления

filenames = []
for x in classes:
    filenames.extend(os.listdir(INPATH + '\\' + x))

, а следующее -

for x in classes:
    print(len(filenames))
    print(filenames)

testset = len(filenames) / 10 * 0.3 # <----- source of error no.2 This is not 30% rather 3 percent only (don't divide by 10).

Редактировать: (следующее будет гораздо более простым решением, которое вы бы искали)

classes = ('BEANS', 'CAKE')
# create sub-folders for each class
OUTPATH = 'C:\\Users\\User\\Documents\\Dataset\\freiburg_groceries_dataset\\sets'
INPATH = 'C:\\Users\\User\\Documents\\Dataset\\freiburg_groceries_dataset\\imgs'

for class in classes:

    train_path = OUTPATH + '\\train\\' + class + '\\'
    test_path  = OUTPATH + '\\test\\' + class + '\\'

    in_path    = INPATH + '\\' + class + '\\'

    os.makedirs(train_path , exist_ok=True)
    os.makedirs(test_path, exist_ok=True)

    filenames = os.listdir(in_path)

    no_of_pictures = len(filenames)

    test_set = int(len(filenames) * 0.3)
    train_set= len(filenames) - test_set

    test_imgs = filenames[:test_set]
    train_imgs = filenames[test_set:]

    for test_img in test_imgs:
        shutil.move( inpath + test_img, test_path + test_img)
    for train_img in train_imgs:
        shutil.move( inpath + train_img, train_path + train_img)
...