基于深度学习的验证码识别_第1页
基于深度学习的验证码识别_第2页
基于深度学习的验证码识别_第3页
基于深度学习的验证码识别_第4页
基于深度学习的验证码识别_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目 录前 言1第一章绪论21.1传统验证码识别方式21.2深度学习验证码识别概述31.3本文的组织结构4第二章卷积神经网络52.1局部感受野52.2权值共享52.3卷积52.4池化62.4归一化62.5本章小结7第三章训练深度学习网络识别验证码83.1训练数据准备83.2Keras框架93.3卷积神经网络设计及实现93.4模型训练133.5 本章小结15第四章 测试分析164.1 准确率164.2 识别速度184.3 大类与小类字符集对比实验184.4 对于字符型验证码的建议194.5本章小结19第五章网络训练速度优化205.1多进程技术205.2GPU计算技术215.3本章小结23第六章 总

2、结与展望246.1本文总结246.2后续工作展望24参考文献25致谢26摘 要近年来随着互联网技术的飞快发展,网络数据安全越来越被人们所重视,而为了防止恶意网络行为的重要保障,验证码技术的使用也越来越普及。与此同时,人工智能领域的发展也非常快速,深度学习技术在图像识别方面的表现非常优秀。因此,将深度学习应用于验证码识别上是不但是对验证码技术发展的推动力,也是提高计算机视觉领域技术进步的养分。文本对用于破解字符型验证码的深度学习型人工智能技术进行解析,旨在提升并且优化互联网环境的安全性,为行业内的安全策略提供借鉴,为互联网用户数据安全提供参考。识别验证码的传统方式非常依赖于图像预处理、特征提取以

3、及分类器训练三个步骤,不但工作量大且繁琐而且正确率也得不到有效的保障。利用深度学习中的卷积神经网络技术则不需要对验证码图形进行图形分割、预处理等人工干预操作,也能够有效排除图形颜色、形状、旋转角度以及噪音之类的干扰。本文提出了一种基于深度学习技术来识别验证码的方法,使用程序生成器无限制生成验证码图片样本作为训练及验证数据,导入卷积神经网络技术来避免预处理,以大量仿真验证码数据训练模型进行拟合,以达到提高验证码识别准确率的目的。实际验证结果表明,该模型对于广泛使用的字符型验证码具有很好的效果,在初步的训练后便能够达到95%以上的正确率,可以说是破解了该类验证码。关键词:深度学习;图像识别;验证码

4、AbstractIn recent years, with the rapid development of Internet technology, the security of network data has been paid more and more attention. In order to prevent the important guarantee of malicious network behavior, the use of verification code technology is becoming more and more popular. At the

5、 same time, the development of artificial intelligence is also very fast, and deep learning technology performs very well in image recognition. Therefore, the application of deep learning to verification code recognition is not only a driving force for the development of verification code technology

6、, but also a nutrient for improving technology progress in the field of computer vision. The text analyzes the depth learning artificial intelligence technology used to solve the character type verification code, and aims to improve and optimize the security of the Internet environment, provide refe

7、rence for the security strategy in the industry, and provide a reference for the data security of the Internet users.The traditional way of identifying verifying code relies on three steps of image preprocessing, feature extraction and classifier training, which not only has large workload and tedio

8、us, but also can not be effectively guaranteed. Using the technology of volume and neural network in depth learning, it does not need manual intervention, such as graphic segmentation and preprocessing of the code graphics, and can also effectively eliminate the interference of color, shape, rotatio

9、n angle and noise. In this paper, a method of identifying verification code based on depth learning technology is proposed. The program generator is used to generate verifying code image samples as training and verification data, and the convolution neural network technology is introduced to avoid p

10、reprocessing. A large number of simulation verification code data training models are fitted to improve the verification code recognition. Do not have the purpose of accuracy. The actual verification results show that the model has a good effect on the widely used character type verification code, a

11、nd it can reach more than 95% correct rate after the initial training, which can be said to be the solution of the class verification code.Keywords: deep learning; image recognition; capcha.26前 言验证码(CAPTCHA)是区分操作用户是计算机程序还是人类的最常用的一种程序算法,全称是“用于区分计算机和人类的全自动图灵测试”(Completely Automated Public Turing test

12、to tell Computers and Humans Apart),即由程序生成一个简单的问题。验证码识别措施对于人类来说十分简单且基本不需要学习就能够掌握,正确率基本可以保持在90%以上。但对于计算机程序来说非常难以解答。当程序生成问题时,能够回答出正确答案的即被判断为人类,可以继续正常操作,但如果不能给出正确答案,则会被系统判断为是机器,拒绝进一步的操作。随着互联网技术的快速发展,人们也越来越关注网络安全,验证码技术也随之产生,并扮演着越来越重要的角色。验证码诞生的初衷是为了保护各大互联网公司的数据安全,它们直观、廉价、快速地保护这各大网站免于不法分子的恶意骚扰,防止服务器过载与数据泄

