何福泉; 李伟烽; 林培娜; 李俊华 【期刊名称】《《甘肃科技纵横》》 【年(卷),期】2019(048)002 【总页数】5页(P1-4,22)
【关键词】验证码识别; 神经网络; 深度学习 【作 者】何福泉; 李伟烽; 林培娜; 李俊华
【作者单位】佛山科学技术学院 广东 佛山 528200 【正文语种】中 文 【中图分类】TP309 0 引言
验证码的出现为了区分人与机器的区别,验证码之所以被广泛的运用,是为了维护网络安全,但随着计算机图像识别技术的发展,简单的验证码已经难不倒计算机了。验证码在设计与识别看似是完全对立的两个方面,但其发展却是相辅相成的[1]。因为验证码的作用就是不那么容易让机器识别出来。研究图像识别,不仅仅能识别验证码,还能识别更多的文字,实现机器代替人阅读,促进社会发展。说到验证码,不得不提的就是爬虫了,随着大数据时代到来,爬虫的需求呈爆炸式增长,以新浪微博为代表的一系列社交应用蕴含着巨大的数据资源[2]。研究图像处理,合理的利用好爬虫自动识别验证码这一功能,可以方便人们更好的利用网络资源。验证码
识别与破解是同步发展的,再复杂的验证码也会被计算机破解的,其基本的技术就是本论述所讲述的。传统的验证码识别技术在于分割,而端对端的验证码识别技术在于卷积神经网络,卷积神经网络(Convolutional Neural Networks,CNN)的主要优势在于卷积层提取的图像特征,具有很强的表达能力,避免了传统识别技术存在的数据预处理、人工设计特征等问题[3]。所以用卷积神经网络来训练,其效果会比用传统的切割方法要好,卷积神经网络提取的特征如果足够好的话,其验证码识别准确率会远超过人,当然卷积神经网络的训练需要花费大量的计算来实现训练过程,下面讲述验证码识别的基本过程。 1 获取验证码图片
因为训练需要大量的验证码图形以及验证码标记,所以收到标记验证码需花费大量时间,在网页中爬取大量的验证码图片也会对网页造成攻击,所以可以改用程序生成验证码,python库中有一个captcha库可以自动生成验证码,生成验证码效果见图1所示。生成的效果比普通网页的验证码要难识别一点,如果生成的验证码过于简单就没有识别的价值了,由于训练方便,生成的验证码为0-9之间的数字。输入是图片矩阵,标签是10个数字,如果验证码是3的话,这10个数字为:0 0 0 1 0 0 0 0 0 0。 图1 验证码示例图 2 传统验证码识别方法 2.1 灰度化
通常一张图片的每个像素点由RGB(红绿蓝)三个通道组成,每个通道对应一个0~255的值,每个像素点有3个值分别对应这个像素点的RGB值。通常灰度化是求每个像素点的值进行加权平均得到一个灰度值。f=0.30R+0.59G+0.11B(公式来源于百度百科),其中f表示灰度值,R、G、B分别表示三个通道对应的值。运用这个加权平均的公式,使一副图片变成一个二维的矩阵,从而能够减少后续图
像的计算量,如果维度太大,后续计算会变得复杂化。 2.2 二值化
二值化就是把前面得到的灰度图片,设定一个阈值,将灰度图中每个点以这个阈值为分界,大于阈值的设为1,小于阈值的设为0,从而是图片呈现黑白的效果。二值化的图片上每个点的取值为0或1。如果阈值设置的不好,非但没有将图片验证码特征突显出来,反而让图片的识别增加了难度,而且阈值还要根据验证码具体图片而决定的,没有一个固定的值。 2.3 去噪
图像变为黑白之后,存在黑点的干扰,我们要把图片中的黑点去掉,去噪通常采用的方法是检测黑点的面积,如果面积大于一定值则认为它是验证码的一部分,面积小于一定值则认为它是噪点,从而把噪点去除。而这里面积少于多少的点才算是噪点呢,这还需要根据验证码具体图片而决定的。 2.4 分割
将图像分割成单个验证码的图像,也就是说如果图中有4位验证码,则需要把图片分割成4张同等大小的图片。假如图片中验证码出现黏连,还需考虑如何把黏连的验证码进行分割。还需要考虑验证码从哪里分割,分割的大小是多少。 2.5 训练
把每张图片拿去分类训练,训练方法可以采取支持向量机、K临近算法(KNN)、随机森林、xgboost等分类算法进行分类。侍啸[4]等人用此种方法训练,得出的模型准确率达到98.7%。传统的验证码识别方法,是要前期灰度化等工作处理的好,训练出来的模型的准确率还是很高的,但是在前期处理的问题上,还有很多未解决的问题,例如上面所说到的阈值等问题,都是要根据实际问题而定的,传统的验证码识别效率在笔者看来,还是比较困难的。 2.6 传统方法总结
传统的验证码识别方法思路明确,但阈值与分割图片是一门很深的学问,传统的验证码识别又避免不了二值化、去噪、分割等操作,而二值化、去噪、分割等算法并不适用与所有的验证码,当验证码类型一变,可能这些算法就不再适用了。所以本论述就没有对传统的验证码识别方法进行实验分析。
3 卷积神经网络(Convolutional Neural Networks,CNN)端对端的验证码识别方法
3.1 输入层(Input layer)
将图片读入,把图片的height(高度)的大小变为50,weight(宽度)的大小变为110,RGB三通道无需灰度化。转换图片的大小为了方便卷积层进行计算,转换后每张彩色图片对应就是三张50×110的RGB分离后的图片。 3.2 隐含层(Hidden layer)
卷积:简单的来讲,如果一个图像是50×110,用一个3×3的卷积核进行卷积就可以得到一个(50-3+1)×(110-3+1)的图像,得到的图像在计算机内更能突显图像的特征。
池化:简单来讲,缩小图像的大小。在卷积神经网络中最常用的池化算法有最大值池化、平均池化和随机池化算法等。很容易理解最大值池化算法就是对池化域中的特征值取最大值即可,而平均池化算法就是对池化域中的特征值取均值[5]。 将图片的特征提取出来。每一层都进行三次卷积、一次池化。隐含层有三层网络。 第一层网络把图片用32个3×3的卷积核,步长为1,进行第一次卷积后得到48×108×32的矩阵,第二次卷积再用相同数量的卷积核进行卷积得到46×106×32的矩阵,第三次卷积再用相同数量的卷积核进行卷积得到
44×104×32的矩阵,最后进行池化,将图片大小缩小一半,变为22×52×32的矩阵,再用relu作为激活函数。
第二层网络把图片用64个3×3的卷积核,步长为1,进行第一次卷积后得到
20×50×64的矩阵,第二次卷积再用相同数量的卷积核进行卷积得到18×48×64的矩阵,第三次卷积再用相同数量的卷积核进行卷积得到16×46×64的矩阵,最后进行池化,将图片大小缩小一半,变为8×23×64的矩阵,再用relu作为激活函数。
第三层网络把图片用128个3×3的卷积核,步长为1,进行第一次卷积后得到6×21×128的矩阵,第二次卷积再用相同数量的卷积核进行卷积得到4×19×128的矩阵,第三次卷积再用相同数量的卷积核进行卷积得到2×17×128的矩阵,最后进行池化,将图片大小缩小一半,变为1×8×128的矩阵,再用relu作为激活函数。
最后一个是全连接层把得到的1×8×128的矩阵拉直,变为一个一维长度为1 024的矩阵,为了防止过拟合,以0.25的概率随机去掉一些数据,再用softmax作为激活函数,更好的区分有用的特征,得到的这1 024的个数就作为输出层的输入。 3.3 输出层(Output layer)
把上面得到的1024个数进行输入,得到4个输出分别对应图像的4个验证码。并把实际输出和得到的输出作比较,反向调整各个网络层的参数,最后使得每个层的输入与输出的误差降到最小,这样训练出来的模型的准确率就比较高了。 3.4 端对端的验证码识别方法总结
CNN端对端的训练过程见图2所示,训练出来的模型能够通过此网络之后输出4个相对应的输出。训练时4个输出的误差总和见图3所示,4个输出的准确率见图4所示,4个输出准确率大致相同,准确率则用4个数的准确率相乘,得出验证码的准确率,因为有验证码有4个值,相乘后,大致为98%。对端的验证码识别训练起来比较容易,所以端对端的验证码识别方法还是相对于传统的验证码识别而言还是相对较好的,而且这几年的神经网络、深度学习的迅速火热,是因为他们在图像识别的领域得到了很大的提升。此方法运用在验证码识别上,更是相当的得
当。范望[6]等人也同样采用Keras框架对验证码进行识别,也取得的很好的效果所以后续实验采用了端对端的验证码识别方法,采用Keras框架,验证CNN在验证码识别的作用效果。
图2 CNN端对端训练过程示例图 图3 训练误差曲线图 图4 训练准确率曲线图 4 测试(Test)
调用captcha库随机生成1万张验证码图片,用训练出来的模型进行测试,准确率高达98.11%。实验结果见图5所示,一万张图片里面,测试错误的图片大概一百多张,验证码识别的效果基本与人的识别效果相同,甚至超越了普通人的验证码识别能力,相对人来说,机器的识别效果更好,因为机器能更快的识别出图片。 图5 模型预测结果图
图6 是预测错误的验证码示例,从一百多张的错误示例分析来看,预测错误的基本都是4位验证码中其中一位识别错误。虽然说存在预测错误的结果,但是在10 000张图片中预测错100多张,笔者觉得是在合理的范围内的,因为10 000多张验证码如果让一个人来识别,其正确率也未必能达到98.11%的水平。 5 结束语
传统的图片识别方法相对于端对端的卷积神经网络方法来说,传统的方法,需要将图片灰度化、二值化、去噪、分割,最后才能拿去训练,训练结果的好坏取决于二值化、去噪、分割的结果,虽然说训练的速度比端对端的方法快,但如果训练前面的步骤弄得不好,则训练出来的模型正确率就十分低。端对端卷积神经网络的出现,使得验证码识别这一领域得到很大的提升,无论是正确率还是速度都有很大的提升。端对端的验证码识别在模型训练之前,没有那么多的步骤,只需把神经网络设计好,然后图片拿进去训练,就能得到一个模型,把训练得到的模型用生成的样例去测试,
其测试的准确率也相当的高。CNN的发展使得图像识别向前迈了一大步,如果想用验证码更好的区分人与机器,验证码得设计的复杂一些,比如把验证码弄成解方程之类的,如果验证码只是简单的设计成10个阿拉伯数字的话,那么验证码便形同虚设,因为10个阿拉伯数字组成的验证码在CNN下训练1小时左右,准确率就会接近100%。增加最大迭代次数也取得了比较高识别结果,而且泛化能力强,具有可推广性[7]。当然我们研究验证码的识别并不是以破解验证码为目的,更多的是研究图像识别,神经网络。 图6 预测有误的验证码图
图像识别这一领域在现阶段高速发展,神经网络的出现更加推动其蓬勃发展,学好神经网络不仅仅能运用在图像识别这一领域上,语音识别也很大程度的运用了神经网络的技术。神经网络就是模拟人的神经系统,让计算机对数字产生相应的反馈,从而识别相关内容。验证码技术在当今社会是一把双刃剑,它的利弊取决于怎么去使用,如计算机代替人眼阅读,能加快阅读速度,这就是图像识别的利,假如某商家利用图像识别这一技术,不断的对网络进行爬取、攻击,那就是它的弊了。所以我们要合理运用好验证码识别这一技术,推动社会的发展,给社会带来更多的经济效益。 参考文献:
【相关文献】
[1] 谢云昊.文本验证码通用识别算法的研究[D].西安:西北大学,2016.
[2] 陈政伊,袁云静,贺月锦,等.基于Python的微博爬虫系统研究[J].大众科技,2017(08).
[3] 秦波,顾乃杰,张孝慈,等.基于卷积神经网络的图像验证码识别[J].计算机系统应用,2018(1).
[4] 侍啸,李佳霖.基于机器学习的验证码识别[D].沈阳:沈阳师范大学,2018.
[5] 陈航,邱晓晖.基于卷积神经网络和池化算法的表情识别研究[D].南京:南京邮电大学,2018.
[6] 范望,韩俊刚,苟凡,等.卷积神经网络识别汉字验证码[J].计算机工程与应用,2018(3).
[7] 于鹏.基于深度卷积神经网络AlexNet的验证码识别研究[J].通讯设计与应用,2018(1).
因篇幅问题不能全部显示,请点此查看更多更全内容