我们在前面的 计算机视觉之目标检测训练数据集(皮卡丘)《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文件类似一个清单文件,图片索引与位置信息,下面是最终完成的目录结构图:
将在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文件的内容如下,索引-->标签类别-->图片所在位置 :
生成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()