本周是 SARS 学习计划的第一周,说来惭愧这一整周我都在外领略祖国大好河山,直到周六晚才回到家中。不仅如此本周也是我们项目立项准备开始的第一周,根据兴趣我最终选择参与了数字识别小组和新生入学小助手小组。尽管不在家手头里也没有趁手的设备,但由于我对两个组的项目抱有很大兴趣,因此抽空也查阅了一些资料。

  数字识别小组最终确认的项目是识别软微综合信息服务平台的验证码。由于之前本科毕设做的是车牌识别,接触过一些验证码识别项目。识别验证码其实已经有很多人在做,也有很多种方法。单从字符算法上来看就可以分为 SVM、随机森林等传统的机器学习算法以及最近几年非常火热的深度学习算法两种。目前主流实现思路依然是先采用一些图像学算法对验证码图像进行预处理,将其中的干扰点和干扰线进行清除后分割字符对每个字符进行识别。

  以一张验证码为例,首先对其灰度化,通过调整阈值将大部分噪点清除。
原始图像

图 1 原始图像

灰度图像
图 2 灰度图像

调整阈值后的灰度图像
图 3 调整阈值后的灰度图像

  通过灰度化和阈值分析后大部分噪点得以清除,但仍然存在少量的孤立噪点。此时计算图中每个点相邻 9 宫格的黑色点数,设置合适的阈值将其清除。
清除噪点后的图像
图 4 清除噪点后的图像

  这些噪点清除后就可以对图像中段的字符进行分割,其中的方法有很多,比如边缘算子,连通域分析。
分割后的字符
分割后的字符
分割后的字符
分割后的字符
图 5 分割后的字符

  这时就可以使用机器学习或者深度学习对单个字符进行训练和识别。

  这种方法看起来还是很简单的,但是毕设做车牌识别时的字符分割就没有那么简单了,首先车牌图像相对于图像的比例非常小且图像的质量受设备和天气的影响很大,一旦字符出现粘连,很大概率无法对车牌的字符进行分割。

  除此以外,在图像尺寸较大时,ANN 深度无法过深,否则根本无法训练。因此,训练神经网络必须对图片进行切割,但是 CNN 的出现让我们可以考虑实现不分割字符一次性识别验证码或者车牌。

  针对这种顺序书写的字符比如车牌以及验证码,使用RNN以及CTC可以在只知道序列顺序而不知道每个字符具体位置时让模型收敛。该模型最早由华中科技大学的白翔教授提出。这种模型不仅可以应用在图像中的文字识中,也可以实现对不定长的语音的识别。
RCNN 模型

图 6 RCNN 模型

  有同组的同学拿到使用 RCNN 模型的源码后迫不及待的使用其自带的验证码生成器进行训练。对学校综合信息服务平台的验证码进行测试,发现识别效果很差,由此得出该模型泛化差的结论,决定换模型,尝试字符分割算法。
识别效果
图 7 识别效果

  在之前做毕设的过程中,遇到最难的问题绝不是模型调优,而是数据的收集,一份高质量的车牌数据远比模型的选择更重要,这也是为什么很多老牌的车牌识别系统尽管使用传统的字符分割算法,但是识别效率远超那些用了各种深度学习算法的车牌识别系统。

  除此以外按照新生入学小助手组的工作安排,周日抽出了点时间完成了一个 Restful 风格的 Python demo,无需赘述。

参考链接