- Notifications
You must be signed in to change notification settings - Fork 251
/
Copy pathmnist_to_fig.py
117 lines (98 loc) · 4.13 KB
/
mnist_to_fig.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# # -*- coding:utf-8 -*-
# &Author AnFany
# 将mnist数据集或者Fashion-MNIST数据集转换为图片
# 因为两个数据集的格式是完全一致的,因此程序可以共用
importstruct
fromPILimportImage
importnumpyasnp
importos
Path=r'C:\Users\GWT9\Desktop'# 存储下面4个文件的路径
os.chdir(Path) # 设置为当前的工作路径
# 训练图片文件
train_images='train-images-idx3-ubyte'# 注意Mnist数据集中images.idx3,中是点'.',而Fashion-MNIST数据集中是'-'
# 训练标签文件
train_labels='train-labels-idx1-ubyte'
# 测试图片文件
test_images='t10k-images-idx3-ubyte'
# 测试标签文件
test_labels='t10k-labels-idx1-ubyte'
# 获取图片数据
defget_image(image_file):
# 读取二进制数据
bin_data=open(image_file, 'rb').read()
# 解析文件头信息,依次为魔数、图片数量、每张图片高、每张图片宽
offset=0
fmt_header='>iiii'
magic_number, num_images, num_rows, num_cols=struct.unpack_from(fmt_header, bin_data, offset)
# 解析数据集
image_size=num_rows*num_cols
offset+=struct.calcsize(fmt_header)
fmt_image='>'+str(image_size) +'B'
images=np.empty((num_images, num_rows, num_cols))
foriinrange(num_images):
images[i] =np.array(struct.unpack_from(fmt_image, bin_data, offset)).reshape((num_rows, num_cols))
offset+=struct.calcsize(fmt_image)
returnimages
# 获取标签数据
defget_label(label_file):
# 读取二进制数据
bin_data=open(label_file, 'rb').read()
# 解析文件头信息,依次为魔数和标签数
offset=0
fmt_header='>ii'
magic_number, num_images=struct.unpack_from(fmt_header, bin_data, offset)
# 解析数据集
offset+=struct.calcsize(fmt_header)
fmt_image='>B'
labels=np.empty(num_images)
foriinrange(num_images):
labels[i] =struct.unpack_from(fmt_image, bin_data, offset)[0]
offset+=struct.calcsize(fmt_image)
returnlabels
# 将用矩阵表示的图像信息转变为图片,名字为标签
defmatrix_to_fig(matrix_data, fig_title, file_name):
"""
将用矩阵表示的图像信息转变为图片,名字为标签
:param matrix_data: 图像的矩阵数据
:param fig_title: 对应的图片的标签
:param file_name: 存储图片的文件极夹的名称
:return: 存储图片的文件夹
"""
sign_dict= {}
forimage, labelinzip(matrix_data, fig_title):
# 首先获取同一个标签的图片的编号,从1开始
iflabelnotinsign_dict:
cc=1
else:
cc=sign_dict[label] +1
sign_dict[label] =cc
# 获取图片
get_image=Image.fromarray(np.uint8(image)) # 转为uint8的格式
# 存储图片
get_image.save(r".\%s\%s_%d.png"% (file_name, int(label), cc))
print(sign_dict) # 查看每个标签的图片的个数
returnprint('转换完成')
# 最终的主函数
if__name__=="__main__":
# 获取训练图片的数字矩阵信息和标签信息
train_fig_data=get_image(train_images)
train_fig_label=get_label(train_labels)
# 获取测试图片的数字矩阵信息和标签信息
test_fig_data=get_image(test_images)
test_fig_label=get_label(test_labels)
# 存储图片的文件夹子的名称
New_File_Name='MNIST_DATA'
# 如果没有名称为该名字的文件夹就新建
ifnotos.path.isdir('%s'%New_File_Name):
os.mkdir('%s'%New_File_Name)
# 把这个文件夹作为工作路径
os.chdir(r'%s\%s'% (Path, New_File_Name))
# 需要在这个文件夹子下面建立2个子文件夹train,test,分别存储训练和测试的图片数据
ifnotos.path.isdir('train'):
os.mkdir('train')
ifnotos.path.isdir('test'):
os.mkdir('test')
# 训练数据的转换
matrix_to_fig(train_fig_data, train_fig_label, 'train')
# 测试数据的转换
matrix_to_fig(test_fig_data, test_fig_label, 'test')