基于深度学习的验证码识别Word格式文档下载.docx
《基于深度学习的验证码识别Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《基于深度学习的验证码识别Word格式文档下载.docx(24页珍藏版)》请在冰豆网上搜索。
capcha.
前言
验证码(CAPTCHA)是区分操作用户是计算机程序还是人类的最常用的一种程序算法,全称是“用于区分计算机和人类的全自动图灵测试”(CompletelyAutomatedPublicTuringtesttotellComputersandHumansApart),即由程序生成一个简单的问题。
验证码识别措施对于人类来说十分简单且基本不需要学习就能够掌握,正确率基本可以保持在90%以上。
但对于计算机程序来说非常难以解答。
当程序生成问题时,能够回答出正确答案的即被判断为人类,可以继续正常操作,但如果不能给出正确答案,则会被系统判断为是机器,拒绝进一步的操作。
随着互联网技术的快速发展,人们也越来越关注网络安全,验证码技术也随之产生,并扮演着越来越重要的角色。
验证码诞生的初衷是为了保护各大互联网公司的数据安全,它们直观、廉价、快速地保护这各大网站免于不法分子的恶意骚扰,防止服务器过载与数据泄漏。
若是没有验证码的存在,恶意登陆、恶意信息传播、恶意数据库入侵等网络恶意行为将大为泛滥。
目前的CAPTCHA程序也已经经过了不断的演化,主要在以下几方面发挥作用:
(1)新用户注册;
(2)用户登录;
(3)用户操作(修改密码、信息修改等);
(4)交易行为。
验证码是互联网账号的第一道也是极为重要的安全保障,与新用户注册、登录、操作及交易支付等核心环节直接关联。
如果没有验证码的保护,或者验证码遭到了破解,网站的数据及用户信息安全将遭到极大的泄露威胁。
由此可以发现,验证码识别技术的研究有益与验证如今各类验证码的安全性,可以帮助设计出更加安全可靠的验证码形式。
此外,验证码识别也是结合了图像处理、模式识别、人工智能等多个领域知识的研究,也能够同时促进各个领域的技术研究。
鉴于验证码技术在网络中的广泛应用,验证码识别技术也随之发展。
在计算机视觉的领域,传统的识别验证码技术主要包括预处理、分割、特征提取、字符识别等步骤。
这各个步骤互相之间紧密关联,却又是独立进行的步骤,任何一个步骤出现了问题都会对识别的整体结果造成明显的影响。
如今,深度学习技术也在各类科学研究中广泛运用,在语音识别、文本处理等方面都获得了卓越的表现,本文将探讨深度学习在字符型验证码识别方面的应用及表现。
第一章绪论
本章首先介绍了验证码识别技术的研究背景和主要技术,其次简单介绍了深度学习图形识别的各个特点及其作用,在本章的最后介绍了论文的组织结构。
1.1传统验证码识别方式
对字符型验证码的识别,可以归为OCR应用中的一种。
通过OCR技术将验证码图片里的字符图片转换成文字,从而达到计算机自动识别验证码的目的。
通用的OCR技术一般要经过文字检测与文字识别两个步骤。
由于图片的来源不一,图片的大小以及文字出现的位置并不固定,需要文字检测技术来检测图片中包含文字的区域并提取出来,而后再通过文字识别技术对该文字区域进行识别并输出文字。
不同于一般的OCR问题,字符型验证码本身就是机器产生,每种验证码都是基于一定的规则的验证码生成程序来生成。
由于验证码的原始图片大小固定,字符出现的位置也相对固定,使得可以跳过文字检测环节直接对整张图片作为文字区域来识别验证码内容。
字符型验证码的传统识别方式所使用的OCR识别流程主要有以下三步:
(1)预处理:
图像灰度化、二值化、图像去噪、滤除干扰等。
而不同的验证码干扰方式各异,每种风格都需要用非常精细的手法来滤除干扰图形。
(2)字符分割:
将图片上连续的字符切分成多个单个字符。
而字符之间粘连的方式各异,传统基于图像集合规则的手法很难真正保证正确切割,容易出现漏子或错误切割的情况。
(3)字符识别:
即使成功获得单个字符的最佳矩形框,字符各种扭曲变形、不同字体以及任意角度的旋转,均会使传统的基于Hog(方向梯度直方图)、Sift(尺度不变特征变换)等手动设计的特征提取和描述手法很难取得较高的识别率。
传统方式的问题主要有四项:
1.切割方法没有办法解决字符粘连的问题,简单切割之后可能会破坏字符的结构。
2.使用特征提取方法获取的特征描述子可能不与任务相关。
3.分类器训练非常依赖参数选择。
4.识别过程中的各个模块相互独立,一旦某个模块中出现错误,将会导致最终的识别率大大降低。
1.2深度学习验证码识别概述
传统的验证码识别方法对于图像预处理、特征提取等过程非常依赖,对于识别分类器模型构建的关注度有所不足。
对于不同类型的验证码不但需要设计不同的分类器,更需要花费大量时间设计对应的预处理、切割字符以及特征提取过程,工作量大且泛用性不佳。
使用基于深度学习的方法来识别字符型验证码的长处在于简便性与泛化性较高。
在定义了一个适合的网络模型之后,使用充足数量的具有标签的样本数据进行训练,就能够获得较高正确率的识别结果。
验证码的颜色、形状、字体、噪音及干扰对于人工神经网络都不会造成明显的影响,模型也不需要因为各类验证码之间的模式区别而进行调整。
对于不同手段获取的具有不同风格的验证码,只需提供足够数目的训练样本,依旧可以获得较高的识别正确率。
深度学习识别技术也有对应的挑战与局限性:
1.模型训练会消耗非常大量的计算资源,模型的正确性验证不仅复杂而且麻烦。
同事训练需要较高的硬件配置,普通的家用计算机难以负载,若是强行训练也会耗费非常多的时间。
越来越多的参数不仅需要更大的数据集来训练,同时需要更强的计算能力,否则神经网络的训练时间将是不可忍受的。
2.模型具有黑箱性质,它的内部知识的表示很不直观,用无数非线性计算的神经元组成的网络虽然可以让人明白其中的原理,却不能让人理解对应的现实意义。
如何将这些目前还无法解读的知识转化为能够被人所理解的信息,也是一个具有发展潜力的研究方向。
3.神经网络训练的结果是网络中神经元之间的连接权重被不断地调整,不断减小网络预测的输出数值与实际数值之间的误差直至达到其最小值。
在调整过程神经元内的计算会持续进行,直到权重收敛为止。
随着神经网络的不断训练,训练误差不断减小,在未知数据上的测试误差也会随之不断地减小。
但如果当训练误差减到某个值或是超过某个值之后,网络的预测误差会反而增大,从而出现所谓的过拟合现象。
4.深度学习是一种具有监督的机器学习学习方法。
深度学习使用有监督的方法从训练数据不断拟合计算,得到对应数据分类模型后,将该分类模型应用到对测试数据或是目标数据的分类中去。
如果训练数据过少或种类单一,分类模型的质量也不会令人满意。
分类模型在实际运用中的表现好坏非常依赖训练数据集的数量和质量。
想让分类模型具有优秀表现的最简便也是最直接的方法便是提供大量高质量的训练数据。
1.3本文的组织结构
本文结构共分为五章,各章内容安排如下:
第一章:
绪论。
本章介绍了课题的研究背景及意义、传统验证码识别方式和深度学习验证码识别方式的主要原理及优缺点,最后介绍了本文的组织结构。
第二章:
卷积神经网络技术概述。
本章详细阐述了卷积神经网络技术及其原理,分析了几项简化网络复杂性、降低参数数目的方法以及训练、学习中核心的步骤。
第三章:
训练深度学习网络识别验证码。
主要介绍了训练数据的准备方式及其中的优缺点,程序设计主要采用的Keras框架及原因,训练网络的设计思路及其特点,训练模型的方式及可能遇到的问题。
第四章:
测试分析。
根据验证码的使用特性提出了准确率去及识别时间两项对于识别技术是否有效的标准,对前文使用的网络模型进行了充足的测试,并且最终无论是从正确率还是速度的角度来说本模型都取了优秀的成绩。
最后对本模型在不同复杂度的字符集情况下的表现进行了评估,同时提出了几点用于改进字符型验证码的建议。
第五章:
网络训练速度优化。
主要介绍了多进程技术,深入分析了Python环境下多线程与多进程技术的利弊以及取舍原因。
之后介绍了GPU运算技术,介绍了GPU在深度学习方面优于CPU计算的原因以及CUDA运算平台。
第六章:
总结全文,提出未来工作的设想与展望。
第二章卷积神经网络
卷积神经网络(ConvolutionalNeuralNetwork)是一种以传统神经网络为基础的建立起来的深度学习算法,以多个卷积层、末端的全联通层、权重层和池化层组成,这一结构保证了卷积神经网络能够充分地利用输入数据的二维结构。
2.1局部感受野
在卷积神经网络的应用中,过于庞大的参数数量往往会导致训练效率的大大降低。
目前一般有两种方法可以有效地降低卷积神经网络中参数数目。
第一种方法即局部感受野。
一般传统观念中一致认为人对与外部世界的认知是从局部再到全局的。
而在图像中,空间联系也是局部的像素联系紧密,而距离较远的像素相关性则会较弱。
因此,在保持信息流失不严重的前提下,每个神经元并没有必要对全局图像都进行感知,而只需要对局部图像进行感知即可,之后在更高层面将局部的信息综合起来就可以得到全局的信息。
2.2权值共享
经过了局部感知的操作后参数仍然过多则需要继续使用第二种方法,即权值共享。
权值共享的理念是将N个参数看成是提取特征的方式,而该方式与位置无关。
权值共享的主要理论基础是在绝大多数情况下,同一图像一部分的统计特性与其他部分是一样的。
这将意味着神经网络在这一部分图像上学习的特征也能用在另一部分上。
因此对于同一图像上的所有位置,程序都能使用同样的学习特征,这将大大地提高训练的效率。
通过局部感知和权值共享两种方法能够极大减少训练模型所需要的参数个数,从而加快迭代的效率。
2.3卷积
卷积是一种代替传统神经网络连接模式的全连接,主要作用为特征提取。
卷积层内的每一个神经元都仅与之前一层的局部范围内的神经元相连接,构成一个内部网络,而这个结构成为卷积核。
每个卷积层可以设定参数n来指定设立多少个卷积核。
对于某个卷积核来说,都会有一个(k,d)大小的移动窗口从输入矩阵的第一个字符开始不断地在图像上向后滑动,扫描所有图像上的位置,其中k指卷积核指定的窗口大小,而d则指向量长度。
对于某时刻某个卷积核窗口,通过网络中神经元的非线性计算,将输入该窗口的原始数据转换为特征值。
随着窗口不断地向后移动,该卷积核对应的特征值不断地通过计算产生,从而形成了这个卷积核的特征向量。
理论上,拥有更多的卷积层可以将简单的初级特征通过迭代计算从而获取更为复杂的特征数值。
将包含n个卷积核的图像n1×
n2作为输入xi,卷积核c的大小为k×
d,经过卷机操作后生成输出xj。
计算公式如下。
(1)
其中,
为卷积运算符,bj为偏置项,f(·
)为激活函数。
2.4池化
要将通过了不同的过滤器将图像卷积之后得到的图像特征直接进行分类的话其中的计算量会非常庞大,因此可以利用池化操作以降低上层网络的计算复杂负,提高整个计算过程的鲁棒性,既可以保留原有的图像特征也可以在一定的程度上防止过度拟合情况的发生。
本文主要采用的池化方法是最大值池化,即整个图片被分割成若干个同样大小、互不重叠的小块,在每个小块内只取最大的数字,再舍弃其他的数值节点后,保持原有的平面结构得出输出数值。
最大池化的主要功能是向下取样,同时保持识别结果的完整。
这意味着卷积后的特征图中有对于识别物体不必要的冗余信息,而池化可以筛去这些冗余信息。
最大池化还有类似“抉择支”的功能。
在有两个节点的情况下,当其中第一个节点在某些输入情况下最大时,网络就只在这个节点上流通信息;
而另外某些情况下的输入数值又会让第二个节点的值最大,那么网络就转而走第二个节点的分支。
经过池化操作后,特征图像的通道数保持不变而像素变小,其计算公式如下。
(2)
其中
表示池化系数,
表示偏置像,down(·
)表示池化函数。
但是最大池化操作同样有具有自己的缺陷。
有些周边信息对某个概念是否存在的判定也有一定程度的影响,并且最大池化会对所有的特征图进行等价操作,不可避免地可能会将一些有效的特征数值遗漏。
2.5归一化
在卷积层的计算过程中会更新网络的参数,会引起后面层数输入数据分布方面的变化。
对于卷积神经网络的训练是一个非常复杂的过程,如果在网络的前几层发生了一些微小的改变,那么这些改变就会在后面几层被累积放大,产生滚雪球般的效应。
一旦网络某一层的输入数据的分布发生改变,那么相关联的层就需要花费时间去适应这个新的数据分布。
所以如果训练过程中,如果训练数据的分布一直发生变化,那么网络就要在每次迭代都去学习适应不同的分布,那么网络的训练速度将会明显地受到影响。
一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低。
因此在一般的操作中都会在每一层的输入时添加数据归一化的预处理措施,插入BN(BatchNormalization)层。
BN层的加入能够提高该神经网络的泛化学习能力,从而减少对与网络中其他参数的调整需求,使得训练收敛速度加快。
本文中采用了ReLU激活函数,只需要一个阈值就可以得到激活值,不用去计算复杂的运算,因此没有添加归一化层。
2.6本章小结
本章介绍了本文所采用了深度学习中的卷积神经网络技术,包括用于减少参数复杂度的局部感知、权值共享等技术,以及提取特征所采用的卷积技术、压缩特征采用的最大池化技术,在章节的最后介绍了用于增强文章鲁棒性及泛化性的归一化操作。
在着手构筑神经网络之前,了解关键的计算操作以及各层所发挥的作用是非常必要的。
只有熟悉了用于组成网络的各个组件,才能够将其安置到合适的位置,使其发挥应有的作用,使神经网络顺利地运行,达到设定的目标。
第三章训练深度学习网络识别验证码
本章主要介绍了程序实现深度学习识别验证码的步骤以及其中所选择操作的优缺点,包括训练数据的获取来源以及选择的原因,神经网络的设计及其优点,模型的训练及可能出现的问题以及最后的模型验证。
本文所使用的计算机主要配置如下:
CPU:
Intel酷睿i77700HQ;
内存:
8GB;
显卡:
NVIDIAGeForceGTX1060
3.1训练数据准备
常见的字符型验证码一般是由英文字符及数字随机组合而成,同时添加对字符进行随机的旋转角度处理并且添加具有干扰作用的噪点。
干扰图形往往会与真实的验证码字符混淆在一起,让人难以分辨本来的字符形状或者是将其误以为是别的字符。
本文采用的方法是使用以Python编写的能够生成验证码的captcha库,该生成器能够满足以上提到的所有关于字符型验证码的特点,能够生成具有识别难度的验证码图形。
在生成图形的过程中会对字符进行不同程度的拉伸、旋转、扭曲、加入噪点及重叠等操作。
同时采用生成器生成训练数据还有两项优点,一是成本大大降低,不但不需要去各种网站收集大量的验证码数据,更不需要投入大量人力对其进行标记;
二是训练数据的数目没有任何限制,从理论上能够生成无限的验证码样本。
本文所使用的验证码字符集仅包括了数字‘0’-‘9’,英文字母‘A’-‘Z’,共36种不同字符。
若需要拓展验证码适用范围,可以仅仅变动所使用的字符库或是更换生成器即可。
本文采用的验证码生成器所生成的验证码图形如下图所示。
图1验证码样本
本文所采用的生成的验证码图片宽度为170,高度为80,数据格式即为(170,80,3),最后的3代表RGB三种色彩维度值。
所对应的标签数据格式即长度为36的一维数组,每个数组空间代表是否包含该位置所对应的字符。
人工神经网络的输出结果为每个字符所对应的概率,识别器会自动读取其中具有最大概率的字符作为预测结果输出。
验证码标签的数据结构如下图所示。
图2验证码标签数据格式
上图所表示的验证码原文为“IWCH”。
若需要节省储存空间也可以使用4位数字即可以表示4位验证码,但由于其数字大小之间的关系对于图形来说毫无意义,因此使用0/1表示对于计算来说更为高效且不易混淆。
3.2Keras框架
本文基于Keras框架搭建字符串验证码识别的程序结构。
Keras是一个高层的神经网络API,由纯Python编写而成,以Tensorflow、Theano以及CNTK作为后端代码库。
Keras为支持快速实验而生,能够把想法迅速转换为结果。
采用Keras结构有以下主要优点:
·
简易快速的原型设计;
支持CNN和RNN,或二者的结合;
随时CPU和GPU切换。
3.3卷积神经网络设计及实现
在处理图像时卷积神经网络对于图像的移动、缩放和扭曲都有较强的抵抗力,因此使用卷积神经网络来提取字符型验证码中的特征以及对其进行预测识别时会具有明显的优势。
本文基于VGG16的网络结构进行修改设计。
将验证码图形数据从输入层输入后,使用四次卷积层与池化层的连接组合来提取图形中的特征值,通过最大池化层的向下采样功能降低网络中计算的复杂度。
之后添加Flatten层来将输入的数值一维化,实现从卷积层到全连接层的过渡。
在Flatten层后连接dropout层。
最后连接4个全连接层分类器。
本文使用的时Relu非线性激活函数,以此来保证图像特征不随位移而发生变化,提高模型的抗干扰能力。
VGG16结构思想可以由下图表示。
图3VGG16结构
文本卷