试图在多个文件夹中分割图像以训练和测试文件夹,但代码仅读取/复制最后一个文件夹

2024-09-28 21:42:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我当前的数据集在多个文件夹中有图像,按类标记。我想在这些目录中创建一个“train”和“test”文件夹以及类文件夹。然后,我想将70%的图像放在“train”文件夹中,将30%的图像放在“test”文件夹中,如下所示:

列车文件夹
bean文件夹:

  • 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文件夹,并留下蛋糕-->;测试文件夹为空,不移动任何BEAN图像。有人能看到我的代码没有按照步骤操作BEANS文件夹和将30%的蛋糕图像移动到test文件夹的地方吗


Tags: 代码intest图像文件夹forcltrain
1条回答
网友
1楼 · 发布于 2024-09-28 21:42:15

我认为有两个地方您的代码没有按预期运行

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)

相关问题 更多 >