如何使用深度学习破解验证码 keras 连续验证码

在实现网络爬虫的过程当中,验证码的出现老是会阻碍爬虫的工做。本期介绍一种利用深度神经网络来实现的端到端的验证码识别方法。经过本方法,能够在不切割图片、不作模板匹配的状况下实现精度超过90%的识别结果。算法

本文分为两个部分,第一个部分介绍如何利用深度神经网络实现验证码的训练和识别,第二个部分介绍在实现过程当中须要克服的工程问题。网络

一. 基于深度神经网络的验证码识别机器学习

验证码的识别是从图片到文字的过程。传统的算法如OCR正是为了解决此类问题而设计的。然而,在真实情形中,验证码一般并不以规则的文字出现,即文字一般会有不一样程度的变形,图像自己也一般会被添加或多或少的噪声。这些干扰的出现,使得文字分割、模板匹配再也不有效,进而OCR算法也很难解析出结果。函数

近年来,深度神经网络(DNN)在图像识别领域已经被证实了强大的识别能力。单个文字的识别是典型的分类问题。一般的作法为训练一个深度神经网络,网络的最后一层分为N种类别,表明字符的数目。好比对于英文字母,最后一层的分类器即是26个。好比经典的LeNet(http://yann.lecun.com/exdb/lenet/)即为解决单个文字识别的网络:学习

然而验证码一般包含多个字符,如何利用现有的网络实现这类分类问题呢?实际上这个问题再机器学习中被称为多标签训练问题。和上述每一个图片输入只对应一个标签类别对比,这类分类的输出是多个标签。咱们一样能够对传统的神经网络稍做改变以适应这种状况。字体

咱们以最简单的英文字母为例介绍这个过程。如图一所示,此种验证码由5个字母组成;每一个字母只取大写,共有26种类别;图片中有干扰线贯穿文字,使得文字分割比较困难。优化

图一. 验证码实例编码

 

接下来,咱们设计如图二卷积神经网络:设计

图二. 卷积神经网络3d

图二中的网络和通常的CNN网络没有什么特殊之处,前部均是卷积、Pooling层,只有最后在分类时,将26个类别扩增到26*5=130个类别。对于每幅图片的标签而言,在这130维的向量中,每26个维度中有一个1,其他为0,编码了五个字母。接着依然使用交叉熵做为代价函数进而优化此网络。就这样,只要对原先的分类网络作简单的改变便可解决验证码的识别问题。

再如对于数学表达式类型的验证码,咱们的网络也只是在编码上把26分类问题变成了13分类问题。下例中(见图三)最后一层的分类器便设计为3*13=39个类别。

 

图三. 数学式类型验证码的识别

 

按照此种思路咱们破解了不少风格的验证码,如图四所示:

图四. 不一样风格验证码破解实例

 

二. 一些须要解决的实际工程问题

(1) 合成训练数据

前文提到训练的前提是已经拥有了大量的训练数据,而实际在识别验证码时咱们很难获取足够多的标注过的训练数据。因此,咱们不得不人工合成训练数据。这一部分一般能够调用Java或者C#的文字渲染库来完成。

训练的数据并非越多越好,主要的问题在于人工合成的数据未免和真实验证码在形态上有些差距,咱们都很难合成出如出一辙的结果。字体、字号及变形程度都或多或少与真实数据不一样,而这种不一样可能直接致使训练出的网络面对真实数据时没法发挥做用。

咱们的经验是,针对真实数据的特色,在没法很类似地合成出训练数据的状况下,要增大样本的多样性,实际上也是遵循了深度学习中数据加强(Data Augmentation)的思想。如图五所示,左边为真实数据,咱们在合成数据时特地增长了每一个文字的旋转、平移,加大了噪声,使得训练出的网络能应对数据足够的变化,从而能够识别出左图中真实的例子。不然即使在合成数据上达到了很高的精度,在真实数据上也依然可能精度极低(即在合成数据上过拟合)。

图五. 合成数据实例

 (2) 网络大小的选择

针对不一样的任务,网络大小对结果的影响也是巨大的。并不是全部的任务都得使用很深的网络来训练。理论上说,越深的网络自由度越大,同时也很是容易过拟合。虽然有weight_decay这样参数能够必定程度的对抗过拟合,但一般难度依然是很大的。因此通常来讲,对于不太复杂的验证码应该选择较小的网络,只有遇到比较复杂的验证码如中文的成语等,咱们的经验才是复杂的网络下效果才更好。

总之,验证码识别能够做为深度学习的一个练手项目来学习,在这个实际项目中能够更容易理解到深度学习理论中诸多概念。

转载于:http://www.saluzi.com/t/topic/16027

相关文章
相关标签/搜索