13、漏。若是没有验证码的存在,恶意登陆、恶意信息传播、恶意数据库入侵等网络恶意行为将大为泛滥。目前的CAPTCHA程序也已经经过了不断的演化,主要在以下几方面发挥作用:(1) 新用户注册;(2) 用户登录;(3) 用户操作(修改密码、信息修改等);(4) 交易行为。验证码是互联网账号的第一道也是极为重要的安全保障,与新用户注册、登录、操作及交易支付等核心环节直接关联。如果没有验证码的保护,或者验证码遭到了破解,网站的数据及用户信息安全将遭到极大的泄露威胁。由此可以发现,验证码识别技术的研究有益与验证如今各类验证码的安全性,可以帮助设计出更加安全可靠的验证码形式。此外,验证码识别也是结合了图像处理、

14、模式识别、人工智能等多个领域知识的研究,也能够同时促进各个领域的技术研究。鉴于验证码技术在网络中的广泛应用,验证码识别技术也随之发展。在计算机视觉的领域,传统的识别验证码技术主要包括预处理、分割、特征提取、字符识别等步骤。这各个步骤互相之间紧密关联,却又是独立进行的步骤,任何一个步骤出现了问题都会对识别的整体结果造成明显的影响。如今,深度学习技术也在各类科学研究中广泛运用,在语音识别、文本处理等方面都获得了卓越的表现,本文将探讨深度学习在字符型验证码识别方面的应用及表现。第一章绪论本章首先介绍了验证码识别技术的研究背景和主要技术,其次简单介绍了深度学习图形识别的各个特点及其作用,在本章的最后介

15、绍了论文的组织结构。1.1传统验证码识别方式对字符型验证码的识别,可以归为OCR 应用中的一种。通过OCR 技术将验证码图片里的字符图片转换成文字,从而达到计算机自动识别验证码的目的。通用的OCR 技术一般要经过文字检测与文字识别两个步骤。由于图片的来源不一,图片的大小以及文字出现的位置并不固定,需要文字检测技术来检测图片中包含文字的区域并提取出来,而后再通过文字识别技术对该文字区域进行识别并输出文字。不同于一般的OCR 问题,字符型验证码本身就是机器产生,每种验证码都是基于一定的规则的验证码生成程序来生成。由于验证码的原始图片大小固定,字符出现的位置也相对固定,使得可以跳过文字检测环节直接对

16、整张图片作为文字区域来识别验证码内容。字符型验证码的传统识别方式所使用的OCR识别流程主要有以下三步:(1)预处理:图像灰度化、二值化、图像去噪、滤除干扰等。而不同的验证码干扰方式各异,每种风格都需要用非常精细的手法来滤除干扰图形。(2)字符分割:将图片上连续的字符切分成多个单个字符。而字符之间粘连的方式各异,传统基于图像集合规则的手法很难真正保证正确切割,容易出现漏子或错误切割的情况。(3)字符识别:即使成功获得单个字符的最佳矩形框,字符各种扭曲变形、不同字体以及任意角度的旋转,均会使传统的基于Hog(方向梯度直方图)、Sift(尺度不变特征变换) 等手动设计的特征提取和描述手法很难取得较高

17、的识别率。传统方式的问题主要有四项:1. 切割方法没有办法解决字符粘连的问题,简单切割之后可能会破坏字符的结构。2. 使用特征提取方法获取的特征描述子可能不与任务相关。3. 分类器训练非常依赖参数选择。4. 识别过程中的各个模块相互独立,一旦某个模块中出现错误,将会导致最终的识别率大大降低。1.2深度学习验证码识别概述传统的验证码识别方法对于图像预处理、特征提取等过程非常依赖,对于识别分类器模型构建的关注度有所不足。对于不同类型的验证码不但需要设计不同的分类器,更需要花费大量时间设计对应的预处理、切割字符以及特征提取过程,工作量大且泛用性不佳。使用基于深度学习的方法来识别字符型验证码的长处在于

18、简便性与泛化性较高。在定义了一个适合的网络模型之后,使用充足数量的具有标签的样本数据进行训练,就能够获得较高正确率的识别结果。验证码的颜色、形状、字体、噪音及干扰对于人工神经网络都不会造成明显的影响,模型也不需要因为各类验证码之间的模式区别而进行调整。对于不同手段获取的具有不同风格的验证码,只需提供足够数目的训练样本,依旧可以获得较高的识别正确率。深度学习识别技术也有对应的挑战与局限性:1. 模型训练会消耗非常大量的计算资源,模型的正确性验证不仅复杂而且麻烦。同事训练需要较高的硬件配置,普通的家用计算机难以负载,若是强行训练也会耗费非常多的时间。越来越多的参数不仅需要更大的数据集来训练,同时需

