尝试将图像分为多个文件夹以训练和测试文件夹,但是代码仅读取/复制最后一个文件夹

我当前的数据集在多个文件夹中有图像,按类别标记。我想创建一个“ train”和“ test”文件夹,并在这些目录中创建class文件夹。然后,我想将70%的图像放在“火车”文件夹中,并将30%的图像放在“测试”文件夹中,就像这样:

培训资料夹
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文件夹。它还会将所有蛋糕图像移动到train文件夹,并将cake-> test文件夹留为空白,并且不移动任何BEAN图像。谁能看到我的代码在哪里无法遵循使用BEANS文件夹的步骤,以及如何将30%的蛋糕图像移动到测试文件夹?

zzy447845870 回答:尝试将图像分为多个文件夹以训练和测试文件夹,但是代码仅读取/复制最后一个文件夹

我认为您的代码在两个地方无法正常工作。

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)
本文链接:https://www.f2er.com/2787288.html

大家都在问