MXNet图像数据打包 im2rec.py
记录一下使用MXNet进行图像数据打包时踩过的坑。我使用的MXNet是最新的1.2.0版本,而参考资料中给的基本都是老版本的打包方式,所以过程中出了很多错误,无奈只能看im2rec.py源码,最终完美解决。
MXNet提供了图像数据打包格式RecordIO,以及专用迭代器ImageRecordIter,它可以快速异步载入打包后的图像,还可以自动完成裁剪、缩放、图像增强等常见操作。
接下来说一下图像打包的具体步骤:
(1)将图像按标签分类放到各自的文件夹中;
例如,在train文件夹下新建10个子文件夹,分别命名为0-9,里边存放的是属于各自类别的图片。
(2)下载MXNet的GitHub项目,地址为https://github.com/dmlc/mxnet
(3)在命令行运行tools文件夹中的im2rec.py文件,生成图像列表lst文件,具体如下:
在与train同级的文件夹中打开命令行,执行 python F:\mxnet\incubator-mxnet-master\tools\im2rec.py --list --recursive train F:\........\train
注意:
踩过的坑主要在这里,参考资料中写的是--list=1 --recursive=1,这可能是老版本的写法,新版本这样写就会出错。源码中list、recursive默认的是False,此处只需指明--list --recursive即可。
(4)从列表生成rec文件和idx文件
在与train同级的文件夹中打开命令行,执行 python F:\mxnet\incubator-mxnet-master\tools\im2rec.py --pass-through train.lst F:
\.........\train
注意:这里也有几个坑
- 同样的--pass-through参数无需再次赋值,只需指明即可;
- train.list一定要写上后缀,不然会报错;
- 执行这条指令后可能会抱如下错误:TypeError: a bytes-like object is required, not 'str'。解决办法:在源码中将line = [i.strip() for i in line.strip().split('\t')] 修改为line = [i.strip() for i in str(line.strip(),encoding='utf-8').split('\t')]。源码中第103行(1.2.0版本)。
(5)至此,lst、rec、idx文件已全部生成 ,即可在ImageRecordIter中载入使用。
注:部分内容参考《深度卷积网络》