怎样用 MATLAB 识别图片上的文字?

不相识不打

共 1427字,需浏览 3分钟

 · 2022-02-09

去年自己做的一个小东西,现在看起来觉得没那么难,而且完成了这个小项目之后,又学深入学习了一阵子,等有空再继续改改。

去年做的小项目大概是这样的:因为学校的教务管理系统查分数比较麻烦,需要自己时不时登录去“轮询”,比较麻烦。那时会一点爬虫,刚好学了一些机器学习的算法。想着训练出一个神经网络识别教务系统的验证码,然后让代码帮我隔5分钟查一下成绩,有新的成绩出了就发邮件给我。于是我开始了。

1、 验证码预处理

我们学校的教务系统验证码长这个样,4个字符(英文小写字母加数字),左右倾斜,背景加了一些噪声:



第一步想到的是滤波,验证码的噪声不像椒盐噪声,更像高斯噪声。我自己也写了个均值滤波器,效果也很不错,对付这种比较简单的噪声污染没有太大问题。

在实际中,我直接调用了matlab的自带滤波器,维纳滤波。进行灰度处理后直接交给维纳滤波:

滤除噪声的效果不错。

为了接下来的操作速度快一点,我直接进行了二值化操作,调整好阈值,二值化后得到:

2、Character Segmentation(Partition)

在实际的photo OCR当中,字符分割是很难的,在NG的machine learning中提到了一点,可以用sliding window的方法去实现,在这里,我观察了验证码的特点,其实验证码当中的字符都相对固定,所以我用最简单的方法分割图像,当然有时会偏差比较大。这也是可以改善的一点。我个人认为利用图论算法中的minimum cuts可以找到连接最弱的部分,然后进行切割,这也是可行的。

切割后的效果:

3、 神经网络

当时只能说是入门了神经网络,学的是NG的课。直接用了一个全连接的前馈神经网络,一共4层,input layer一共是260个神经元,两层hidden layer都是200个神经元,output layer是36.

虽然方法很笨,一开始训练样本也不多,我抓了100张验证码,并手动标签了,训练了一个初步的模型。然后我就直接用这个模型去识别,把正确识别的验证码和对应的字符保存起来;把识别错误的保存到另外一个文件夹。针对识别错误的验证码,我手动标签,然后训练,重复这个过程。后面验证码已经接近1000张了。

虽然方法很笨,但是效果很不错。经过我几次改进之后,在线识别100张,正确识别率基本在90%以上(90%~93%左右)

其实,利用CNN效果会更好。先抓取大量为标签的验证码,先进行预训练,再进行监督训练,效果也会好很多。

当时就是这样,利用全连接网络+L2 weight penalty,利用full-batch method 加 conjugate gradient训练了这个网络。

之后我学了Geoffrey E. Hinton的课程之后,进一步了解了神经网络,可以做的花样就很多了。

总结

这就是训练集的一部分:

标签:

我租了腾讯云的服务器,学生优惠,1元1个月。

在考试月的时候完成了全部代码,先在matlab完成了前期工作,然后用Python写了一遍,加上了爬虫的那一部分。 最后每次有成绩都第一时间通知我:

附上github传送门

[matlab版] mepeichun/Matlab_checkcode_verification

[java版] mepeichun/Java_checkcode_verification

[Python版] mepeichun/check_score_system

写得很乱,因为那段时间参加了好几个比赛。。有空再改

浏览 5
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报