[验证码识别技术]字符验证码杀手--CNN

字符验证码杀手--CNN

1 abstract 

目前随着深度学习,愈来愈蓬勃的发展,在图像识别和语音识别中也表现出了强大的生产力。对于普通的深度学习爱好者来讲,一上来就去跑那边公开的大型数据库,好比ImageNet或者CoCo,能够会以为这个屠龙之技离生活好遥远。那么本文就是但愿将此技术运用到一些普通用户平常就能感知的场景上,让普通用户切实可以体会到深度学习工具的非凡能力。程序员

关键字:深度学习,验证码,破解,识别,CNN算法

2 验证码概述

不少普通程序员在入门爬虫的时候,基本上都会遇到的环节---“验证码”。就是这个东西使得不少程序的自动化工做止步,让人懊恼不已。关于验证码的功能,之前提到过(todo),本文再也不赘述,只用一句话来归纳下:验证是一种防止程序自动化的一个措施,其最多见的表现形式就是看图识别字符。数据库

验证码技术就是一种反自动化技术。本文所解决的问题则是,使用深度学习技术来实现“全自动化的识别验证码”(这听起来有那么点人工智能的味道了)。编程

由于如今新的形式的验证产品不少,光从外界的展示形式上就有:安全

  1. 完整滑动解锁式
  2. 随机滑动拼图式
  3. 随机点选汉字式
  4. 图片分类选择式
  5. 其它

可是本文是以学习为目标,并不指向任何一种验证形式,而是指向传统的字符型验证码。由浅入深来对验证码进行一些科普。下图就是网络上的各色各样的字符型验证码,敬请你们赏析:网络

  

3 验证码场景

首先说明本文的观点:随着深度学习技术在图像处理技术上愈来愈强大的表现,这些传统的纯依靠简单图片的码式验证已经没有任何的安全性可言session

可是这些不安全的验证码却即便是在今天写这篇文章的时候,还存在于互联网的各个角落,存在于大互联网公司,基于像银行,证券和保险等等这些金融领域。app

这些主要的应用场景包括:注册,登陆,找回密码,抢购下单,评论,投票等等。若是这个地方不安全的话,也就是说可以经过程序作自动化,那么网络上的资源就会所有被自动化程序抢夺过去,或者说直接落入少数会作自动化的人的手中。为何呢?由于普通计算机程序的计算能力是人的几万甚至几百万倍。框架

若是还不能理解,我说一个简单的例子吧,若是你本身去注册你的账号密码须要3分钟完成,可是经过程序能够一秒钟注册300个帐号。讲到这个地方,若是你还不理解,那么你想象在去年的时候互联网金融行业很是火爆时,每注册一个帐号就有20块钱能够拿。也就是说比较厉害的人能够经过这个程序,一秒钟赚6000块钱。机器学习

若是你还不能理解这个东西的话,再举一些和你们平常生活中很是相关度高的一个场景:

  1. 网上春节购买火车票。春节的时候你们会买火车票吧?你是否是发现你守在电脑面前无论怎么用心,无论怎么努力,结果发现放出火车票的时候,那些票一扫而光?而后发现身边好多人都没买到票,可是网上黄牛那儿却票源充足,可是很差意思,得加价。
  2. 网上手机新品发布秒杀。国内大厂手机新品发布时,网上瞬间秒光,本身买不到,可是黄牛那儿也有,得加钱。
  3. 网上开盘选房子。你要买房子,网上开盘选房,虽然你已经作好了不看户型,有房就抢的准备,可是开盘瞬间,你就发现网络被挤爆,而后等线上网页缓过来时,房子已经完了。可是身边加钱找专业人员代抢的人却抢到了房子,为何?
  4. 网上拍汽车牌照。在国内某些大城市里面对于汽车牌照的发放量的把控是是很是严格的。每次在网上拍牌照的那天,不少人都会请假一天,而后在一个网络环境很是好的网吧里面等待来处理这个事情,可是发现仍是抢不过别人付费请的专业团队的那些人。固然抢不过有一方面是本身业务不熟悉的缘由,还有一方面就是:可能你在拿一个小铲子的辛苦的小打小闹的,别人直接操纵在一个大型挖掘机上战场了。生产力是彻底不同的。

