ImageFolder是一个通用的数据加载器,数据集应当按照指定的格式进行存储。
参数
1. root
在root指定的路径下寻找图片
2. transform
对PIL Image进行的转换操作,transform的输入是使用loader读取图片的返回对象
3.target_transform
对label的转换。
4. loader:
给定路径后如何读取图片,默认读取为RGB格式的PIL Image对象
成员变量
可以通过成员变量查看ImageFolder返回的内容。这里不是一个具体的函数去操作哦,而是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对象。
dataset = ImageFolder('data/dogcat_2/') #这里是在dog和cat等分类文件夹之上的dogcat_2文件夹
# cat文件夹的图片对应label 0,dog对应1
print(dataset.class_to_idx)
{'cat': 0, 'dog': 1}
# 所有图片的路径和对应的label
print(dataset.imgs)
[('./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)]
#所有图片的类别
print(dataset.classes)
['cat', 'dog']
#print(dataset[0][1])# 第一维[]表示是第几张图,第二维[]表示为1返回label
#print(dataset[0][0]) # 第二维表示为0返回图片数据
plt.imshow(dataset[0][0])
进行transform,返回tensor。
normalize = T.Normalize(mean=[0.4, 0.4, 0.4], std=[0.2, 0.2, 0.2])
transform = T.Compose([
T.RandomResizedCrop(224),
T.RandomHorizontalFlip(),
T.ToTensor(),
normalize,
])
dataset = ImageFolder('data1/dogcat_2/', transform=transform)
# 深度学习中图片数据一般保存成CxHxW,即通道数x图片高x图片宽
#print(dataset[0][0].size())
再转化为图片
to_img = T.ToPILImage()
# 0.2和0.4是标准差和均值的近似
a=to_img(dataset[0][0]*0.2+0.4)
plt.imshow(a)
plt.axis('off')
plt.show()