MNIST手写数字二进制数据集的读取

官网如下:http://yann.lecun.com/exdb/mnist/

首页详细地介绍了数据集的二进制格式,读取非常简单,要注意的是用大端模式,还有读取的图片的方向问题。

Matlab代码如下

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
clear ;
close all;
%% 读图像文件
%使用大端模式
fp_image=fopen('t10k-images.idx3-ubyte','rb','b');
%头标识
image_magic=fread(fp_image,1,'int');
%图像数目
image_num=fread(fp_image,1,'int');
%图像宽度
image_width=fread(fp_image,1,'int');
%图像高度
image_height=fread(fp_image,1,'int');
fprintf('image file info:\nmagic:%d\nnumber:%d\nsize:%d*%d\n',image_magic,image_num,image_width,image_height);
%% 读标签文件
fp_label=fopen('t10k-labels.idx1-ubyte','rb','b');
label_magic=fread(fp_label,1,'int');
label_num=fread(fp_label,1,'int');
fprintf('label file info:\nmagic:%d\nnumber:%d\n',label_magic,label_num);
images_data=zeros(image_num,image_width,image_height);
images_label=zeros(image_num,1,'int32');
%% 顺序读
N=min(image_num,label_num);
for i =1:N
% 先上下镜像,然后顺时针旋转90度
image=fread(fp_image,[image_width,image_height],'uchar');
image=flipud(image);
image=rot90(image,-1);
images_data(i,:,:)=image;
images_label(i)=fread(fp_label,1,'uchar');
end
%% 关闭文件
fclose(fp_image);
fclose(fp_label);
%% 其他处理过程
%% 创建文件夹,保存文件
write_file=0;
if(write_file)
for i=0:9
dir=sprintf('D:/DP/%d',i);
if(~exist(dir,'dir') )
mkdir(dir);
end
end
images_count=zeros(10,1,'int32');
for i=1:N
idx = images_label(i)+1;
path = sprintf('D:/DP/%d/%d.jpg',images_label(i),images_count(idx));
out=squeeze(images_data(i,:,:));
imwrite(out,path);
images_count(idx)=images_count(idx)+1;
end
else
end

本地保存结果(例数字6文件夹下的图片)

坚持原创技术分享,您的支持将鼓励我继续创作!