相似的事情特别特别多。这个产业就叫作“薅羊毛”,顾名思义就是聚沙成塔,有很小的成本把一点点的小的利益汇集起来就会变成一个比较可观的利益。

4 应用举例

4.1 互联网大厂

4.1.1 美橙互联

https://www.cndns.com/members/signin.aspx

 

4.1.2 中国互联网络信息中心

http://www.cnnic.net.cn/

 

4.1.3 百度

https://wappass.baidu.com/

 

4.1.4 阿里支付宝

 https://omeo.alipay.com/service/checkcode?sessionID=a2a5fc056b8e3ef8b32758835333d673&t=0.3144848125469759

  

4.1.5 网易邮箱

http://reg.email.163.com/unireg/call.do?cmd=register.entrance&from=163navi&regPage=163

 

4.1.6 58同城

https://passport.58.com/validcode/get?vcodekey=d5S2Tk7dofqN30VwIN6WTwvOHP6AkyvC&time=1466065243496

 

4.2 互联网金融

4.2.1 平安保险

https://www.pingan.com.cn/pinganone/pa/index.screen?sid_source=toagw

 

 

4.2.2 宜信

https://www.creditease.cn/a/user/loadRegisterUserPage

 

4.2.3 大地保险

http://www.95590.cn/ebiz/loginSkin.jsp?loginBackUrl=http://www.95590.cn/

 

5 图像识别

下面是字符验证码两种比较极端的表现形式:

   

简单类型的特色:

  1. 背景和前景能够很容易彻底分离
  2. 字符的取值范围仅为[0,9]这样的最小有限域
  3. 生成图片的字符为单一字体
  4. 多位字符串能够经过简单算法进行完美切割

复杂类型的特色:

  1. 背景有随机干扰点或者干扰线条
  2. 字符范围为全部数字,字母,甚至汉字集
  3. 生成的图片的字体多样化
  4. 多位字符在图片上的位置出现重合,没法完美切割

在上一部份内容中举的如今线上应用的例子,基本上属于比较复杂的类型,可是因为它的设计理念仍然停留在图像学上,因此对于如今的CNN来讲,是彻底没有技术上的问题,毕竟不少深度学习框架的入门教程就是对手写数字数据库MNIST进行识别。它们有的区别只是前期准备工做的工做量的不一样,这里所说的前期准备工做就是指:带标记的数据的准备工做。所谓的“带标记的数据”是指,须要人预先告诉计算机什么样的图片对应着是什么样的字符串,由于本问题中所用的CNN方法是属于有监督学习的范围,须要有个场外的“老师”进行指导。

关于上面两种极端的字符验证码的识别的技术方法,请移步文章末尾连接。

里面有两个例子,并附上了完整的源码:

  1. 使用传统机器学习SVM对简单验证码识别
  2. 使用CNN对多位字符验证端到端的识别

固然后面的那种CNN的方法是对于解决此类问题是属于核武器级别的,CNN模式的优势缺点都很明显:

-       优势:通用性强,换一个模式后,能够不用修改代码就能够直接训练出新的模型。

-       缺点:须要大量的带标注的数据,特别是端到端的复杂一点的,可能须要几万带标记的先验数据集。

在CNN的文章中给出的demo,由于只是作效果演示,里面的数据集的生成是直接用的第三方标准库无限生成的。若是是在具体的场景去使用,则须要准备大量的带标记数据,像本文提到的困难的字符验证,若是要达到90%以上的正确识别率,估计须要5万带标记数据。下图是生成的部分先验数据集:

对于不一样的多字符验证码,根据其难易程度分类,能够有一些不一样的处理方式,有“蛮力型”的通用识别方法,也有“特事特办”的特别识别方法。

