多年来,手写体数学识别一直是研究热点,也是图像处理与识别领域中的研究课题之一。由于手写体数字的随意性很大,例如,笔画的粗细、字体的大小等都直接影响到字符的正确识别,所以手写体数字识别是一个很有挑战性的课题。
在过去的数十年中,研究者们提出了许多的识别方法,取得了较大的成果。手写体数字识别实用性很强,在大规模数据统计,如人口普查、财务、税务、邮件分拣等应用领域中都有广阔的应用前景。
本文是手写数字识别系统,采用深度学习的方法,在Matlab的guide上开发出GUI,能够对MNIST数据集进行预处理、CNN训练等操作,测试集的识别率接近100%。
00 目录
1 设计要求
2 程序目录说明
3 MNIST数据集介绍及处理
4 AlexNet网络修改
5 系统设计
6 系统实现
7 源码获取
8 展望
01 设计要求
本课题要求实现一个手写数字识别系统,选择一种手写字符识别的方法以实现能够对质量较好的字符图像进行识别的功能,利用MINIST数据集进行测试,要求测试准确度高。
02 程序目录说明
本文的GUI界面部分来自于作者的人脸识别系统,所以GUI名称是face_recog没有改动。
03 MNIST数据集介绍及处理
3.1 MNIST数据集介绍
对于手写数字识别,常用的数据集就是MNIST手写数字数据集,
包含0~9这10个数字的手写图片,每个数字都由6万幅训练图像和1万幅测试图像构成,每一张都是28×28(像素)的黑白图像,MNIST数据图像如下,
3.2 将MNIST转换为图像数据库
了解了MNIST数据库后,需要利用这个数据库,这部分参考了斯坦福大学Andrew Ng教授的课件,通过loadMNISTImages.m和loadMNISTLabels.m两个文件读取mnist数据集。
loadMNISTImages.m
loadMNISTLabels.m
通过以上语句,能够将MNIST数据集转换为matlab里的图像矩阵
而后再对这些数据进行如下的批处理
即可将图像矩阵转化为文件夹中分好类的图像库了,至此对于MNIST图形库的预处理已经结束。
04 AlexNet网络修改
AlexNet是经典的深度CNN结构,由著名学者Hinton和他的学生Alex Krizhevsky 设计,在2010年的ImageNet LSVRC-2010上,AlexNet在给包含有1000种类别的共120万张高分辨率图片的分类任务中,在测试集上的top-1和top-5错误率为37.5%和17.0%(top-5 错误率:即对一张图像预测5个类别,只要有一个和人工标注类别相同就算对,否则算错。同理top-1对一张图像只预测1个类别),在ImageNet LSVRC-2012的比赛中,取得了top-5错误率为15.3%的成绩,以远超亚军的成绩取得冠军,并一度掀起了深度学习的热潮。这里选择AlexNet进行修改,将其应用于本次的手写数字识别中。
在命令行中输入alexnet(‘Weights’,‘none’)即可查看AleNet网络的结构
可以看到AleNet的默认输入维度是[227 227 3],分类数是1000,我们需要对这些参数进行修改以满足我们的要求。在deepNetworkDesigner中对网络修改后,点击分析无报错,再将其导出即可
05 系统设计
程序在Matlab上的执行顺序为数据处理,数据集划分,AlexNet网络训练,识别测试集。
因为数据集MNIST为纯粹的手写数字图像,因此无需进行其它图像处理。
5.1 MNIST数据预处理
这部分在03节已经详述过,这里不再赘述。
5.2 AlexNet网络训练
将MNIST数据预处理后,会得到分类的图像数据库,matlab为方便我们进行数据分类,内嵌了imageDatastore()这个函数,能够很方便的将数据处理用于卷积神经网络的训练。以本文的MNIST数据读取为例:
digitDatasetPath保存了训练集的文件路径,而imdsTrain则保存了文件中子文件的路径及其类别
经以上处理后得到的imdsTrain和imdsValidation就可以直接用于卷积神经网络的训练了。
在训练前,还需要对网络的参数进行设置,包括训练步数、学习率、批次数等,设置完成后即可开始训练,训练结果如下:
(由于时间原因,我就不运行完了,网络训练可以手动停止)可以发现,随着训练迭代步数的增加,准确率曲线呈现明显的上升趋势,Loss曲线呈现明显的下降趋势,这也说明了网络模型的有效性,并且验证集准确率达到95%以上,效果非常好。
5.3 测试集效果
将网络训练得到的参数模型保存,再用如下语句调用即可实现对测试集图像类别的预测。
其中augimdsValidation为:
06 系统实现
本文利用MATLAB GUI将以上步骤集成,设计出手写数字识别系统如下:
打开GUI后,先 “载入预设网络”,也即AlexNet,这时会在左方坐标区中显示网络结构:
其次点击 “数据预处理”,会显示处理读条进度,由于数据有7w条,因此处理时间会比较长。
在训练CNN前,可以对模型的参数进行调整,比如训练步数,学习率等,在GUI设置完成后,再点击 “训练CNN”,即可对网络进行训练从而获得参数模型,其训练时间比较长,若精度已经满足需要,可手动停止。
训练完成后即可用训练好的模型进行预测了,这时可以点击 “载入单例图像”,图像会显示在中间坐标区中,再点击 “CNN-手写数字识别(单例)”即可对该图像的数字进行识别。
也可以点击 “数字库识别率(测试集)”用来观察对于测试集的识别率。
在“历史记录“栏中,总共可显示10条识别记录。
注意,该系统因为会用到深度学习工具箱,所以对版本有要求,作者的是2020a。
07 源码获取
见评论区或私信作者。
(保证运行,有任何问题私信作者)
08 展望
本文实现的功能对于手写数字的识别,用到的数据集是MNIST,由于数据集质量较好,因此并没有图像预处理的过程,而实际生活中所遇到的数字图像往往含有噪声以及复杂背景,因此本系列将继续针对这些问题对系统进行改进,欢迎关注~