【MNIST/Python】手写体数字训练/测试数据集(图片格式)下载及分割预处理

版权声明:本文为博主原创文章,转载请注明出处,谢谢! https://blog.csdn.net/Jkwwwwwwwwww/article/details/65628235

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
现今已经有不少方法将原始的二进制数据样本转化为如下的图片格式:

MNIST

这里提供一种按照训练/测试样本和数字类别(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/

注意事项

  1. 程序须在代码源文件目录运行(包含train和test目录)
  2. 分割出的单个数字图片存储在train和test目录中的子文件夹中,子文件夹名对应数字类别(0~9),单个数字的文件名也具有一定的格式,便于后续调用
  3. 以上参数均可根据需要自行修改
  4. 程序代码亦包含在数据集的下载链接中:Link

Reference


[1] THE MNIST DATABASE of handwritten digits
[2] MNIST数据库介绍及转换 - fengbingchun

希望能够对大家有所帮助~

猜你喜欢

转载自blog.csdn.net/Jkwwwwwwwwww/article/details/65628235