看过我Mxnet学习系列1的同学,肯定有些疑惑,这个问题已经讲过了怎么还讲?对于这个问题我也很无奈。上篇博客已经是很久以前写的了,Mxnet的更新还是很快的,没办法只能在写一篇博客。
先说一下新版本(2016/10/26)较老版本的变化在于将老版本中的make_list.py和im2rec.py两个文件的功能合并到im2rec.py一个文件中去了,使用参数--list=True(make_list),默认是--list=False(im2rec.py).
OK!下面简单的说一下如何使用im2rec.py制作自己的数据。使用im2rec.py建议先看一下Mxnet学习系列0。
1、下载lfw,解压
http://pan.baidu.com/s/1eRZomxO
2、制作image_list,让这个折腾里一天,原来是im2rec.py的源码错了,我已经修改,可从此处下载:https://github.com/sunshineInmoon/mxnet/tree/master/tools
定位im2rec.py路径,我的在E:\Mxnet\mxnet\tools,
执行命令python im2rec.py --list=True --exts .jpg --exts .jpeg(也可以是--exts=[.jpg,.jpeg]或者--exts=.jpg --exts=.jpeg)
--recursive=True E:\lfw\imge E:\lfw\
执行后屏幕会输出:
我们会在E:\lfw文件夹下发现多了三个文件imge_train.lst, imge_test.lst, imge_val.lst.这三个文件分别代表训练数据,测试数据,验证数据。
通过学习源码,了解了几个特别参数的作用和原理,这里给大家讲一讲:
Chunk----是把数据分成几块,每一个数据块都能单独生成各自的 train.lst,test.lst,
Val.lst三个文件
N = len(image_list)
chunk_size = (N + args.chunks - 1) / args.chunks #计算每个块的大小
for i in xrange(args.chunks):#对于每一个块分别计算
chunk = image_list[i * chunk_size:(i + 1) * chunk_size]
if args.chunks > 1:
str_chunk = '_%d' % i
else:
str_chunk = ''
sep = int(chunk_size * args.train_ratio)
sep_test = int(chunk_size * args.test_ratio)
write_list(args.prefix + str_chunk + '_test.lst', chunk[:sep_test])
write_list(args.prefix + str_chunk + '_train.lst', chunk[sep_test:sep_test + sep])
write_list(args.prefix + str_chunk + '_val.lst', chunk[sep_test + sep:])
通过上面的源码我们可以看到每一个块的数据按照顺序分层test,train,val三部分比如1,2,3,4,5,6,7,8,9为数据,test_ratio=0.1,train_ratio=0.7,则test=[1],
train=[2,3,4,5,6,7,8],val=[9];
3、将image_list转换成image.rec
真是一波未平一波又起,这一步又出错了。感觉原来挺顺利的,不知为什么新版本这么多问题,还好已经解决了。
如果我们直接使用im2rec.py 在windows会报错,如下:
网上的朋友说是multiprocessing不兼容,我已经改成im2rec_Windows.py,OK!
也可以将im2rec.cc 编译成im2rec.exe,也能成功。在此强烈建议使用im2rec.exe,因为im2rec_Windows.py,不保证百分之百正确,有待验证。需要注意的是im2rec_Windows.py 和 im2rec.exe的参数格式不同
Im2rec.exe E:\lfw\image_train.lst E:\lfw image.rec
Im2rec_Windows.py E:\lfw\image E:\lfw