一、MXNet,不是直接处理原生数据比如图片之类的,而是处理的自定义的一种文件格式rec。而rec格式的文件由依赖于一个描述原生数据的列表文件格式lst。
数据集:caltech256,其中包含两个文件,一个test,一个train,每个文件里面又有很多个代表类标的文件,各个文件里存放了每一类的图片。
二.从原生数据生成lst文件
这个图像文件列表的格式如下:
integer_image_index \t label_index \t path_to_image
mxnet/tools/路径下运行make_list.py
python make_list.py /root/DATA/caltech256x256-256/train/ /root/DATA/train --recursive=True
第一个参数是图片所在的根目录
第二个参数是生成lst文件的前缀,这里我们可以把路径加进去从而保证test.lst是生成在~/data/下的。
第三个参数代表每读取一个目录,增加一个类标,因为/root/DATA/caltech256x256-256/train/文件下有很多类的文件,每个文件里面存放每类的图片。
三.从lst文件生成rec
在路径mxnet/bin/下有个文件:im2rec
直接在命令行使用这个文件就行。具体使用方法可以查看源码,这里我只举个最简单的栗子:
./im2rec /root/DATA/train.lst /root/DATA/caltech256x256-256/train/ /root/DATA/train.rec
第一个参数指明lst文件
第二个参数指明图片根目录,这样才能找到图片
第三个参数指明生成的rec文件
四.创建Data Iterator
参考mxnet/example/image-classification里面train_cifar10.py或者train_imagenet.py例子进行修改即可。
# data
def get_iterator(args, kv):
data_shape = (3, 256, 256)
train = mx.io.ImageRecordIter(
path_imgrec = args.data_dir + "train.rec",
mean_r = 123.68,
mean_g = 116.779,
mean_b = 103.939,
data_shape = data_shape,
batch_size = args.batch_size,
rand_crop = True,
rand_mirror = True,
num_parts = kv.num_workers,
part_index = kv.rank)
val = mx.io.ImageRecordIter(
path_imgrec = args.data_dir + "test.rec",
mean_r = 123.68,
mean_g = 116.779,
mean_b = 103.939,
rand_crop = False,
rand_mirror = False,
data_shape = data_shape,
batch_size = args.batch_size,
num_parts = kv.num_workers,
part_index = kv.rank)
return (train, val)