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

posted @ 2018-09-11 21:59  hitrjj  Views(305)  Comments(0Edit  收藏  举报