Skip to content

yuanmingqi/TibetanMNIST

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

藏文手写体数字数据集
Tibetan Handwritten Digital Dataset

背景描述

MNIST 数据集来自美国国家标准与技术研究所, National Institute of Standards and Technology (NIST). 训练集由来自 250 个不同人手写的数字构成, 其中 50% 是高中学生, 50% 来自人口普查局 (the Census Bureau) 的工作人员。自MNIST数据集建立以来,被广泛地应用于检验各种机器学习算法,测试各种模型,为机器学习的发展做出了不可磨灭的贡献,其当之无愧为历史上最伟大的数据集之一。在一次会议上,我无意间看到了一位藏族伙伴的笔记本上写着一些奇特的符号,好奇心驱使我去了解这些符号的意义,我的伙伴告诉我,这些是藏文当中的数字,这对于从小使用阿拉伯数字的我十分惊讶,这些奇特的符号竟有如此特殊的含义!我当即产生了一个想法,能不能让计算机也能识别这些数字呢?这个想法得到了大家的一致认可,于是我们开始模仿MNIST来制作这些数据,由于对藏文的不熟悉,一开始的工作十分艰难,直到取得了藏学研究院同学的帮助,才使得制作工作顺利完成。历时1个月,超过300次反复筛选,最终得到17768张高清藏文手写体数字图像,形成了TibetanMNIST数据集。我和我的团队为其而骄傲,因为它不仅仅是我们自行制作的第一个数据集,更是第一个藏文手写数字的图像数据集!藏文手写数字和阿拉伯数字一样,在藏文中是一个独立的个体,具有笔画简单,便于识别等优良特性。经过反复地商议,我们决定将其完全开源,供所有的开发者自由使用,使其能发挥最大的价值!为了方便大家使用,我们将数据制作成了TFRecords以及npz文件格式【文件顺序未打乱】,使其便于读取,能很好地配合现有机器学习框架使用,当然,如果你觉得它还可以做的更好,你也可以自行DIY,我们将分割后的原始图像也上传到了科赛平台上,你可以将其做成你喜欢的任何数据格式,并创建各种有趣的项目。我和我的团队衷心地希望你能在使用它的过程获得乐趣! 最后,十分感谢科赛网提供的平台,为数据的维护和推广提供了极大的便利!能让更多人看到藏文数字和原创数据的美,就是我们最大的收获!

——袁明奇、才让先木等

2018年11月27日

数据下载

点此下载数据集

数据说明

  • 数据文化 藏区按方言划分为卫藏、康巴、安多三大藏区,东接汉地九州。藏区有典:“法域卫藏、人域康巴、马域安多”即“卫藏的宗教、康巴的人、安多的马”。 而藏文主要有楷体和形体两种文字。我们本次的TibetanMNIST正是形体藏文中的数字,也就是图片中连笔书写更加简洁的那种~

Image Name

  • 文件列表
  • TibetanMNIST.tfrecords (每张图像存储为28x28x3的三通道图像矩阵)
  • TibetanMNIST.npz (每张图像存储为28x28的单通道图像矩阵)
  • TibetanMNIST.zip

TibetanMnist.zip文件为原始图像文件,图像文件名的第一个数字为数字类别标签,第二个数字为数字所在纸张标签,第三个数字为纸张标签内的数字序列。

  • 数据特征及属性
数据集名称 数据类型 原始图像宽 原始图像高 TFRecords图像宽 TFRecords图像高 通道数 位深度 值缺失 实例数 相关任务
TibetanMnist 图像数据 350 350 28 28 单通道 8 N/A 17768 分类任务
  • 数据分布
0 1 2 3 4 5 6 7 8 9 总计
1996 2134 1872 1816 1967 1350 1618 1302 1642 2071 17768
  • 藏文数字与阿拉伯数字对照表
0 1 2 3 4 5 6 7 8 9
  • 数据示例

Image Name

数据处理

我们使用Keras建立了一个BP网络来训练这批数据,以下为网络代码:

from tensorflow import keras
from keras import utils
import numpy as np

data = np.load('E:/TibetanMNIST.npz')
x_train = data['image'].reshape(17768, 784)
y_train = utils.to_categorical(data['label'], 10)

# create model
model = keras.Sequential()
model.add(keras.layers.Dense(784, input_dim=784, kernel_initializer='normal', activation= 'tanh'))
model.add(keras.layers.Dense(512, kernel_initializer='normal', activation= 'tanh'))
model.add(keras.layers.Dense(512, kernel_initializer='normal', activation= 'tanh'))
model.add(keras.layers.Dense(10, kernel_initializer='normal', activation= 'softmax'))

# Compile model
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

# Fit the model
model.fit(x_train, y_train, epochs=10, batch_size=200, verbose=1)

对网络结构进行可视化:

Image Name

在训练10个世代后,精度稳定在94%左右:

  200/17768 [..............................] - ETA: 0s - loss: 0.1813 - acc: 0.9400
 2400/17768 [===>..........................] - ETA: 0s - loss: 0.1629 - acc: 0.9421
 4200/17768 [======>.......................] - ETA: 0s - loss: 0.1541 - acc: 0.9452
 6600/17768 [==========>...................] - ETA: 0s - loss: 0.1603 - acc: 0.9432
 9000/17768 [==============>...............] - ETA: 0s - loss: 0.1614 - acc: 0.9427
11000/17768 [=================>............] - ETA: 0s - loss: 0.1640 - acc: 0.9408
13200/17768 [=====================>........] - ETA: 0s - loss: 0.1632 - acc: 0.9402
15600/17768 [=========================>....] - ETA: 0s - loss: 0.1662 - acc: 0.9392
17600/17768 [============================>.] - ETA: 0s - loss: 0.1698 - acc: 0.9387
17768/17768 [==============================] - 0s 27us/step - loss: 0.1698 - acc: 0.9387

数据使用

  • TFReords文件使用
import tensorflow as tf

def _parse_function(example_proto):
  features = {'label':tf.FixedLenFeature([], tf.int64),
              'img_raw':tf.FixedLenFeature([], tf.string)}
  
  parsed_features = tf.parse_single_example(example_proto, features)
  img = tf.decode_raw(parsed_features['img_raw'], tf.uint8)
  img = tf.reshape(img, [28, 28, 3])
    # 在流中抛出img张量和label张量
  img = tf.cast(img, tf.float32) / 255
  label = tf.cast(parsed_features['label'], tf.int32)
  return img, label

filenames = ["要读取的文件序列"]
dataset = tf.data.TFRecordDataset(filenames)
dataset = dataset.map(_parse_function)
# 创建单次迭代器
iterator = dataset.make_one_shot_iterator()
# 读取图像数据、标签值
image, label = iterator.get_next()
  • ** NPZ**文件读取
import numpy as np

data = np.load('文件')
x_train = data['image'].reshape(17768, 784)
y_train = utils.to_categorical(data['label'], 10)

数据来源

PulseAI

使用注意

本数据集版权归PulseAI所有,使用该数据请务必注明数据出处,否则我们将追究相应的法律责任!

Releases

No releases published

Packages

No packages published