SVM对简单验证码的识别

Posted by Codeboy on October 3, 2014

在科大上学已经半年多了,在研一下的这个学期里,有太多的英语课,科大的英语课有很大一部分是需要进行预约的,预约后去EPC(English Practice Center)学习。每次在电脑上查询在哪个屋上课甚是麻烦,于是打算做一个android手机小应用来方便的查询预约课程信息以及对课程进行评价。当然最后也要加入一些其他的功能,比如课表,成绩,研究生新闻的查看。

不论是研究生系统还是EPC网站,登陆的时候都需要输入验证码,识别验证码是所有其他工作的开始。近来对SVM(支持向量机)看了一些,打算使用SVM对验证码进行学习后预测。

下面首先看一下验证码的样式: img

对其中的若干张放大一下如下图: img

从图中我们可以很好的将验证码只有数字,且整体图片只有2种颜色,白色与红色。我们只需要按照以下步骤操作即可:

① 图片数字化与格式化
② 除干扰
③ 使用SVM进行学习
④ 使用学习后建立的模型预测验证码

下面对每一步进行分析:

① 图片数字化与格式化

图片的数字化还是很容易的,简简单单的将图片的像素值读取即可

图片的格式化就是将整个图片标志为0与1的点,即红色为1,背景色为0(反过来也一样了)

对其中一张2856的验证码进行操作,

img

使用空格代替0之后的结果如下: img

由上图可以很清楚的看到验证码数字了。

② 除干扰

第一步已经将图片数字化与格式化了,但是里面还是有一些干扰的,我们可以很明确的看出,如果一个点(1)周围全部是背景色(0)的话,这个点完全可以被认为成噪声,也即干扰点。简单处理后结果如下:

img

这样看起来就更好了。

③使用SVM进行学习

由于验证码非常的简单,所以我从下载的10000张8验证码中手动标注了100张进行学习,使用libSVM进行模型建立。整体上操作如下:将图片分成4部分,每一部分相当于10*10的一个二位数组,也相当于每一个验证码数字对应100维(仔细观察可以得出60维就可以了),验证码的识别等价于了一个分类问题,即一个物品有100个属性,同时这个物品的最终分类有10种,需要我们做的就是将其正确分类。这个学过数据挖掘知识的盆友应该都比较了解,具体大家可以google一下。当然svm知识一种放法,数据挖掘中处理分类问题有很多方法,决策树,神经网络,贝叶斯网络等,这里不再叙述。

④使用模型对验证码进行识别

使用第三步中建立的模型对剩余的9900张验证码就行识别,经验证,识别率为100%。

这一个验证码是比较的简单,没有旋转,没有缩放,非常的规则,所以我们可以很轻松的进行识别。我在另一个网站上也看到了下面的这种也是比较简单的验证码; img

这一种验证码比上面的略微复杂一点,不再是只有数字,而是数字和字母混在一起,颜色比较的多样,不过原理和上面的一样,无非在不同区域选择不同的主色,其他的全部作为背景色而已。使用相同的方法,最终此种验证码识别率也为100% 。

验证码识别做完了,下面做Android应用基本就是体力活了,整体上都是网页的分析,数据的获取了。经过几天的奋战,科大小秘书做完了,虽然做的比较丑陋,但是至少比较实用吧,还为它做了个小主页点击打开主页,也把应用上传到了google play中。

收到很多朋友的来信,询问具体的代码实现,经过整理后,代码已经分享到github上,https://github.com/androiddevelop/SimpleCheckcodeRecognition.

后面对科大小秘书整体上进行了改进,现在已经涵盖android,ios,web端,欢迎下载使用。

ustc.codeboy.me

如有任何知识产权、版权问题或理论错误,还请指正。

转载请注明原作者及以上信息。