解决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>中(我的custom_dir是ILSVRC2012_img_val),然后在DataLoader中设置root为val文件夹的路径
在这里插入图片描述

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
`datasets.ImageFolder`是PyTorch中用于加载图像数据集的一个类。它可以根据文件夹和文件夹中的图像文件来创建数据集,并且可以自动地将图像数据进行预处理和标准化。 使用`datasets.ImageFolder`可以方便地加载和处理图像数据集。下面是一个示例代码,展示了如何使用`datasets.ImageFolder`加载一个数据集: ```python import torch from torchvision import datasets, transforms # 数据预处理和标准化 data_transform = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) # 加载数据集 train_dataset = datasets.ImageFolder(root='path/to/train/data', transform=data_transform) val_dataset = datasets.ImageFolder(root='path/to/val/data', transform=data_transform) test_dataset = datasets.ImageFolder(root='path/to/test/data', transform=data_transform) # 创建数据加载器 train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=32, shuffle=True) val_loader = torch.utils.data.DataLoader(val_dataset, batch_size=32, shuffle=False) test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=32, shuffle=False) ``` 在上面的示例代码中,我们首先定义了一个`data_transform`,用于对图像数据进行预处理和标准化。然后,我们使用`datasets.ImageFolder`类分别加载了训练集、验证集和测试集,并将`data_transform`应用到每个数据集中的所有图像上。最后,我们使用PyTorch的`DataLoader`类创建了数据加载器,用于在训练、验证和测试模型加载数据集
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值