验证码识别记录
研究了2天的验证码识别,虽然没有成功,但是从中还是收获了不少,这里记录一下,方便以后继续。
首先看图片:
我就是被这种“简单”的验证码给欺骗了,没有干扰,不用去噪点,看起来一切是那么的容易,三下五除二的批量下载了验证码,然后将图片切割开,就准备开始进行特征提取、训练及识别了。
最开始采用的方式是直线碰撞法,即随机在图片上生成若干直线,计算直线与字符的碰撞数量,以这个碰撞数量作为特征值,然后才用ANN神经网络进行训练和识别,最终的结果是,90%的字符被识别为了f(这个验证码的f变形太厉害了)。
第二种方式是将每个字符的图片二值化后,计算在垂直和水平线上的像素累计值,形成特征码,然后分别采用了LD(编辑距离),SVM进行训练和识别,结果同样识别率不高,试过了30多张验证码,只成功完全识别出一张(不过数字的识别率很高)。
第三种方式就是采用了Google的TesseractOCR,不过他在切割字符生成box的时候,问题比较大,基本都需要手动去调整每个字符的位置,所以,我写了个程序自动去生成box文件,字符定位的准确率能达到100%。box生成以后,便开始进行训练,采用的3.02版本,一路顺畅,然后进行了识别,结果惨不忍睹。
后来仔细思考了下,问题应该不在训练和识别算法上,常用的验证码识别算法不外乎就ANN,SVM,各种距离算法,这三种我都分别用过了,所以,我开始在特征码上找问题。
前面提取特征码分别用了直线碰撞法,像素累计值,二值序列,效果都不太理想,于是,想从图片本身的一些特征下手,第一个想到的是采用霍夫变换计算直线,用这个做为特征码,然后分别采用上面三种识别算法进行训练和识别,但是最后,都是以失败告终。第二个是计算字符的HU不变距(这个还专门自己做了一系列的图片来做测试,测试的效果都比较好,无论如何移动旋转或缩放,都有较好的识别率),通过这个不变距来进行相似度匹配,效果也是相当不理想。
其实,这个验证码识别率低的原因估计在于他的字符是无规律的随机变形(而不是单纯的旋转或者缩放),这种字符比较难以识别,所以,以后在做网站生成验证码的时候,如何来构建一个比较安全的验证码,就有一定经验了。