SVM, CAPTCHA, hack
无聊得蛋痛, 想起了电子科大附属幼儿园”门户”的那个CAPTCHA.
前几周帮导师准备支持向量机的上机实验的时候, 正好看到一个用svm识别手写阿拉伯数字的数据库.
简单来说, 手写数字的图形被缩放为16×16的二值图像最后转化为256参数的多元分类问题,
考虑到上面这个阿拉伯数字数据库不错的交叉检验准确率, 我也就顺便拿来做”门户”的CAPTCHA识别了.
写了个脚本拖了100+个验证码样本回来, 仔细看了下,
虽然这个第二版山寨门户的CAPTCHA比第一版的CAPTCHA有了不少的进步(第一版的数字无比规则以至于可以直接写一个Greasemonkey脚本用canvas来识别),
但是总体上还是比较好识别的, 统一是二值图片, 字符间有清晰的间隙(除了有一张图有一点毛刺外),
只是图片加上了一些简单的几何变换.
上面是一个CAPTCHA的例子。
考虑到几何变换对字符产生的形变所造成的相同字符间差异,还没有手写阿拉伯数字样本间的差异大,
我就没做任何校正处理直接把字符切割了送去做训练和识别了.
通过识别各个字符的最大边界, 将四个字符分割出来, 统一复制到60×60的一块空画布上,
最后缩放到15×15, 转化为标准的二值 bitmap, 最后输出为libsvm的标准格式.
训练集我一共下载了124张CAPTCHA图片, 也就是496个字符的samples,
用libsvm对训练集做了5重的Cross-Validation, 自检验准确率: 97.1311% (Radial Basis核).
*EDIT* 又用线性核做了一次, 可以跑到98.1557%
总的来说, 支持向量机识别这个轻微几何变形的CAPTCHA还是有相当高的准确率的.
最后感谢无比handy的PIL以及Python,
这让我突然想起了用C/CPP写酵母基因预测程序时候的繁琐和折磨.
最后的最后, 我也不知道把这个CAPTCHA hack了有什么实质性的用处,
电子科大附属幼儿园门户系统如此山寨, 以至于从上一版本到现在的版本,
都可以绕过CAPTCHA直接提交信息进行认证,
回扣万岁!!

