1、项目场景:
作为一个深度学习小白,前些日子在kaggle上下载了一个猫狗数据集,但是在写自定义数据集的时候却发现图片文件排版和我之前写的不太一样,于是就发现了torchvision.datasets下的ImageFolder类可以轻而易举的返回想要的数据集。
2、图片数据
archive文件夹中包含了test_set和train_set,每一个训练和测试集下的cats和dogs文件夹里面都包含了几千张图片。
3、目的:获取自定义数据集中的数据(自定义类继承自Dataset)
以前我都是通过继承自torch.utils.data包下的Dataset类来自定义数据集
-->只获取测试集下猫的数据
这种方法虽然也能获取所有的训练和测试数据,但缺点就是代码多且复杂,什么事都得自己亲力亲为,因此不是一个好的选择。
4、目的:获取自定义数据集中的数据(使用ImageFolder)
可以直接使用一行命令就可以获取对应目录下的所有数据并自动分类
from torchvision.datasets import ImageFolder root_path='./archive' datasets = ImageFolder(root=root_path)
1、先查看一下数据集的数据(长度)
len(datasets)
10028
2、查看分类字典(datasets的属性class_to_idx)
datasets.class_to_idx
{'test_set': 0, 'train_set': 1}
3、查看全部数据(datasets的属性samples或者imgs)
返回结果是一个元组列表:
第一个位置元素为图片数据(可以通过transform对图片数据进行相应的变换)
第二个位置为图片标签
貌似samples和imgs的效果一样?!
datasets.samples
[('./archive\\test_set\\cats\\cat.4001.jpg', 0),
('./archive\\test_set\\cats\\cat.4002.jpg', 0),
('./archive\\test_set\\cats\\cat.4003.jpg', 0),
('./archive\\test_set\\cats\\cat.4004.jpg', 0),
('./archive\\test_set\\cats\\cat.4005.jpg',0)]
5、ImageFolder类源码介绍(一个功能强大的可以返回数据集的类,对自定义数据集友好)
"""A generic data loader where the images are arranged in this way by default: ::
root/dog/xxx.png
root/dog/xxy.png
root/dog/[...]/xxz.pngroot/cat/123.png
root/cat/nsdf3.png
root/cat/[...]/asd932_.pngThis class inherits from :class:`~torchvision.datasets.DatasetFolder` so
the same methods can be overridden to customize the dataset.Args:
root (string): 根路径
transform (callable, optional):输入PILImage类的图片并通过transform类进行相应变换
target_transform (callable, optional): A function/transform that takes in the
target and transforms it.
loader (callable, optional): A function to load an image given its path.
is_valid_file (callable, optional): A function that takes path of an Image file
and check if the file is a valid file (used to check of corrupt files)Attributes:
classes (list): List of the class names sorted alphabetically.
class_to_idx (dict): Dict with items (class_name, class_index).
imgs (list): List of (image path, class_index) tuples
"""