官方主页:
http://yann.lecun.com/exdb/mnist/
Google实验室的Corinna Cortes和纽约大学柯朗研究所的YannLeCun建有一个手写数字数据库,训练库有60,000张手写数字图像,测试库有10,000张。
训练库train-images.idx3-ubyte,文件大小47040016,每个图像784=28×28,784×60000 =47040000
测试库t10k-images.idx3-ubyte,文件大小7840016,784×10000=7840000,
两个图片数据库都多出来16个字节。
另外两个标记文件都多出来8个字节。
多出来的这些东西是什么呢?
图像数据库中多出来16个字节为 magic number = 0x00000803
Imagenumber = 0x0000ea60/60000 0x00002710/10000
Imageheight = 28
Imagewidth = 28
标签文件中多出来8个字节为magic number = 0x00000801 和image_number
这些标记信息位于文件的开头,后面便是实际数据了。
手写效果如图:
一段python解析代码:
#! /usr/bin/env python
import struct
import numpy as np
#import matplotlib.pyplot as plt
import Image
import sys
input_path = sys.argv[1] #mnist数据库解压后的所在路径
output_path = sys.argv[2] #生成的图片所在的路径
# =====read labels=====
label_file = input_path + '/train-labels.idx1-ubyte'
label_fp = open(label_file, 'rb')
label_buf = label_fp.read()
label_index=0
label_magic, label_numImages = struct.unpack_from('>II', label_buf, label_index)
label_index += struct.calcsize('>II')
labels = struct.unpack_from('>60000B', label_buf, label_index)
"""
有的时候需要用Python处理二进制数据,比如,存取文件,socket操作时.
这时候,可以使用python的struct模块来完成.可以用 struct来处理C语言中的结构体.
uppack_from有三个参数,第一个是fmt, 第二个是buf, 第三个是index
fmt 中 > 可以简单的理解为解析出,不知道packinto时会不会使用 <
II 是按照两个整形数据来解析
calcsize 表示计算两个整形变量的长度
>60000B 表示按照60000个B 二进制数据来解析
"""
# =====read train images=====
label_map = {}
train_file = input_path + '/train-images.idx3-ubyte'
train_fp = open(train_file, 'rb')
buf = train_fp.read()
index=0
magic,numImages,numRows,numColumns=struct.unpack_from('>IIII',buf,index)
index+=struct.calcsize('>IIII')
k = 0
for image in range(0,numImages):
label = labels[k]
if(label_map.has_key(label)):
ids = label_map[label] + 1
label_map[label] += 1
else:
label_map[label] = 0
ids = 0
k += 1
if(label_map[label] > 50):
continue
im=struct.unpack_from('>784B',buf,index)
index+=struct.calcsize('>784B')
im=np.array(im,dtype='uint8')
im=im.reshape(28,28)
#fig=plt.figure()
#plotwindow=fig.add_subplot(111)
#plt.imshow(im,cmap='gray')
#plt.show()
im=Image.fromarray(im)
im.save(output_path + '/%s_%s.bmp'%(label, ids),'bmp')
解码数据库的另外两个连接:
http://blog.csdn.net/fengbingchun/article/details/49611549
http://blog.csdn.net/zc02051126/article/details/51557166