19、要更强的计算能力,否则神经网络的训练时间将是不可忍受的。2. 模型具有黑箱性质,它的内部知识的表示很不直观,用无数非线性计算的神经元组成的网络虽然可以让人明白其中的原理,却不能让人理解对应的现实意义。如何将这些目前还无法解读的知识转化为能够被人所理解的信息,也是一个具有发展潜力的研究方向。3. 神经网络训练的结果是网络中神经元之间的连接权重被不断地调整,不断减小网络预测的输出数值与实际数值之间的误差直至达到其最小值。在调整过程神经元内的计算会持续进行,直到权重收敛为止。随着神经网络的不断训练,训练误差不断减小,在未知数据上的测试误差也会随之不断地减小。但如果当训练误差减到某个值或是超过某个值之

20、后,网络的预测误差会反而增大,从而出现所谓的过拟合现象。4. 深度学习是一种具有监督的机器学习学习方法。深度学习使用有监督的方法从训练数据不断拟合计算,得到对应数据分类模型后,将该分类模型应用到对测试数据或是目标数据的分类中去。如果训练数据过少或种类单一,分类模型的质量也不会令人满意。分类模型在实际运用中的表现好坏非常依赖训练数据集的数量和质量。想让分类模型具有优秀表现的最简便也是最直接的方法便是提供大量高质量的训练数据。1.3本文的组织结构本文结构共分为五章,各章内容安排如下:第一章:绪论。本章介绍了课题的研究背景及意义、传统验证码识别方式和深度学习验证码识别方式的主要原理及优缺点,最后介绍

21、了本文的组织结构。第二章:卷积神经网络技术概述。本章详细阐述了卷积神经网络技术及其原理,分析了几项简化网络复杂性、降低参数数目的方法以及训练、学习中核心的步骤。第三章:训练深度学习网络识别验证码。主要介绍了训练数据的准备方式及其中的优缺点,程序设计主要采用的Keras框架及原因,训练网络的设计思路及其特点,训练模型的方式及可能遇到的问题。第四章:测试分析。根据验证码的使用特性提出了准确率去及识别时间两项对于识别技术是否有效的标准,对前文使用的网络模型进行了充足的测试,并且最终无论是从正确率还是速度的角度来说本模型都取了优秀的成绩。最后对本模型在不同复杂度的字符集情况下的表现进行了评估,同时提出

22、了几点用于改进字符型验证码的建议。第五章:网络训练速度优化。主要介绍了多进程技术,深入分析了Python环境下多线程与多进程技术的利弊以及取舍原因。之后介绍了GPU运算技术,介绍了GPU在深度学习方面优于CPU计算的原因以及CUDA运算平台。第六章:总结全文,提出未来工作的设想与展望。第二章卷积神经网络卷积神经网络(Convolutional Neural Network)是一种以传统神经网络为基础的建立起来的深度学习算法,以多个卷积层、末端的全联通层、权重层和池化层组成,这一结构保证了卷积神经网络能够充分地利用输入数据的二维结构。2.1局部感受野在卷积神经网络的应用中,过于庞大的参数数量往往

23、会导致训练效率的大大降低。目前一般有两种方法可以有效地降低卷积神经网络中参数数目。第一种方法即局部感受野。一般传统观念中一致认为人对与外部世界的认知是从局部再到全局的。而在图像中,空间联系也是局部的像素联系紧密,而距离较远的像素相关性则会较弱。因此,在保持信息流失不严重的前提下,每个神经元并没有必要对全局图像都进行感知,而只需要对局部图像进行感知即可,之后在更高层面将局部的信息综合起来就可以得到全局的信息。2.2权值共享经过了局部感知的操作后参数仍然过多则需要继续使用第二种方法,即权值共享。权值共享的理念是将N个参数看成是提取特征的方式,而该方式与位置无关。权值共享的主要理论基础是在绝大多数情

24、况下,同一图像一部分的统计特性与其他部分是一样的。这将意味着神经网络在这一部分图像上学习的特征也能用在另一部分上。因此对于同一图像上的所有位置,程序都能使用同样的学习特征,这将大大地提高训练的效率。通过局部感知和权值共享两种方法能够极大减少训练模型所需要的参数个数,从而加快迭代的效率。2.3卷积卷积是一种代替传统神经网络连接模式的全连接,主要作用为特征提取。卷积层内的每一个神经元都仅与之前一层的局部范围内的神经元相连接,构成一个内部网络,而这个结构成为卷积核。每个卷积层可以设定参数n来指定设立多少个卷积核。对于某个卷积核来说,都会有一个(k,d)大小的移动窗口从输入矩阵的第一个字符开始不断地在

