手写数字识别的系统设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
手写数字识别的系统设计
作者:路明玉
来源:《科技资讯》2019年第19期
摘 ;要:數字识别技术的研究不仅可以解决当下面临的数字识别问题,同时在图像识别,机器学习等方面也有铺垫作用。
该文主要通过卷积神经网络(CNN)方法实现手写数字的识别。
先设计网络模型,再用MNIST数据集训练,并测试网络模型的识别准确率,接着对手写数字进行图像的预处理,输入到模型中,验证正确程度。
关键词:数字识别 ;卷积神经网络 ;数据集
中图分类号:TP391.4 ; 文献标识码:A 文章编号:1672-3791(2019)07(a)-0031-02
1 ;课题意义
很多机器识别的办公系统将产生,如:手写字体的识别。
这些对于信息的获取有着很重要的作用,尤其在快递分拣、银行票据分析等方面最为突出。
另外,图像识别技术的研究为人工智能开启了里程碑,在机器学习、机器人研究等方面起到了关键的作用。
这方面的研究很有实用价值,重要性也是不言而喻的。
2 ;图像预处理与数据集
图像预处理是在不影响识别效率的前提下,对手写数字原始图像进行规范处理,减少无用的信息,降低计算量,提高识别率。
在手写数字界面已经设置了黑底的画图板和白色的画笔,所以不需要再使用二值化处理。
2.1 图像的灰度化
图像灰度化的目的是降低图像识别中的计算量,前提是灰度后的图像没有失去用于识别的重要信息。
灰度化的本质是将一张原来看起来颜色多样的图像通过编程语言转化为灰度化的图像,其中灰度化的图像只有一种颜色,但灰度化的过程中,可以事先设置一个值用于灰度化图像,否则,每一张图像进行灰度化处理都有255种选择,每一种的灰度化程度是不一样的。
图像的灰度化就是将3个分量设置同样大小,不影响图像主要特征的提取,方便数字的提取和图像的识别。
在设置灰度值过程中,有很多方法,最为常用的是利用取每个点3个分量的平均值,这样灰度化的图像,基本显示了原来图像的所有特征,识别过程更加高效。
2.2 MNIST数据集
MNIST数据集由训练集和测试集组成。
MNIST数据集的每一张图片由28×28(pix)构成,每个图像都经过了图像的灰度化处理,一张完整的图像是由几千万个像素点构成的,每一
个像素点都有成千上万种颜色。
但是灰度化处理的图像,每个像素点的取值只有255中,MNIST中的每一张图像的每一个像素点都有一个灰度值。
它包含了4个部分:训练集样本,训练集标签,测试集样本,测试集标签。
3 ;CNN网络结构系统设计
3.1 界面设计
CNN识别显示结果界面主要包括:左侧为手写后预处理的图像,大小为28×28(pix)黑底白字,中间显示该图片被识别为0~9各个类别的概率,识别结果取各个类别的最大值,最后一行显示识别结果。
右侧是统计图表,用Matplotlib画一个折线统计图显示每一个数字的概率,识别结果一目了然。
3.2 详细设计
CNN主要是用卷积层构成的网格,卷积层跟全连接层相似,只是对之前的输入做了卷积运算。
卷积之后要做的就是池化操作,因为卷积层每次作用在一个窗口,它对位置很敏感。
池化层能够很好地缓解这个问题。
它跟卷积类似每次看一个小窗口,然后选出窗口里边最大的元素,或者平均元素作为输出。
卷积模块通常是“卷积层-激活层-池化层”。
然后输出给后面的全连接层。
其中激活函数一般作为卷积函数的参数使用,池化层是对卷积层的输出按区域取最大值或者平均值,也是局部采样过程。
除此之外,还有一个Flatten层,它是卷积层和全连接层的过渡层,主要的作用是使多维输入变为一维输入。
该课题采用了LeNet5架构。
卷积神经网络训练和测试结构的关键部分如下:
前面数据的导入部分和MNIST是一样的。
conv1 = mx.sym.Convolution(data=data, kernel=(5,5), num_filter=20)#第一层卷积操作,其中卷积核大小为(5,5),输入数据来自数据集。
tanh1 = mx.sym.Activation(data=conv1, act_type="tanh")#激活函数
pool1 = mx.sym.Pooling(data=tanh1, pool_type="max", kernel=(2,2), stride=(2,2))#池化操作,消除卷积后的数组的空间敏感性。
这里采用最大值池化。
conv2 = mx.sym.Convolution(data=pool1,kernel=(5,5), num_filter=50))#第二层卷积操作,其中卷积核大小为(5,5),输入数据来自数据集。
tanh2 = mx.sym.Activation(data=conv2, act_type="tanh")
pool2 = mx.sym.Pooling(data=tanh2, pool_type="max", kernel=(2,2), stride=(2,2)) #池化操作,消除卷积后的数组的空间敏感性。
这里采用最大值池化。
flatten = mx.sym.flatten(data=pool2)#第一层全连接层
fc1 = mx.symbol.FullyConnected(data=flatten, num_hidden=500)
tanh3 = mx.sym.Activation(data=fc1, act_type="tanh")
fc2 = mx.sym.FullyConnected(data=tanh3, num_hidden=10)#第二层全连接层,神经元数量为10个
lenet = mx.sym.SoftmaxOutput(data=fc2, name='softmax')#交叉熵损失函数,进行参数更新
mlp_model.fit(train_iter, ;# 训练数据
eval_data=val_iter, ;# 验证数据
optimizer='sgd', ;# 运用SGD 训练模型
optimizer_params={'learning_rate':0.1}, ;# 使用固定的学习效率
eval_metric='acc', ;# 训练期间返回精确度
batch_end_callback = mx.callback.Speedometer(batch_size, 100), # 每次处理100张图片
num_epoch=Epoch) ;# 进行10次全部数据处理
test_iter = mx.io.NDArrayIter(mnist['test_data'], None, batch_size)#测试数据
prob = mlp_model.predict(test_iter)
assert prob.shape == (10000, 10)#对图像进行预测并分类
4 ;系统运行结果
在输入界面写一个数字8,看是否实现手写功能,结果发现,书写一个一笔可以完成的数字是可以的;接下来写一个有断笔的数字,可以看到书写界面基本完成功能要求;再下来就是识
别按钮,功能是否可以?并且识别准确率如何?我们在界面输入9,观察结果,图像属于“9”这个类别的概率是99%,基本可以辨认手写数字,功能基本实现。
参考文献
[1] 张捷.手写数字识别的研究与应用[D].西安建筑科技大学,2014.
[2] 曹毅.基于神经网络的手写体数字识别关键技术研究[D].西安工业大学,2014.。