下载的数据集格式是字节存储的,有时需要转为图片格式,以下以测试集为例子,说明python转换代码。
IDX数据格式
这四个文件采用了IDX的文件格式,一种平铺直叙的方式:
magic number
size in dimension 0
size in dimension 1
.....
size in dimension N
data
其中magic number为4字节,前2字节永远是0,第3字节代表数据的格式:
0x08: unsigned byte
0x09: signed byte
0x0B: short (2 bytes)
0x0C: int (4 bytes)
0x0D: float (4 bytes)
0x0E: double (8 bytes)
第4字节的含义表示维度的数量(dimensions): 1 表示一维(比如vectors), 2 表示二维( 比如matrices),3表示三维(比如numpy表示的图像,高,宽,通道数)。
训练集和测试集的标签文件的格式(train-labels-idx1-ubyte和t10k-labels-idx1-ubyte)
1,前4个字节(第0~3个字节)是魔数2049(int型,0x00000801, 大端);
2,再往后4个字节(第4~7个字节)是标签的个数:60000或10000;
3,再往后每1个字节是一个无符号型的数,值为0~9。
import os
import cv2
import numpy as np
def save_mnist_to_jpg(dataset_path, output_path): #parameters:(数据集所在路径,最后输出存储路径)
files = os.listdir(dataset_path)
#生成image_file路径
mnist_image_file = os.path.join(dataset_path, [f for f in files if "image" in f][0])
#生成label_file路径
mnist_label_file = os.path.join(dataset_path, [f for f in files if "label" in f][0])
save_dir = output_path
num_file = 10000
height, width = 28, 28
size = height * width
prefix = 'test'
#二进制形式读取文件
with open(mnist_image_file, 'rb') as f1:
image_file = f1.read()
with open(mnist_label_file, 'rb') as f2:
label_file = f2.read()
image_file = image_file[16:] #将所读数据进行切片,去掉开头16字节
label_file = label_file[8:]
for i in range(num_file):
label = label_file[i]
image_list = [item for item in image_file[i * size:i * size + size]]
image_np = np.array(image_list, dtype=np.uint8).reshape(height, width)
save_name = os.path.join(save_dir, '{}_{}_{}.jpg'.format(prefix, i, label))
cv2.imwrite(save_name, image_np)
print("=" * 20, "preprocess data finished", "=" * 20)
if __name__ == '__main__':
save_mnist_to_jpg('你的数据集所在路径','最后图片存储位置')
最后结果: