解决PyTorch使用datasets.ImageFolder导入ImageNet数据集时出现的错误

  • 相关报错如下:
......
  File "D:\ComputerVision\Anaconda3\lib\site-packages\torchvision\datasets\folder.py", line 207, in __init__
    is_valid_file=is_valid_file)
  File "D:\ComputerVision\Anaconda3\lib\site-packages\torchvision\datasets\folder.py", line 99, in __init__
    "Supported extensions are: " + ",".join(extensions)))
RuntimeError: Found 0 files in subfolders of: F:\Datas\ILSVRC-2012\ILSVRC2012_img_val
Supported extensions are: .jpg,.jpeg,.png,.ppm,.bmp,.pgm,.tif,.tiff,.webp

  • 问题分析:

其中ILSVRC2012_img_val文件夹是val集的数据 (“ILSVRC2012_img_val.tar”) 解压后的路径,从报错的描述直接来看,是该文件夹下没有满足".jpg,.jpeg,.png,.ppm,.bmp,.pgm,.tif,.tiff,.webp"其一后缀的文件,但是实际上,文件夹里面都是xx.JPEG文件。

小白的我一开始还以为是后缀.JPEG大写了,去看了xx\Anaconda3\lib\site-packages\torchvision\datasets\folder.py源文件之后,发现DataLoader在加载数据时会自动检查文件后缀名,而在这之前已经对文件名字符串做了.lower()操作,此外我还特地不使用DataLoader而是单独对这个文件夹中的文件检查后缀名,发现后缀名是满足的,因此问题不在于文件夹内的JPEG图片,而是出自别处。

def has_file_allowed_extension(filename, extensions):
    """Checks if a file is an allowed extension.

    Args:
        filename (string): path to a file
        extensions (tuple of strings): extensions to consider (lowercase)

    Returns:
        bool: True if the filename ends with one of given extensions
    """
    # print(filename, filename.lower(), filename.lower().endswith(extensions))
    return filename.lower().endswith(extensions)


def is_image_file(filename):
    """Checks if a file is an allowed image extension.

    Args:
        filename (string): path to a file

    Returns:
        bool: True if the filename ends with a known image extension
    """
    return has_file_allowed_extension(filename, IMG_EXTENSIONS)

IMG_EXTENSIONS = ('.jpg', '.jpeg', '.png', '.ppm', '.bmp', '.pgm', '.tif', '.tiff', '.webp')

那为什么会导致文件夹下都是.JPEG后缀的图片,却报错没有一个文件满足后缀呢? 后来参考了一些文章(特别是这篇–传送门),发现可能是由于Windows系统目录的问题,于是将ILSVRC2012_img_val文件夹放在val文件夹下,ImageFolder的root参数设为"xx/val",此时val文件夹下只有一个文件夹ILSVRC2012_img_val,这时候再加载数据就不会报错了。

我不清楚具体的原因,可能是因为遍历文件夹使用的函数os.walk(top)的问题,可能是windows系统目录中的路径分隔符的问题,等等原因皆有可能,只是小白说不出来而已。我只在Windows系统下尝试过,没有在Linux系统下进行相关操作,猜测这个问题只会在Windows系统中出现。

  • 具体解决方法:

将val/test集的数据解压到val/中(我的custom_dir是ILSVRC2012_img_val),然后在DataLoader中设置root为val文件夹的路径
解决PyTorch使用datasets.ImageFolder导入ImageNet数据集时出现的错误_第1张图片

解决PyTorch使用datasets.ImageFolder导入ImageNet数据集时出现的错误_第2张图片

你可能感兴趣的:(PyTorch问题,python,pytorch)