Mythsman


乐极生悲,苦尽甘来。


自制正方软件系统验证码的识别程序(1/4)

学了几天机器学习的原理,感觉还是要自己动手写一个像样的程序才行。正好刚研究过deeplearning.net上的那个识别mnist数据库的源码,于是打算利用一下写一个识别验证码的程序。

他提供的代码已经基本实现了利用Logistic Regression 来分类,用的是softmax算法,支持多元分类。然而他只能读入指定的mnist数据集的经过处理后的格式。因此我当前的任务就是将一张实实在在的图片转换成计算机可以识别的格式,并且进行好预处理,选择好特征值,而不用考虑机器学习代码的细节(这个的确有点难)。但是仅仅是处理好这些事情也并不容易。

目标

我的目标是我们学校的选课系统的网站(没错我是苏大的0.0),这里的验证码相对比较规则,而且未来应该有点实用价值吧。

1

下载图片

下载这种东西还是用shell脚本方便:

for((i=1;i<=10000;i++))
do
	wget -O './png/'$i 'http://xk.suda.edu.cn/CheckCode.aspx'
done

一不小心下了10000张,先留着再说。

获得训练集

本来想在网上找点靠谱的识别平台,但是不管要不要钱,效果都不好。所以,,甭想了,先人脑识别500张再说。。。。。。

为了方便以后使用,我就用他的文件名来记录实际的值。

分析

自己观察下载的图片,发现他有这么几个特点:

  1. 包含字母数字,但是9、o、z三个字符不存在(估计是因为容易产生混淆,为了方便用户就没提供这些)。这一点很重要,因为在进行训练的时候,如果某个集合是空的,那么就会在执行的过程中出现类似‘除0错误’这样的东西。因此分类的时候需要把这三个字符排除。
  2. 包含四个字符,每一个字符都占据一个相对固定的位置。这一点大大降低了识别的难度,因为这样我们就可以将字符进行分割,从而把问题转化为对单个字符的识别。否则用普通的办法就难以下手了。
  3. 字符的颜色固定,都是蓝色。这样我们就可以非常方便的进行二值化处理而不用考虑反色的问题了。
  4. 图片的噪声只有一些象征性的点点。。。这对我们来说几乎形同虚设,只要稍微对图片进行处理就能消除影响。
  5. 下载了大量的数据之后发现竟然有大量的图片出现重复,于是我猜他的图片并不是动态生成的,而是静态读取的。这么说来就算再不济,我也完全可以把他的图片全部下载,找个验证码平台识别好然后进行hash查找。总共也就167万种,全部下下来就几个G,跑个小半天应该就下的差不多了吧。

根据上面这些特点,我们就能有针对性的设计程序了。