gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:59:14 24 4
gpt4 key购买 nike

我当前的数据集在多个文件夹中包含图像,按类别标记。我想在这些目录中创建“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 文件夹并将 cake-->test 文件夹留空,并且不移动任何 BEAN 图像。谁能看到我的代码在哪里未能遵循使用 BEANS 文件夹的步骤,并将 30% 的蛋糕图像移动到测试文件夹?

最佳答案

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

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)

关于python - 尝试将图像分成多个文件夹来训练和测试文件夹,但代码仅读取/复制最后一个文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59691729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com