25、图像上向后滑动,扫描所有图像上的位置,其中k指卷积核指定的窗口大小,而d则指向量长度。对于某时刻某个卷积核窗口,通过网络中神经元的非线性计算,将输入该窗口的原始数据转换为特征值。随着窗口不断地向后移动,该卷积核对应的特征值不断地通过计算产生,从而形成了这个卷积核的特征向量。理论上,拥有更多的卷积层可以将简单的初级特征通过迭代计算从而获取更为复杂的特征数值。将包含n个卷积核的图像n1×n2作为输入xi,卷积核c的大小为k×d,经过卷机操作后生成输出xj。计算公式如下。 (1)其中,为卷积运算符,bj为偏置项,f(·)为激活函数。2.4池化要将通过了不同的过滤器将图像

26、卷积之后得到的图像特征直接进行分类的话其中的计算量会非常庞大,因此可以利用池化操作以降低上层网络的计算复杂负,提高整个计算过程的鲁棒性,既可以保留原有的图像特征也可以在一定的程度上防止过度拟合情况的发生。本文主要采用的池化方法是最大值池化,即整个图片被分割成若干个同样大小、互不重叠的小块,在每个小块内只取最大的数字,再舍弃其他的数值节点后,保持原有的平面结构得出输出数值。最大池化的主要功能是向下取样,同时保持识别结果的完整。这意味着卷积后的特征图中有对于识别物体不必要的冗余信息,而池化可以筛去这些冗余信息。最大池化还有类似“抉择支”的功能。在有两个节点的情况下,当其中第一个节点在某些输入情况下

27、最大时,网络就只在这个节点上流通信息;而另外某些情况下的输入数值又会让第二个节点的值最大,那么网络就转而走第二个节点的分支。经过池化操作后,特征图像的通道数保持不变而像素变小,其计算公式如下。 (2)其中表示池化系数,表示偏置像,down(·)表示池化函数。但是最大池化操作同样有具有自己的缺陷。有些周边信息对某个概念是否存在的判定也有一定程度的影响,并且最大池化会对所有的特征图进行等价操作,不可避免地可能会将一些有效的特征数值遗漏。2.5归一化在卷积层的计算过程中会更新网络的参数,会引起后面层数输入数据分布方面的变化。对于卷积神经网络的训练是一个非常复杂的过程,如果在网络的前几层发生

28、了一些微小的改变,那么这些改变就会在后面几层被累积放大,产生滚雪球般的效应。一旦网络某一层的输入数据的分布发生改变,那么相关联的层就需要花费时间去适应这个新的数据分布。所以如果训练过程中,如果训练数据的分布一直发生变化,那么网络就要在每次迭代都去学习适应不同的分布,那么网络的训练速度将会明显地受到影响。一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低。因此在一般的操作中都会在每一层的输入时添加数据归一化的预处理措施,插入BN(Batch Normalization)层。BN层的加入能够提高该神经网络的泛化学习能力,从而减少对与网络中其他参数的调整需求,使得训练收敛速度加快。本文中

29、采用了ReLU激活函数,只需要一个阈值就可以得到激活值,不用去计算复杂的运算,因此没有添加归一化层。2.6本章小结本章介绍了本文所采用了深度学习中的卷积神经网络技术,包括用于减少参数复杂度的局部感知、权值共享等技术,以及提取特征所采用的卷积技术、压缩特征采用的最大池化技术,在章节的最后介绍了用于增强文章鲁棒性及泛化性的归一化操作。在着手构筑神经网络之前,了解关键的计算操作以及各层所发挥的作用是非常必要的。只有熟悉了用于组成网络的各个组件,才能够将其安置到合适的位置,使其发挥应有的作用,使神经网络顺利地运行,达到设定的目标。第三章训练深度学习网络识别验证码本章主要介绍了程序实现深度学习识别验证码

30、的步骤以及其中所选择操作的优缺点,包括训练数据的获取来源以及选择的原因,神经网络的设计及其优点,模型的训练及可能出现的问题以及最后的模型验证。本文所使用的计算机主要配置如下:CPU:Intel 酷睿i7 7700HQ;内存:8GB;显卡:NVIDIA GeForce GTX 10603.1训练数据准备常见的字符型验证码一般是由英文字符及数字随机组合而成,同时添加对字符进行随机的旋转角度处理并且添加具有干扰作用的噪点。干扰图形往往会与真实的验证码字符混淆在一起,让人难以分辨本来的字符形状或者是将其误以为是别的字符。本文采用的方法是使用以Python编写的能够生成验证码的captcha库,该生成器

