HTML5技术

字符型图片验证码识别完整过程及Python实现 - 一点一滴的Beer(4)

字号+ 作者:H5之家 来源:H5之家 2016-07-16 16:00 我要评论( )

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模型

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的21张图片来进行模型测试
  • 测试图片生成带标记的特征文件名称为 last_test_pix_xy_new.txt
  • 在早期训练集样本只有每字符十几张图的时候,虽然对训练集样本有很好的区分度,但是对于新样本测试集基本没区分能力,识别基本是错误的。逐渐增加标记为8的训练集的样本后情况有了比较好的改观:

  • 到60张左右的时候,正确率大概80%
  • 到185张的时候,正确率基本上达到100%
  • 以数字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个验证码的样子。

    硬件层次优化

  • 粗暴地增加CPU性能
  • 粗暴地增加运行机器
  • 基本上,10台4核心机器同时请求,保守估计效率可以提升到1s识别1万个验证码。

    19   互联网安全警示

    如果验证码被识别出来后,会有什么安全隐患呢?

    在大家通过上一小节对识别效率有了认识之后,再提到这样的场景,大家会有新的看法了吧:

  • 12306火车售票网,春节期间早上8:00某车次放出的500张票,1s内全部被抢光,最后发现正常需求的人抢不到票,但是黄牛却大大的有票
  • 某某手机网站,早上10:00开启抢购活动,守候了许久的无数的你都铩羽而归,但是同样黄牛却大量有货
  • 暂先不管后面有没有手续上的黑幕,在一切手续合法的情况下,只要通过技术手段识别掉了验证码,再通过计算机强大的计算力和自动化能力,将大量资源抢到少数黄牛手中在技术是完全可行的。

    所以今后大家抢不到票不爽的时候,可以继续骂12306,但是不要骂它有黑幕了,而是骂他们IT技术不精吧。

    关于一个验证码失效,即相当于没有验证码的系统,再没有其它风控策略的情况下,那么这个系统对于代码程序来就就完全如入无人之境。

    具体请参考:

    Web应用系统的小安全漏洞及相应的攻击方式

    通过上面的例子,大家可以看到:

  • 目前确实有一些web应用系统连验证码都没有,只能任人宰割
  • 即使web应用系统有验证码但是难度不够,也只能任人宰割
  • 所以,这一块虽然小,但是安全问题不能忽视。

    20   积极应用场景

    本文介绍的其实是一项简单的OCR技术实现。有一些很好同时也很有积极进步意义的应用场景:

    这些场景有具有和本文所研究素材很相似的特点:

    所以如果拍照时原始数据采集比较规范的情况下,识别起来应该难度也不大。

    21   小结

    本文只是选取了一个比较典型的而且比较简单的验证码的识别作为示例,但是基本上能表述出一个识别此类验证码的完整流程,可以供大家交流学习。

    由于目前全球的IT技术实力参差不齐,现在很多旧的IT系统里面都存在一些旧的页面框架,里面使用的验证码也是相当古老,对于当下的一些识别技术来说,完全不堪一击。比如,我看到一些在校大学生就直接拿自己学校的 教务系统 的验证码来 开刀练习 的。

    最后,本文特意提出如下倡议:

  • 对于掌握OCR技术的人
  • 对于仍然沿用旧的落后的IT系统的公司或者机构相关人员

    应该尽快认识到事情的严重性,赶紧升级自己的系统,或者将这一块业务交付给专门的安全公司

  • 22   参考资料

    LibSVM for Python 使用 

    基于SVM的手写体阿拉伯数字识别.张鸽,陈书开.长沙理工大学计算机通讯工程学院.2005

    23   最后题外话

    我估计这样 长文 绝大部分人是不会有兴趣全部看完的。但为了它的内容完整性,还是决定先以整篇的方式发表出来吧。

    后面有空再拆分连载吧。

    作者: Harmo哈莫

    作者介绍: https://zhengwh.github.io

    技术博客:

    Email: dreamzsm@gmail.com

    QQ: 1295351490

    时间: 2016-02

    版权声明: 欢迎以学习交流为目的读者随意转载,但是请 【注明出处】

    支持本文: 如果文章对您有启发,可以点击博客右下角的按钮进行 【推荐】

     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • 浓缩的才是精华:浅析GIF格式图片的存储和压缩 - 腾讯云技术社区

      浓缩的才是精华:浅析GIF格式图片的存储和压缩 - 腾讯云技术社区

      2017-04-07 15:08

    • 前端识别验证码思路分析 - 腾讯云技术社区

      前端识别验证码思路分析 - 腾讯云技术社区

      2017-03-30 10:00

    • HTML5本地图片裁剪并上传 - QxQstar

      HTML5本地图片裁剪并上传 - QxQstar

      2017-03-25 14:00

    • 图片展示丨标签 - xiaohaimiansBlog

      图片展示丨标签 - xiaohaimiansBlog

      2017-03-08 17:00

    网友点评
    r