【问题标题】:"RuntimeError: Found 0 files in subfolders of ".. Error about subfolder in Pytorch“RuntimeError:在“.. 的子文件夹中找到 0 个文件。Pytorch 中的子文件夹错误
【发布时间】:2020-12-29 09:56:03
【问题描述】:

我目前基于 Window 10、Jupyter Notebook、Pytorch 1.0、Python 3.6.x。

首先我使用此代码确认文件的正确路径:print(os.listdir('./Dataset/images/'))

我可以检查这条路径是否正确。

但我遇到了Error

RuntimeError:在以下子文件夹中找到 0 个文件:./Dataset/images/ 支持的扩展名有:.jpg,.jpeg,.png,.ppm,.bmp,.pgm,.tif"

这是怎么回事? 您能提出解决方案吗?

我尝试./dataset/1/images 喜欢这种方法。但结果是一样的......

img_dir = './Dataset/images/'
img_data = torchvision.datasets.ImageFolder(os.path.join(img_dir), transforms.Compose([
            transforms.Scale(256),
            transforms.RandomResizedCrop(224),
            transforms.RandomHorizontalFlip(),
            transforms.ToTensor(),
            ]))
img_batch = data.DataLoader(img_data, batch_size=batch_size,
                               shuffle = True, drop_last=True)

【问题讨论】:

标签: python jupyter-notebook pytorch


【解决方案1】:

我在使用 celebA 时遇到了同样的问题,包括 200,000 张图片。我们可以看到有很多图像。但是在小样本情况下(我试了20张图片),我查了一下,不会报错,说明我们可以成功读取图片。 但是当数量增加时,我们应该使用其他方法。

我根据这个网站解决了这个问题。感谢陈启明 Github solution

简单地说,在原始文件夹中添加另一个名为 1 (/train/--->train/1/) 的文件夹将使我们的程序能够运行,无需更改路径。那是因为面对大型数据集时,图像应该在不同类别的子文件夹中排序。

Github 上的原始答案:

假设我要使用 ImageFolder("/train/") 来读取文件夹 train 中的 jpg 文件。 文件结构为 /火车/ -- 1.jpg -- 2.jpg -- 3.jpg

我未能加载它们,导致错误: RuntimeError:在以下子文件夹中找到 0 个图像:./data 支持的图片扩展名有:.jpg,.JPG,.jpeg,.JPEG,.png,.PNG,.ppm,.PPM,.bmp,.BMP

我阅读了上面的解决方案并尝试了数十次。当我将结构更改为 /train/1/

-- 1.jpg -- 2.jpg -- 3.jpg

但是读入的代码仍然是——ImageFolder("/train/"), IT WORKS.

似乎程序倾向于递归读取文件,这在某些情况下很方便。

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    你能发布你的文件结构吗?在您的情况下,它应该是:

    img_dir
    |_class1
      |_a.jpg
      |_b.jpg
    |_class2
      |_a.jpg
      |_b.jpg
    ...
    

    【讨论】:

    • 是的。绝对对!我搜索了其他文档,然后我发现了与您的评论相同的结论 :) Pytorch ImageFolder 预计是文件类!谢谢你的评论!!
    • downvoted - 面临同样的问题,但我们有文件类 'test' 和 'train'
    【解决方案3】:

    根据pytorch中DataLoader的规则,应该选择图片路径的上级路径。这意味着如果您的图像位于'./Dataset/images/',则数据加载器的路径应改为'./Dataset'。我希望它可以修复你的错误。:)

    【讨论】:

      【解决方案4】:

      你可以修改ImageFolder类直接进入根文件夹(不带子文件夹):

      class ImageFolder(Dataset):
          def __init__(self, root, transform=None):
              #Call make_dataset to collect files. 
              self.samples = make_dataset(opt.dataroot)
              self.imgs = self.samples
              self.transformA = transformA
      
              ...
      

      我们调用 make_dataset 方法来收集我们的文件:

      def make_dataset(dir):
          import os
          images = []
          d = os.path.expanduser(dir)
      
          if not os.path.exists(dir):
              print('path does not exist')
      
          for root, _, fnames in sorted(os.walk(d)):
              for fname in sorted(fnames):
                  path = os.path.join(root, fname)
                  images.append(path)
          return images    
      

      所有动作都发生在包含 os.walk 的循环中。在这里,文件是从“根”目录收集的,我们将其指定为包含文件的目录。

      【讨论】:

        【解决方案5】:

        请参阅ImageFolder 数据集的文档,了解此数据集类如何根据图像类将图像组织到 `./Dataset/images' 下的 子文件夹 中。确保您的图片符合此顺序。

        【讨论】:

        • 感谢您的评论!我发现了错误。但我无法理解这个解决方案。能给我解释一下吗??谢谢!
        【解决方案6】:

        显然,解决方案只是将图片名称设为字母数字。它们可能是另一种解决方案,但这是可行的。

        【讨论】:

          猜你喜欢
          • 2015-12-18
          • 2020-02-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-05
          • 1970-01-01
          相关资源
          最近更新 更多