模式识别课程小作业

老师要求:  用MATLAB实现手写数字的识别,用GUI设计出可以用鼠标来写数字的输入板(竟然不是直接给图片)

沉浸在Python+Tensorflow/Caffe的世界里,完全没用过GUI的我眼泪掉下来。玉米找了好久的资料,感觉大多没什么用,还乱的很。自己一步步地学用GUI和用matlab训练网络。看着老师给的100张图片和一堆暂时没看出来有什么用的C++代码,真的是gui知道我都经历了些什么~

不过最后还是成功实现了

下面记录一下辛酸史,超浅显也超详细,没有很强大的功能,适合跟我一样的小白仅用来完成任务。

首先新建GUI界面,可以自定义文件路径。创建后即会弹出GUI的编辑界面和.m文件,其中已经自动生成了一些代码。

此处参考百度经验:

(PS:若是不小心关掉了GUI的编辑界面也是可以通过"新建->打开现有GUI"再次编辑的)

在百度文库里找到了一篇关于GUI的比较详细的课件:

一些基础性知识不再赘述,也避免侵权。需要重点了解的有:回调函数、句柄函数、对象属性函数。

本任务中用到的有按钮、文本和坐标区三种控件。创建控件后双击可更改属性,如名称、字体大小等。此时运行后的界面暂时还不能写字,需要在.m文件里编写相关回调函数。

写字板的代码参考:

主要是让坐标区能显示鼠标画下的线。

在GUI编辑界面的相应控件处右键,点击"查看回调"下的相应函数,然后再到.m文件处编辑函数内容。需要什么控件实现什么功能就编辑该控件的相应函数哦~

(下面删除了.m文件里一些没用的注释,省略了前面自动生成的代码,识别按钮的回调函数会在后面贴上)

此时再运行就能在坐标区写字了。

不过注意:

需要将坐标区的属性->XLimMode/YLimMode都由auto改为manual。不然写出的第一笔会乱跳,轴还会动。

接下来就是要识别出手写的数字了,此处涉及到训练模型。码字到这儿犯懒,下面有些函数相关的细节不想细说了。一些看不懂的函数就直接help找文档说明看吧

由于在MATLAB官方网站上找到了一篇基于HOG特征+SVM分类器识别数字的文档,老师也还没有要求用什么方法识别,我就按照文档的教程用老师给的100张图片试着训练了一下。最终效果还行,也常有错误的情况。

文档链接如下,训练模型参考了大部分代码:

-classification-using-hog-features.html

玉米按照平时常用的思路,将SVM的训练代码单独用个脚本,将训练好的模型保存下来。这样训练一次,后面识别时直接导入模型使用就行,省时省力。

训练代码如下:

识别按钮的回调函数:

初步实现了一下,也没用许多数据,效果一般般吧,还能凑合~

思考:用MNIST数据集或多加一些数据来训练的话效果应该会更好。或者用其他的分类方法,如贝叶斯、BP神经网络、深度卷积神经网络等。但由于时间问题,同时本人也不想深究MATLAB,故没有继续深入了解。界面也许能更美观点,能加入更多的功能,系统也许能有更好的分类性能,这些就留给有兴趣的人继续探索吧~