MXNet中im2rec将图片转换成二进制RecordIO格式

我们在前面的 计算机视觉之目标检测训练数据集(皮卡丘)《2》其中有提到这个二进制的RecordIO格式,使用的是MXNet自带的im2rec工具,源码在tools里面

import mxnet as mx
#D:\Anaconda3\envs\myd2l\lib\site-packages\mxnet\tools\
print(mx.__path__[0])

在这路径的下面有一个im2rec.py文件,根据自己的环境,前面目录有所区别。

生成.lst文件

lst文件类似一个清单文件,图片索引与位置信息,下面是最终完成的目录结构图:

MXNet中im2rec将图片转换成二进制RecordIO格式_第1张图片
将在myimgs目录下面生成一个my.lst文件
list参数是生成.lst文件,recursive参数可以递归下面的目录
python D:\Anaconda3\envs\myd2l\lib\site-packages\mxnet\tools\im2rec.py myimgs/my myimgs --list --recursive

将在myimgs目录下面分别生成my_train.lst和my_val.lst文件
train-ratio 0.8表示提取80%作为训练集,20%作为验证集,这里使用取整不是四舍五入。
python D:\Anaconda3\envs\myd2l\lib\site-packages\mxnet\tools\im2rec.py myimgs/my myimgs --list --recursive --train-ratio 0.8

t1 0
t1\t2 1

这里我是有两个目录,t1目录下面有一些图片, 还有一个t2的目录,t2目录也有一些图片,图片是网上下载的一些水果图片。

lst文件的内容如下,索引-->标签类别-->图片所在位置 

MXNet中im2rec将图片转换成二进制RecordIO格式_第2张图片

生成rec文件

将在myimgs目录下面分别生成my_train.rec,my_train.idx和my_val.rec,my_val.idx文件
python D:\Anaconda3\envs\myd2l\lib\site-packages\mxnet\tools\im2rec.py myimgs/my myimgs
也可以使用多线程,指定参数num-thread
python D:\Anaconda3\envs\myd2l\lib\site-packages\mxnet\tools\im2rec.py myimgs/my myimgs --num-thread 4

读取rec文件

将生成的rec和idx文件一起结合起来解析,就可以得到这些图片的数据,然后我们现实图像来看下:

import matplotlib.pyplot as plt
import mxnet as mx
import numpy as np

data_iter = mx.image.ImageIter(batch_size=8, data_shape=(3, 600, 600),
                               path_imgrec="./myimgs/my_train.rec", path_imgidx="./myimgs/my_train.idx")
data_iter.reset()
batch = data_iter.next()
data = batch.data[0]
label = batch.label[0]
print(label)#[0. 0. 0. 1. 0. 0. 0. 1.]
for i in range(8):
    plt.subplot(2, 4, i+1)
    plt.title(i+1)
    plt.imshow((data[i].asnumpy()/255).transpose((1, 2, 0)))#通道维放最后
    #plt.imshow(data[i].asnumpy().astype(np.uint8).transpose((1, 2, 0)))
    if i%4:plt.yticks([])
plt.show()

MXNet中im2rec将图片转换成二进制RecordIO格式_第3张图片

你可能感兴趣的:(深度学习框架(MXNet),ImageIter,im2rec.py,train-ratio,rec文件,idx文件)