31、能够满足以上提到的所有关于字符型验证码的特点,能够生成具有识别难度的验证码图形。在生成图形的过程中会对字符进行不同程度的拉伸、旋转、扭曲、加入噪点及重叠等操作。同时采用生成器生成训练数据还有两项优点,一是成本大大降低,不但不需要去各种网站收集大量的验证码数据,更不需要投入大量人力对其进行标记;二是训练数据的数目没有任何限制,从理论上能够生成无限的验证码样本。本文所使用的验证码字符集仅包括了数字0-9,英文字母A-Z,共36种不同字符。若需要拓展验证码适用范围,可以仅仅变动所使用的字符库或是更换生成器即可。本文采用的验证码生成器所生成的验证码图形如下图所示。图1 验证码样本本文所采用的生成的验证

32、码图片宽度为170,高度为80,数据格式即为(170,80,3),最后的3代表RGB三种色彩维度值。所对应的标签数据格式即长度为36的一维数组,每个数组空间代表是否包含该位置所对应的字符。人工神经网络的输出结果为每个字符所对应的概率,识别器会自动读取其中具有最大概率的字符作为预测结果输出。验证码标签的数据结构如下图所示。图2 验证码标签数据格式上图所表示的验证码原文为“IWCH”。若需要节省储存空间也可以使用4位数字即可以表示4位验证码,但由于其数字大小之间的关系对于图形来说毫无意义,因此使用0/1表示对于计算来说更为高效且不易混淆。3.2Keras框架本文基于Keras框架搭建字符串验证码识

33、别的程序结构。Keras是一个高层的神经网络API,由纯Python编写而成,以Tensorflow、Theano以及CNTK作为后端代码库。Keras 为支持快速实验而生,能够把想法迅速转换为结果。采用Keras结构有以下主要优点:·简易快速的原型设计;·支持CNN和RNN,或二者的结合;·随时CPU和GPU切换。3.3卷积神经网络设计及实现在处理图像时卷积神经网络对于图像的移动、缩放和扭曲都有较强的抵抗力,因此使用卷积神经网络来提取字符型验证码中的特征以及对其进行预测识别时会具有明显的优势。本文基于VGG16的网络结构进行修改设计。将验证码图形数据从输入层输入

34、后,使用四次卷积层与池化层的连接组合来提取图形中的特征值,通过最大池化层的向下采样功能降低网络中计算的复杂度。之后添加Flatten层来将输入的数值一维化,实现从卷积层到全连接层的过渡。在Flatten层后连接dropout层。最后连接4个全连接层分类器。本文使用的时Relu非线性激活函数,以此来保证图像特征不随位移而发生变化,提高模型的抗干扰能力。VGG16结构思想可以由下图表示。图3 VGG16结构文本卷积神经网络中每层的参数情况及输出结构如下:(1) 输入层:输入图像为生成器生成的验证码图形,图像形状为(80,170,3),前两位代表图形的长宽,最后的3表示为图形的RGB颜色数值。(2)

35、 卷积层1:对输入图像使用32个卷积核进行计算,窗口尺寸为3×3,步长为1,得到32个形状为78×168的特征图,使用“0”填充其中的边界。每个卷积核拥有3×3个参数,并且每个卷积核对应一个偏差项,则32个核心需要学习的参数个数为320个。(3) 卷积层2:与卷积层1具有相同的卷积核数目、窗口尺寸和步长,输出的特征图形状值为(76,166)。(4) 池化层1:对卷积层的2输出值进行最大池化运算,池化层的核心尺寸为2×2,核心步长也为2。池化后得到32张尺寸为38×83的特征图。每个池化层需要训练的参数为权重系数与偏差项,因此总参数数目为64个。

36、(5) .卷积层3:对输入图像使用64个卷积核进行计算,窗口尺寸与步长与卷积层1相同,边界使用“0”填充,输出64张形状为(36,81)的特征图。总参数个数为(3×3×32+1)×64,共18496项。(6) 卷积层4:与卷积层3具有相同的卷积核数目、窗口尺寸和步长,输出的特征图形状值为(34,79)。(7) 池化层2:对卷积层4的输出值进行最大池化运算,池化层的核心尺寸为2×2,核心步长也为2。池化后得到64张尺寸为17×39的特征图, 2×64个训练参数。(8) 卷积层5:对输入图像使用128个卷积核进行计算,窗口尺寸与步长与卷积

37、层1相同,边界使用“0”填充,输出128张形状为(15,37)的特征图。总参数个数为(3×3×64+1)×128。(9) 卷积层6:与卷积层5具有相同的卷积核数目、窗口尺寸和步长,输出的特征图形状值为(13,35)。(10) 池化层3:对卷积层6的输出值进行最大池化运算,池化层的核心尺寸为2×2,核心步长也为2。池化后得到128张尺寸为6×17的特征图, 2×128个训练参数。(11) 卷积层7:对输入图像使用256个卷积核进行计算,窗口尺寸与步长与卷积层1相同,边界使用“0”填充,输出256张形状为(4,15)的特征图。总参数个数为

