ImageFolder是一个通用的数据加载器,数据集应当按照指定的格式进行存储。
比如我们的数据集一共包括两个类别:cat、dog,每个类别包括四张图片。所有的图片按文件夹保存,每个文件夹下存储同一个类别的图片,文件夹名为类名。
import torchvision.datasets
dataset=ImageFolder(root, transform=None, target_transform=None, loader=default_loader)
(1)root
在root指定的路径下寻找图片,比如
import torchvision.datasets
dataset = ImageFolder('./data/dogcat_2')
(2)transform
对PIL Image进行的转换操作,transform的输入是使用loader读取图片的返回对象,比如
import torchvision.datasets
transform = transforms.Compose([
transforms.Grayscale(),
transforms.Resize([28, 28]),
transforms.ToTensor(),
transforms.Normalize(mean=(0,0,0),std=(1,1,1))
])
dataset = ImageFolder('./data/dogcat_2',transform=transform)
(3)target_transform
对label的转换。
可以通过成员变量查看ImageFolder返回的内容。
(1)classes
根据分的文件夹的名字来确定的类别,如['cat', 'dog']。
(2)class_to_idx
按顺序为这些类别定义索引为0,1...,如{'cat': 0, 'dog': 1}。
(3)imgs
返回从所有文件夹中得到的图片的路径以及其类别,一个列表,列表中的每个元素都是一个(img-path, class_index)的元组,如
[('./data/dogcat_2/cat/cat.12484.jpg', 0), ('./data/dogcat_2/cat/cat.12485.jpg', 0), ('./data/dogcat_2/cat/cat.12486.jpg', 0), ('./data/dogcat_2/cat/cat.12487.jpg', 0), ('./data/dogcat_2/dog/dog.12496.jpg', 1), ('./data/dogcat_2/dog/dog.12497.jpg', 1), ('./data/dogcat_2/dog/dog.12498.jpg', 1), ('./data/dogcat_2/dog/dog.12499.jpg', 1)]。
如果不进行transform,返回PIL Image对象,进行transform,返回tensor。
ImageFolder的返回值,第一维代表的是第几张图片(所有类别的图片顺序排列),如dataset[0]代表第0张图片,即('./data/dogcat_2/cat/cat.12484.jpg', 0)。第二维只有0和1两个值,0返回图片数据,1返回label。
参考:pytorch torchvision.ImageFolder的使用(https://www.cnblogs.com/wanghui-garcia/p/10649364.html)