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

注意:这里也有几个坑

  1. 同样的--pass-through参数无需再次赋值,只需指明即可;
  2. train.list一定要写上后缀,不然会报错;
  3. 执行这条指令后可能会抱如下错误: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中载入使用。

注:部分内容参考《深度卷积网络》

猜你喜欢

转载自blog.csdn.net/qq_32863339/article/details/81162399