torchvision.datasets.ImageFolder()使用详解

一、数据集组织方式

ImageFolder假设所有的文件按文件夹保存,每个文件夹下存储同一个类别的图片,文件夹名为类名,大致样式是这样的:

1.1 给个简单的示例:

ImageFolder是一个通用的数据加载器,它要求我们以下面这种格式来组织数据集的训练、验证或者测试图片。

root/train/dog/xxx.png
root/train/dog/xxy.png
root/train/dog/xxz.png

root/valid/cat/123.png
root/valid/cat/nsdf3.png
root/valid/cat/asd932_.png

对于上面的root,假设data文件夹在.py文件的同级目录中,那么root一般都是如下这种形式:./data/train 和 ./data/valid

在这里插入图片描述

使用方法:

datasets.ImageFolder(os.path.join("root", 'train'), transform=transform_train)

注意:这样代码是正确的,虽然上述代码中没有显示的将train目录下的“cat、dog”给标出来,但是这是可以的,因为默认的加载方式中就必须要有标签信息才可以。

相反,如果你直接在train下放一些image(png,jpg...)这样运行上面的代码会报错:RuntimeErrorlFound 0 files in subfolders of:...............

这种是错误的

二、ImageFolder参数详解和注意事项

1、参数详解

dataset=torchvision.datasets.ImageFolder(
                       root, transform=None, 
                       target_transform=None, 
                       loader=<function default_loader>, 
                       is_valid_file=None)


参数详解:

  • root:图片存储的根目录,即各类别文件夹所在目录的上一级目录。
  • transform:对图片进行预处理的操作(函数),原始图片作为输入,返回一个转换后的图片。
  • target_transform:对label的转换(对图片类别进行预处理的操作,输入为 target,输出对其的转换。 如果不传该参数,即对 target 不做任何转换,返回的顺序索引 0,1, 2…)
  • loader:表示数据集加载方式,通常默认加载方式即可。
  • is_valid_file:获取图像文件的路径并检查该文件是否为有效文件的函数(用于检查损坏文件)

label是按照文件夹名顺序排序后存成字典,即{类名:类序号(从0开始)},一般来说最好直接将文件夹命名为从0开始的数字,这样会和ImageFolder实际的label一致,如果不是这种命名规范,建议看看self.class_to_idx属性以了解label和文件夹名的映射关系。

2、返回值

返回的dataset都有以下三种属性:

  • self.classes:用一个 list 保存类别名称
  • self.class_to_idx:得到dict:类别 + 对应的索引,与不做任何转换返回的 target 对应
  • self.imgs:保存(图像路径, 它所属于的类别index) tuple的 list

3、需要注意的是:

imageFolder() 读取指定文件夹下的所有文件的索引,如果对于文件夹中图像很多的情况,也会导致加载速度很慢【这种情况好像没有办法解决,只能通过将HDD换成SDD】(因为它虽然不直接读取图像,但是会读取这些图像对应的索引)。imageFolder()过程只会加载index,而不会执行transform操作(transform操作是懒加载的,只有使用dataLoader的时候才会执行)

torchvision.datasets.ImageFolder() 主要执行以下操作:

  1. 扫描目录:它会递归遍历指定的根目录,查找所有符合条件的图像文件。这个过程中,它会按照目录结构将找到的图像自动分类,目录名被用作类别标签。

  2. 建立索引:对于每个找到的图像文件,ImageFolder 会创建一个包含图像路径和其对应标签索引的元组。这些信息被存储在一个内部列表中,用于后续的数据加载。

三、程序案例

from torchvision.datasets import ImageFolder
from torchvision import transforms

#加上transforms
normalize=transforms.Normalize(mean=[.5,.5,.5],std=[.5,.5,.5])
transform=transforms.Compose([
    transforms.RandomCrop(180),
    transforms.RandomHorizontalFlip(),
    transforms.ToTensor(), #将图片转换为Tensor,归一化至[0,1]
    normalize
])

dataset=ImageFolder('./data/train',transform=transform)


我们得到的dataset,它的结构就是[(img_data,class_id),(img_data,class_id),…],下面我们打印第一个元素:

print(dataset[0])
'''
输出:
(tensor([[[-0.5137, -0.4667, -0.4902,  ..., -0.0980, -0.0980, -0.0902],
         [-0.5922, -0.5529, -0.5059,  ..., -0.0902, -0.0980, -0.0667],
         [-0.5373, -0.5294, -0.4824,  ..., -0.0588, -0.0824, -0.0196],
         ...,
         [-0.3098, -0.3882, -0.3725,  ..., -0.4353, -0.4510, -0.4196],
         [-0.2863, -0.3647, -0.3725,  ..., -0.4431, -0.4118, -0.4196],
         [-0.3412, -0.3569, -0.3882,  ..., -0.4667, -0.4588, -0.4196]],

        [[-0.6157, -0.5686, -0.5922,  ..., -0.2863, -0.2784, -0.2706],
         [-0.6941, -0.6549, -0.6078,  ..., -0.2784, -0.2784, -0.2471],
         [-0.6392, -0.6314, -0.5843,  ..., -0.2471, -0.2706, -0.2078],
         ...,
         [-0.4431, -0.5059, -0.5059,  ..., -0.5608, -0.5765, -0.5451],
         [-0.4196, -0.4824, -0.5059,  ..., -0.5686, -0.5373, -0.5451],
         [-0.4745, -0.4902, -0.5294,  ..., -0.5922, -0.5843, -0.5451]],

        [[-0.6627, -0.6157, -0.6549,  ..., -0.5059, -0.5216, -0.5137],
         [-0.7412, -0.7020, -0.6706,  ..., -0.4980, -0.5216, -0.4902],
         [-0.6863, -0.6784, -0.6471,  ..., -0.4667, -0.4902, -0.4275],
         ...,
         [-0.6000, -0.6549, -0.6627,  ..., -0.6784, -0.6941, -0.6627],
         [-0.5765, -0.6314, -0.6471,  ..., -0.6863, -0.6549, -0.6627],
         [-0.6314, -0.6314, -0.6392,  ..., -0.7098, -0.7020, -0.6627]]]), 0)
'''

下面我们再看一下dataset的三个属性:

print(dataset.classes)  #根据分的文件夹的名字来确定的类别
print(dataset.class_to_idx) #按顺序为这些类别定义索引为0,1...
print(dataset.imgs) #返回从所有文件夹中得到的图片的路径以及其类别
'''
输出:
['cat', 'dog']
{'cat': 0, 'dog': 1}
[('./data/train\\cat\\1.jpg', 0), 
 ('./data/train\\cat\\2.jpg', 0), 
 ('./data/train\\dog\\1.jpg', 1), 
 ('./data/train\\dog\\2.jpg', 1)]
'''

pytorch之ImageFolder_imagefolder结构-CSDN博客

`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
发出的红包

打赏作者

Pengsen Ma

太谢谢了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值