38、(3×3×128+1)×256。(12) 卷积层8:与卷积层7具有相同的卷积核数目、窗口尺寸和步长,输出的特征图形状值为(2,13)。(13) 池化层4:对卷积层8的输出值进行最大池化运算,池化层的核心尺寸为2×2,核心步长也为2。池化后得到256张尺寸为1×6的特征图, 2×256个训练参数。到此处卷积层的数量已经达到了极限。(14) Flatten层:将池化层4输出的数值压平,连接卷积层与全连接层。(15) Dropout层:将在训练过程中每次更新参数时按一定概率随机断开输入神经元,用于防止过拟合。本文中该概率取为0.25。(16

39、) 全连接层:激活函数使用softmax。将从上层收到的所有特征进行分类,分类结果为36,对应字符A Z及0 9。以上各层的相关参数如下表所示。命名类别窗口大小/步长输出形状卷积层1Convolution3×3/1(78,168,32)卷积层2Convolution3×3/1(76,166,32)池化层1Max pooling2×2/2(38,83,32)卷积层3Convolution3×3/1(36,81,64)卷积层4Convolution3×3/1(34,79,64)池化层2Max pooling2×2/2(17,39,64)卷

40、积层5Convolution3×3/1(15,37,128)卷积层6Convolution3×3/1(13,35,128)池化层3Max pooling2×2/2(6,17,128)卷积层7Convolution3×3/1(4,15,256)卷积层8Convolution3×3/1(2,13,256)池化层4Max pooling2×2/2(1,6,256)Flatten层Flateen-(1536)Dropout层Dropout-(1536)Dense层Fully connection-(36)表1 卷积神经网络参数表可视化后的卷积

41、神经网络结构如下图所示。图4 神经网络结构图3.4模型训练训练模型时使用Keras中的 fit_generator 函数进行训练。Keras主要使用的是由谷歌开发的开源深度学习框架Tensorflow。其中的优化模型使用的是Adadelta算法,损失函数使用交叉熵crossentropy计算。为了防止过拟合现象,设置了网络会以0.25的概率断开。由于使用的是能够自动生成带有标签的数据生成器,训练集和验证集使用了同样的生成器。数据是通过生成器随机生成的,所以也不用考虑数据是否会重复,也不需要使用交叉验证等方法。这一项步骤所需时间与计算资源均非常庞大,在家用计算机上运行或许会消耗半天事件也不能明显

42、的进展。为提高CPU使用效率,生成器每次调用生成32张验证码图片。本文实际测试中使用了大约25万个字符型验证码,分为5组样本进行训练,以想等数目的验证数据。本文中最终使用的模型训练情况如下图所示。图5 模型训练过程及结果如图所示,在第一组训练过程中,正确率直到结束始终保持在4%左右,即近似于随机猜测的正确率水准。但当进行到第二组训练时,正确率便迅速飙升,在结束时已经达到了93%。本文用于示例仅使用了5组训练数据,最终达到了95%左右的正确率。若希望能够继续提升正确率,只需要更改训练数据组数继续训练即可。具体的训练准确率变化曲线如下图所示。图6 模型训练过程准确率波动3.5 本章小结本章详细说明

43、了从数据准备、网络构筑到模型训练的整个过程。在准备数据集的方面,本文使用了基于Python的captcha库的验证码生成器来源源不断地生成验证码训练数据集。值得一提的是本文并没有采用字符分割的方式,而是依托卷积神经网络的优势,直接将整个验证码图片作为单一任务进行识别,减少了预处理的麻烦。神经网络主要基于VGG16结构进行修改,成功将输入矩阵压缩到了一维,达到了卷积层数量的极限。最后本文使用构筑好的神经网络通过前文所描述的生成器生成的验证码图片进行训练,使用验证过程图片以及准确率变化曲线描述了训练过程中模型的变化趋势。训练完成后的识别过程与训练类似,即使用训练时添加了权重的网络模型对字符图片进行

44、识别。第四章 测试分析衡量验证码识别方法是否有效的准则有两个,正确率与所需时间。正确率即只有所有字符全都正确的识别结果才时有效的,研究表明一个好的验证码,对于用户来说应该能达到90%的正确率,而对于计算机程序来说则不超过1%。因此,如果识别验证码程序的正确率能够达到1%,即认为该程序能够识别该验证码。识别时间即识别一张验证码图片内容所需要花费的平均时间,这个时间应该在人类用户识别一个验证码所花的时间范围内。如果这个时间太长,在一种情况下网页可能会自动刷新,验证码图片也随之改变,即使程序已经识别出之前验证码的正确结果会毫无意义;第二种情况则是网站后台根据花费的事件来判断用户是人类还是程序。研究表

