【问题标题】:Copy loaded Images to test, train and validation folders将加载的图像复制到测试、训练和验证文件夹
【发布时间】:2019-05-04 14:01:43
【问题描述】:

在这里我编写了一个加载图像的代码,然后我应该如何将这些图像分成三个文件夹;分别使用 70%、15% 和 15% 的比率进行训练、测试和验证。

      from os import listdir
        from PIL import Image as PImage
        import split_folders
        import os, os.path
        import numpy as np
        #imgs.append(Image.open(os.path.join(path,image))

        def loadImages(path):
            imagesList = listdir(path)
            loadedImages = []
            for image in imagesList:
                with open(os.path.join(path, image), 'rb') as i:
                    img = PImage.open(i)
                    loadedImages.append(img)
            return loadedImages

        path = "./Inputs/"
        imgs = loadImages(path)

        for img in imgs:
            print(img)




train, validate, test = np.split(imgs.sample(frac=1), [int(.7*len(imgs)), int(.85*len(imgs))])

这是错误的,因为它不支持列表对象

那么有什么解决办法吗?

【问题讨论】:

  • 你能再澄清一点吗?

标签: python image-processing


【解决方案1】:

要将文件复制到文件夹中,我们可以使用shutil.copyfile(os.path.join(resized_dir,x),os.path.join(train_dir,x))shutil.copyfile 方法:

下面的代码是这个问题的答案; (得到列表图像文件名而不是图像列表;

for x in train:
  shutil.copyfile(os.path.join(resized_dir,x),os.path.join(train_dir,x))

for y in validate:
  shutil.copyfile(os.path.join(resized_dir,y),os.path.join(valid_dir,y))

for z in test:
  shutil.copyfile(os.path.join(resized_dir,z),os.path.join(test_dir,z))

【讨论】:

    【解决方案2】:

    据我了解,函数 loadImages 返回 python list 对象。由于没有list.sample() 方法,字符串

    train, validate, test = np.split(imgs.sample(frac=1), [int(.7*len(imgs)), int(.85*len(imgs))])
    

    无效。所以,有一些方法可以打乱所有数据;例如,您可以使用 into numpy.random.shuffle 就地重新排序列表值:

    np.random.shuffle(imgs)  # now this list is shuffled
    train, validate, test = np.split(imgs, [int(.7*len(imgs)), int(.85*len(imgs))])
    

    注意,np.random.shuffle 保持对象的类型不变(如果它是一个列表)。我猜代码的其他部分是正确的。

    lst = [1,2,3]
    type(lst)
    Out:
    <class'list'>
    
    np.random.shuffle(lst)
    
    type(lst)
    Out:
    <class'list'>
    

    另外,sample 方法是 pandas 包默认数据重采样方法之一,但我想你不需要 pandas 在这里

    【讨论】:

    • 是的,loadImages 返回一个列表对象。是的,这里不需要“熊猫”。非常感谢您的建议@Mikhail
    • 那么我怎样才能将它们加载到一个文件夹@Mikhail
    • 我可以使用 shutil.copy 吗,我想不行,它应该是字符串
    • 这样的事情会起作用:stackoverflow.com/questions/14452824/…;如果您需要新文件夹,您可以按照此答案中的说明安全地创建它:stackoverflow.com/questions/273192/…。此外,我对PIL 不是很熟悉 :)
    猜你喜欢
    • 1970-01-01
    • 2021-12-10
    • 2019-06-13
    • 2012-06-04
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 2020-04-28
    • 2020-06-16
    相关资源
    最近更新 更多