5.1 通用识别方法

所谓的通用识别方法就是:流程化做业,基本不太须要在编程上思考太多。

通用步骤以下:

  1. 下载必定数量的目标验证码图片。根据验证图片的复杂程度而定,有的须要几百张,有的须要几万张。
  2. 已经事先准备好一套标准的CNN图像分类的项目模板,须要事先作好的功课。
  3. 对项目模板进行简单的参数调整,以适配当前问题的图片尺寸。
  4. 将图像输入CNN,将输出的结果和先验标记的类型作偏差对比
  5. 不断迭代生成模型

这实际上是一个深度学习对分类问题处理的标准化流程。有不明白的地方,请补充一点相关的知识:

https://www.tensorflow.org/get_started/mnist/beginners

https://www.tensorflow.org/get_started/mnist/pros

由Google公司主推的深度学习框架tensorflow的入门文档里面就介绍了分别用矩阵回归和CNN神经网络对手写数字识别的方法。

固然,关于如何获取带标记的数据,目前也有比较便宜的获取渠道,直接在网上搜索“打码平台”,提供这“人工智能”领域的“人工”服务的厂家也很多,并且是明码标价:

对于字符型验证码,基本上是几分钱一张标记图吧。

5.2 特别识别方法

虽然上面的通用型方法能够百试不爽,可是每次来一个新的问题,你都要准备大量的带标记数据,这个未免也太繁琐了,并且像一些简单的字符验证码的问题,其实倒没有必要去大动干戈。那么这个时候就须要一些小的技巧了。

这里所说的特别识别方法,仍然是基于深度学习这种通用方法来作的,只是咱们能够将一些复杂问题进行适当的简化,这个思想有点相似于“降维”处理的意思。

由于深度学习具备这样的神奇效果:理论上对绝大多数的线性或者非线性问题都能实现很是好的拟合

可是对于越复杂的问题,对数据的需求量越大。这个现状是没法避免的,可是咱们却可以作一些人为的自动化工做,以达成此目标。

好比像这些验证:

  

无论它们色彩有多么的变化,无论背后加些啥乱七八糟的干扰点或者线,可是有一个事实他们没法回避,就是:他们的字符之间都是很是好分割的。也就是说,像这些类型的验证码,能够很容易将一个原本要断定N位字符串的问题简化为“断定1位字符,而后将N个这样的图片再组合起来”。这样网络的复杂度能够大大的简化,训练所须要的样数量,还有训练的时长都会大量减小

若是验证码图片能够从N维“降维”到1维了,这个字符的字体若是是单一的,好比下面这些验证:

 

那么问题就更简单了:只须要为每一个字符分类准备一张图片便可。也不是说若是你的验证码范围是[0,9],则只须要从下载的图片集中对0~9这几个数字每一个标记一张便可,而后就是使用一些普通的数据加强技术:贴图,绽开,上下自由截取,随机噪点等等,能够生成无限多的数据集了,固然这些所有是由程序自动化完成。

好的图像预处理也很重要,所谓好的图像预处理,就是指可以将图像里面的主体特征变得更加明显,例如:

好的图像预处理会使识别问题难度直线降低,好比上面左图若是用CNN估计可能要1万样本,而右边的那个通过预处理后,估计只须要1千样本就OK了。

 

关于如何作数据加强,在后续的文章中会进行具体介绍。

6 文末小结

若是对本话题有兴趣请持续关注本系列文章。

若是还想进一步讨论相应的技术,请加入QQ群:592109504

手机QQ扫描二维码https://mp.weixin.qq.com/s/7RCtZH0ljuF5Ti6jgQxyww

验证识别合辑技术文章:https://zhuanlan.zhihu.com/p/30871712

后续会有更多干货文章,敬请期待。。。 

 

 

个人博客即将搬运同步至腾讯云+社区,邀请你们一同入驻:https://cloud.tencent.com/developer/support-plan 

相关文章
相关标签/搜索