45、明,人类识别一个验证码字符的时间为1.9秒,对于四个字符的验证码来说则为7.6秒。因此,本文衡量模型表现的标准为以下两项:1. 识别文本验证码的准确率高于1%;2. 识别四位字符的文本验证码所需时间在7.6秒之内。4.1 准确率模型训练中的正确率体现的是单个字符的识别准确性,但是对于验证码使用来说单个字符的正确率是没有意义的,只有完全正确才能够说明识别的正确性。本文采用的验证方法即使用训练好的模型对200组样本进行预测,即大约6万条验证码,每个验证码中只要有一个字符错误即算作全部错误,所获得的正确率为95.6%,基本上可以说是已经完全破解了该类字符型验证码。此外,一些对于人类来说也非常难以分辨

46、的验证码,例如“0”和“O”混合的验证码,该模型也能够正确地识别。图7 验证码识别案例在进一步增大训练数据数量的情况下,准确率也可以获得进一步的提高。最常见的例如“0”、“O”、“D”三个字符区分不清的情况也能够通过增大数据量的方式解决。迭代次数识别率25万96.33%30万98.64%35万99.03%表2 不同迭代次数下识别率的变化情况由上表可见,当训练数据集到达35万之后,正确率已经达到了99%以上,进一步提高的意义已经不明显。由于本文使用程序生成器源源不断地生成训练用验证码图形,带标签的训练数据的数量不会成为训练的限制因素。同时,本文也使用了从网页中生成的验证码图片使用训练好的模型进行

47、验证。网页生成的字符验证码形式如下。图8 非生成器验证码识别案例选取了500张网页生成的验证码图片调整为与模型相同的输入格式,使用之前已经训练完成的网络模型对图片进行识别,并且与生成器生成的验证码图片的识别结果进行比对,结果如下表。验证码种类验证次数正确次数准确率生成器验证码50048396.6%网页验证码50046693.2%表3 不同来源验证码识别率可见,在相同实验次数的情况下,使用生成器生成的验证码的识别率要高于来自网页的验证码识别率,可见使用模型对于图片种类还是具有一定的针对性。若需要提高针对其他来源的验证码识别率,仅需要更换训练数据来源即可。若没有大量训练数据可用,在识别度能够接受的

48、情况下,也能暂时先使用本模型。4.2 识别速度本文使用了20组(640个)验证码数据来对程序识别速度进行测试,花费时间在60秒左右,可见平均程序每秒大约能识别100个验证码,每个验证码识别所需时间大约为0.1秒,满足要求的7.6秒之内。下图为程序识别时的进程表示。图9 验证码识别测试进度图根据上文的有效性标准,本文的目标是正确识别率大于1%且时间在7.2秒之内。根据这两个标准,本文的识别结果已经达到了目标。从结果上看,本文使用卷积神经网络来识别字符型验证码的方法时有效的,能够有效的破解主流网站所使用的文本验证码。4.3 大类与小类字符集对比实验上文中实验内容仅采用了36种字符即10种阿拉伯数字

49、及26种英文大写数字组合而成的4位验证码,因为在绝大多数应用中字符型验证码不区分大小写输入。本节以评估检验为目的,新增为纯数字、数字及大写字母、数字及大小写字母三种字符组合对于模型进行测试。每类字符集均使用相同数量的训练数据(25万条验证码)进行训练。识别准确率情况如下表所示。字符集训练时间/秒单字识别率/%整体准确率/%识别用时/秒数字66997.7399.680.092数字及大写字母67596.7295.620.108数字及大小写字母66992.0380.150.096表4 不同字符集识别表现由上表可见,在迭代次数相同的情况下,字符集种类越多识别率随之下降。而随着单字准确率的下降,整体准确

50、率下降的幅度更大。对于第三种字符集,即数字混合大小写字母,在第二轮训练时单字准确率达到了94%,整体准确率达到了88%,可见随着训练数据的进一步投入,正确率依旧能够向上提升。上表中三者的训练时间与识别时间的变化不明显,可以认为是硬件环境导致,而不是因为字符集输入的区别。4.4 对于字符型验证码的建议虽然互联网上已经推出了如图片验证码、计算题验证码等新型基于图片的验证码,但仍旧没有脱离图像识别的领域。此外也有短信验证码、滑块小游戏验证码等脱离图像识别领域的新形式验证码,但由于成本关系,目前使用最广的仍然是基于图片形式的字符型验证码。本文针对以上破解的字符型验证码,提出以下几点改进方法:1. 增大

