MXNet.gluon——图像I/O
MXNet gluon如何从文件夹读入图像
分类任务中需要将图像从文件夹中读入,并以迭代器的形式进行训练。gluon 的api 提供了一个方便的函数gluon.data.vision.ImageFolderDataset()
,只需要将图像文件根据分类进行预处理,就可以方便的使用这个函数来读入数据。
1.图像预处理
首先这个函数要求不同分类的图像需要按照下面的格式来组织:
./train_image
|--class1
|--001.png
|--002.png
|--003.png
|--xxx.png
|--class2
|--class3
|--classxxx
其中train_image
是保存训练图像的目录;
这里可以参考如何将json格式的标签数据进行预处理
2. 生成图像image-label
对儿
mxnet.gluon.data.vision.datasets.ImageFolderDataset(root, flag=1, transform=None)
这一函数中root
为图像存储的根目录,它会根据子文件夹为所有图像生成对应的标签。
- 其中flag
为读入图像的属性,1为rgb图,0为灰度图。
transform
为对图像进行变化的函数,但一般都在dataloader中进行。
得到的结果有两个属性:
- syset
会输出所有类并用整数表示
- items
则表示读入的所有图像,并按照元组的形式(filename, label)
组成list
3.读入数据生成迭代器
上面的工作主要生成了一个图片和对应标签的检索表,随后需要利用生成dataiter
才能在实际训练中使用,主要使用mxnet.gluon.data.DataLoader
函数.
其参数如下:
mxnet.gluon.data.DataLoader(dataset, batch_size=None, shuffle=False, sampler=None, last_batch=None, batch_sampler=None, batchify_fn=None, num_workers=0, pin_memory=False)
- dataset: 上一步从文件夹load进来的检索;
- batch_size: 每次输出批量的大小
- shuffle:是否要打乱顺序
4.实例
from mxnet.gluon import data as gdata
#读取数据文件
train_set = gdata.vision.ImageFolderDataset('./train_imgs/',flag=1)
valid_set = gdata.vision.ImageFolderDataset('./valid_imgs/',flag=1)
#check data classes
print(train_set) #这里检索表的长度与数据集的大小相同
print(train_set.synsets) #also has items attributes
print(valid_set)
print(valid_set.synsets) #also has items attributes
#生成迭代器
#data into iter and realized argumentation
batch_size = 32
train_iter = gdata.DataLoader(train_set, batch_size, shuffle=True, last_batch='keep') #生成训练集迭代
valid_iter = gdata.DataLoader(valid_set, batch_size, shuffle=True, last_batch='keep') #生成验证集迭代
#这里迭代器的大小为数据集大小/批量大小,即将整个数据集分为了多少个batch来计算
#验证是否在一次迭代中输出batch_size 个的数据
for imgs, labels in train_iter:
print(labels)
print(imgs.shape)
break