def train_svm_model(): """ 训练并生成model文件 :return: """ y, x = svm_read_problem(svm_root + ) model = svm_train(y, x) svm_save_model(model_path, model)
备注:生成的模型文件名称为 svm_model_file
16 模型测试
训练生成模型后,需要使用 训练集 之外的全新的标记后的图片作为 测试集 来对模型进行测试。
本文中的测试实验如下:
在早期训练集样本只有每字符十几张图的时候,虽然对训练集样本有很好的区分度,但是对于新样本测试集基本没区分能力,识别基本是错误的。逐渐增加标记为8的训练集的样本后情况有了比较好的改观:
以数字8的这种模型强化方法,继续强化对数字0~9中的其它数字的模型训练,最后可以达到对所有的数字的图片的识别率达到近乎 100%。在本文示例中基本上每个数字的训练集在100张左右时,就可以达到100%的识别率了。
模型测试代码如下:
def svm_model_test(): """ 使用测试集测试模型 :return: """ yt, xt = svm_read_problem(svm_root + ) model = svm_load_model(model_path) p_label, p_acc, p_val = svm_predict(yt, xt, model)#p_label即为识别的结果 cnt = 0 for item in p_label: % item, end=) cnt += 1 if cnt % 8 == 0: print('')
至此,验证的识别工作算是完满结束。
17 完整识别流程
在前面的环节,验证码识别 的相关工具集都准备好了。然后对指定的网络上的动态验证码形成持续不断地识别,还需要另外写一点代码来组织这个流程,以形成稳定的黑盒的验证码识别接口。
主要步骤如下:
然后本文中,请求某网络验证码的http接口,获得验证码图片,识别出结果,以此结果作为名称保存此验证图片。效果如下:
显然,已经达到 100% 的识别率了。
在本算法没有做任何优化的情况下,在目前主流配置的PC机上运行此程序,可以实现200ms识别一个(很大的耗时来自网络请求的阻塞)。
18 效率优化
后期通过优化的方式可以达到更好的效率。
软件层次优化
预计可以达到1s识别10到100个验证码的样子。
硬件层次优化
基本上,10台4核心机器同时请求,保守估计效率可以提升到1s识别1万个验证码。
19 互联网安全警示
如果验证码被识别出来后,会有什么安全隐患呢?
在大家通过上一小节对识别效率有了认识之后,再提到这样的场景,大家会有新的看法了吧:
暂先不管后面有没有手续上的黑幕,在一切手续合法的情况下,只要通过技术手段识别掉了验证码,再通过计算机强大的计算力和自动化能力,将大量资源抢到少数黄牛手中在技术是完全可行的。
所以今后大家抢不到票不爽的时候,可以继续骂12306,但是不要骂它有黑幕了,而是骂他们IT技术不精吧。
关于一个验证码失效,即相当于没有验证码的系统,再没有其它风控策略的情况下,那么这个系统对于代码程序来就就完全如入无人之境。
具体请参考:
Web应用系统的小安全漏洞及相应的攻击方式
通过上面的例子,大家可以看到:
所以,这一块虽然小,但是安全问题不能忽视。
20 积极应用场景
本文介绍的其实是一项简单的OCR技术实现。有一些很好同时也很有积极进步意义的应用场景:
这些场景有具有和本文所研究素材很相似的特点:
所以如果拍照时原始数据采集比较规范的情况下,识别起来应该难度也不大。
21 小结
本文只是选取了一个比较典型的而且比较简单的验证码的识别作为示例,但是基本上能表述出一个识别此类验证码的完整流程,可以供大家交流学习。
由于目前全球的IT技术实力参差不齐,现在很多旧的IT系统里面都存在一些旧的页面框架,里面使用的验证码也是相当古老,对于当下的一些识别技术来说,完全不堪一击。比如,我看到一些在校大学生就直接拿自己学校的 教务系统 的验证码来 开刀练习 的。
最后,本文特意提出如下倡议:
应该尽快认识到事情的严重性,赶紧升级自己的系统,或者将这一块业务交付给专门的安全公司
22 参考资料
LibSVM for Python 使用
基于SVM的手写体阿拉伯数字识别.张鸽,陈书开.长沙理工大学计算机通讯工程学院.2005
23 最后题外话
我估计这样 长文 绝大部分人是不会有兴趣全部看完的。但为了它的内容完整性,还是决定先以整篇的方式发表出来吧。
后面有空再拆分连载吧。
作者: Harmo哈莫
作者介绍: https://zhengwh.github.io
技术博客:
Email: dreamzsm@gmail.com
QQ: 1295351490
时间: 2016-02
版权声明: 欢迎以学习交流为目的读者随意转载,但是请 【注明出处】
支持本文: 如果文章对您有启发,可以点击博客右下角的按钮进行 【推荐】