MNIST手写体数字数据集
MNIST是一个手写数字数据库,它有60000个训练样本集和10000个测试样本集
由Yann LeCun等人建立,是NIST数据库的一个子集
官方网址链接:Link
官网上的数据库文件形式如下:
train-images-idx3-ubyte.gz: training set images (9912422 bytes)
train-labels-idx1-ubyte.gz: training set labels (28881 bytes)
t10k-images-idx3-ubyte.gz: test set images (1648877 bytes)
t10k-labels-idx1-ubyte.gz: test set labels (4542 bytes)
下载并解压缩后发现这些文件并不是标准的图像格式,而是以二进制的形式保存在文件中,每个样本图像的边长尺寸均为28*28
现今已经有不少方法将原始的二进制数据样本转化为如下的图片格式:
这里提供一种按照训练/测试样本和数字类别(2×10)进行分类的图片格式数据集(*.jpg),并包含对应的预处理代码,下载链接:Link
单个数字分割预处理
转换为图片后,数据集变为了多个数字图片的整体堆叠,仍然不利于进一步使用
因此需要对其进行一些预处理,将整张图片分割为多个单独的手写体数字,并进行额外存储
使用Python编写的预处理代码示例如下:
【MNIST_extraction.py】
#!/usr/bin/env python
#-*- coding: utf-8 -*-
'''
MNIST Preprocessing
@Author: Alex Pan
@From: CASIA
@Date: 2017.03
'''
import os
import cv2
import ipdb
########################### Global Parameters ###################################
trainFolder = 'train'
testFolder = 'test'
trainPrefix = 'mnist_train'
testPrefix = 'mnist_test'
postfix = '.jpg'
sideLength = 28
########################### Global Parameters ###################################
############################ Initialization #####################################
ROOT = os.getcwd() # MUST run in the directory of this very script
############################ Initialization #####################################
# Extract & Save each single-number image of MNIST
def MNIST_extract(folder, prefix):
print 'Category:', folder, prefix
# For each number from 0 to 9
for i in xrange(0, 10):
print 'Class:', str(i)
# Read over-all image of each class
allImage = cv2.imread(os.path.join(ROOT, folder, prefix + str(i) + postfix))
print 'Shape:', allImage.shape[0 : 2]
count = 0
print 'Processing ...'
for corY in xrange(0, allImage.shape[1] / sideLength):
for corX in xrange(0, allImage.shape[0] / sideLength):
count += 1
# Cropped image of single-number
singleImage = allImage[corX * sideLength : (corX + 1) * sideLength,
corY * sideLength : (corY + 1) * sideLength,
:]
''' Show
cv2.imshow('Single Number', singleImage)
cv2.waitKey(1)
# '''
# ''' Save
saveLocation = os.path.join(ROOT, folder, str(i), prefix + str(i) + '_' + str(count) + postfix)
cv2.imwrite(saveLocation, singleImage)
# ipdb.set_trace()
# '''
print 'Count:', count, 'All Saved.'
cv2.destroyAllWindows()
##########################
if __name__ == '__main__':
# ''' \SWITCH/ : train OR test
MNIST_extract(trainFolder, trainPrefix)
''' # \Division/
MNIST_extract(testFolder, testPrefix)
# ''' # \END/
注意事项:
- 程序须在代码源文件目录运行(包含train和test目录)
- 分割出的单个数字图片存储在train和test目录中的子文件夹中,子文件夹名对应数字类别(0~9),单个数字的文件名也具有一定的格式,便于后续调用
- 以上参数均可根据需要自行修改
- 程序代码亦包含在数据集的下载链接中:Link
Reference
[1] THE MNIST DATABASE of handwritten digits
[2] MNIST数据库介绍及转换 - fengbingchun
希望能够对大家有所帮助~