51、粘连程度:许多识别验证码的方法中都会添加分割字符这一步骤,而分离字符会使得分割这一步骤减少了来自周围的噪声。而如果字符粘连在一起甚至相互重叠,其中的特征会变得非常难以提取。2. 采用变长验证码:预测字符个数时,每类数据集拥有的图片个数就更小,一定程度上会影响网络的识别。同时变化长度的验证码对于字符分割来说更加难以处理。3. 字符字体多样化:采用多种字体的字符能够产生超过扭曲、拉伸等操作带来的特征变化,从拓扑性上发生改变,如空心、实心等,能够对识别增加难度。4.5 本章小结本章提出了判断程序识别方法是否有效的两条标准,即准确率与识别所需时间,并对上文训练的模型进行了分析及评估。无论从准确率还是速

52、度来看,卷积神经网络的方法对于识别字符型验证码来说都非常有效。最后,鉴于字符型验证码的安全受到了巨大威胁,本章针对字符型验证码的特征及识别技术技术的发展对该类型验证码的安全性造成的影响提出了几个方向来提高其安全性。第五章网络训练速度优化由于使用CPU进行深度学习运算耗费的时间成本非常高昂,不利于对模型的评价与改进。若不能及时确定模型的正确性,进一步的优化与改进的效率将会非常的低下。本章中提出了本文采用的两种运算优化方式。5.1多进程技术在加速程序运行时多线程或是多进程是经常被使用且证明行之有效的方法。本文主要采用了多进程技术而非多线程技术。在Python中使用多线程计算的情况下下,每个线程的执

53、行都需要经过获取GIL(全局解释器锁)、运行代码直到运行结束、释放GIL三步。由此可见,若某个线程想要执行,就必须先拿到GIL。但是在一个python进程中,GIL只有一个。因此没有通行证的线程,将不被操作系统允许进入CPU执行。然而在每次释放GIL锁时,线程需要进行锁竞争、切换线程等操作,会消耗CPU的计算资源。并且由于GIL的存在以及GIL的数量限制,使用Python时一个进程永远只能同时执行一个线程。即使使用了多线程也不会让计算速度明显加快,只是会让几个线程同步进行罢了。因此使用在多核CPU时,Python的多线程效率并不高,对于程序的加速现象并不明显。本文程序的运行平台是Python,

54、而在该环境下想要充分利用多核CPU就需要采用多进程技术而非简单的多线程技术,才能实现每个进程有各自独立的GIL,互不干扰,不无谓地消耗计算资源,实现真正意义上的并行执行。 使用Python多进程技术运行程序时情况如下图所示。图10 多进程运行显示实际操作验证中,多进程技术可以时程序速率提升大约30%。下图为采用多线程技术前后的训练速度对比图。图11 多进程加速对照图5.2GPU计算技术在机器学习算法的训练和计算中往往会涉及非常大量的参数。对于这些参数的运算需要消耗大量的计算能力,而CPU计算在这方面的表现不能令人满意。目前在深度学习领域,使用GPU进行计算已经成为主流趋势。GPU的主要优势是其

55、强大的计算能力和内存带宽,均远大于同代的CPU。后者由专为顺序串行处理而优化的几个核心组成,其主要优势是其广泛的用途;而GPU则在图形处理、矩阵运算和浮点计算方面具有又是。GPU具有以数千计算核心组成的大规模并行计算架构,核心更小、更高效,专为同时处理多重任务而设计,远远超过CPU、可实现 10倍到100 倍的数据吞吐量。在使用GPU进行运算时,本文使用了NVIDIA公司推出的CUDA(Compute Unified Device Architecture)运算平台,整体分为4步:1. 从主机内存将需要处理的数据复制到GPU的内存;2. CPU发送数据处理命令给GPU;3. GPU执行并行数据

56、处理;4. 将结果从GPU内存拷贝到主机内存;CUDA提供了对于一般性通用需求的大规模并发编程模型,使用户可以对NVIDIA GPU方便的对于 GPU进行并发性编程。本文采用了tensorflow-GPU代码库,除了使用CUDA之外还需要使用cuDNN(CUDA Deep Neural Network)代码库。相比标准的CUDA,它在一些常用的神经网络操作上进行了性能的优化,比如卷积,池化,归一化,以及激活层等等。CUDA体系结构一般来说可以分为三个部分,开发库、GPU驱动以及运行环境。CUDA框架如下图所示。图12 CUDA框架示意图基于CUDA开发的程序在一般情况都会在两个区域内独立执行,分别是运行在CPU上的主机代码,以及运行在GPU上的设备代码。因为运行在不同区域的代码能够访问到相互独立的资源,所以其对应的运行组件也被称

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论