赞
踩
ImageFolder假设所有的文件按文件夹保存,每个文件夹下存储同一个类别的图片,文件夹名为类名,大致样式是这样的:
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:...............
这种是错误的
- dataset=torchvision.datasets.ImageFolder(
- root, transform=None,
- target_transform=None,
- loader=<function default_loader>,
- is_valid_file=None)
参数详解:
label是按照文件夹名顺序排序后存成字典,即{类名:类序号(从0开始)},一般来说最好直接将文件夹命名为从0开始的数字,这样会和ImageFolder实际的label一致,如果不是这种命名规范,建议看看self.class_to_idx属性以了解label和文件夹名的映射关系。
返回的dataset都有以下三种属性:
imageFolder() 读取指定文件夹下的所有文件的索引,如果对于文件夹中图像很多的情况,也会导致加载速度很慢【这种情况好像没有办法解决,只能通过将HDD换成SDD】(因为它虽然不直接读取图像,但是会读取这些图像对应的索引)。imageFolder()过程只会加载index,而不会执行transform操作(transform操作是懒加载的,只有使用dataLoader的时候才会执行)
torchvision.datasets.ImageFolder()
主要执行以下操作:
扫描目录:它会递归遍历指定的根目录,查找所有符合条件的图像文件。这个过程中,它会按照目录结构将找到的图像自动分类,目录名被用作类别标签。
建立索引:对于每个找到的图像文件,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)]
- '''
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。