数据集下下来应该是这样的:
我们把它们全部解压出来,得到4个没有后缀名的文件,t10k是测试集,train是训练集,image保存图像数据,label保存标签。我们要提取图片只需要用到images就好了,用sublime等打开是这样的:
images文件的第一行是文件的相关信息,00000803是魔数,用于识别文件,相当于id,00002710是长度,16进制转换为10进制等于10000,正好是测试集中的数据量,两个0000001c分别指示图像像素有28行28列。这些不用管太多。
分行和空格是sublime自动显示的,文件内部实际上是连续的一串数字,读取的时候不要弄错了。
紧跟在后面的是图像数据了,每个字节保存一个像素的灰度(MNIST是只有灰度的),0~255。
知道这些后,我们只需要读取其中的数据并保存为.jpg格式就好了。
文件中直接读取出来得到的对象是形如b'\x00\xff'的二进制对象,这里使用struct模块将其转化为十进制整数。
保存文件使用了opencv-python。
下面是代码:
import cv2 as cv
import struct
import numpy as np
num = 10000
f = open('train-images.idx3-ubyte','rb')
image = np.zeros((28,28))
f.read(16)
for picNum in range(num):
path = str(picNum)+'.jpg'
for x in range(28):
for y in range(28):
image[x][y] = struct.unpack('B',f.read(1))[0]
cv.imwrite(path,image)
f.close()
改改num的值和两个路径就能用了。运行之前一定要记得确认路径,几万张图片乱塞删起来还是稍微有点麻烦的