崔 新,白培瑞,张 策,刘庆一,傅颖霞2,刘嘉程,祝璐璐
(1.山东科技大学 电子信息工程学院,山东 青岛 266590;2.山东科技大学 矿业与安全工程学院,山东 青岛 266590)
互联网技术的高速发展给人们带来生活便利的同时,随之而来的网络安全问题也日益突出。网络资源滥用、网络信息窃取等恶意行为已引起广泛关注。验证码识别是维护网络安全和防止计算机程序恶意攻击的一种有效机制和方法,在各大网站中已得到广泛应用[1]。搜狐、爱奇艺、Facebook等网站使用的是具有噪声干扰和独立字符的验证码;百度、谷歌、新浪等网站使用的是具有扭曲和粘连字符的验证码,该类验证码主要由数字和字母随机构成。而且,为了提高防伪能力,开始采用相互连接且扭曲的字符验证码。
传统的验证码识别方法主要分为三个步骤:图像预处理、字符分割和字符识别[2]。其中,字符分割是直接影响识别效果的关键因素。对于只包含字符的验证码图像,一般采用先逐个分离字符,然后利用机器学习方法如k-最近邻算法[3]或卷积神经网络对子图像进行正确分类。但是,传统验证码识别方法对不同类型的验证码泛化能力和鲁棒性较差。
针对复杂类型验证码分割的困难性,国内外学者已提出很多解决方案。李兴国等[4]针对存在字符粘连的验证码提出一种将滴水算法与积分投影相结合的分割方法,对于验证码中存在部分粘连的字符具有较好的分割适应能力。尹龙等[5]对于扭曲粘连类型字符验证码的识别问题,提出基于DENSESIFT和RANSAC算法以及基于马尔科夫随机场算法,两种算法均取得较好的效果。简献忠等[6]提出一种基于SOM聚类结合Voronoi骨架形态学分析的粘连字符分割算法,该方法对于倾斜扭曲的验证码具有良好的分割效果。Lu 等[7]针对多种类型验证码分别提出了不同的字符分割算法,并结合SVM 分类算法及BP 神经网络进行字符识别。Wang等[8]基于自适应的算法来对验证码进行去噪和分割,并采用模板匹配的方法来对分割后的字符进行识别,取得了较好的识别效果。Mori等[9]基于shape context算法识别了EZ-Gimpy验证码,识别率为92%。但是,以上算法大多是解决特定类型的验证码,一旦验证码的样式发生变化,识别效果往往并不理想,泛化能力不足。
近年来,在语音和图像识别领域大获成功的深度学习技术开始被引入验证码识别领域[10-12]。其中,卷积神经网络(convolutional neural network,CNN)是最常见的一种深度学习技术,可以直接从图像中学习深度特征,避免传统方法中字符分割损失有用信息的问题[13]。Qing等[14]提出一种多标签卷积神经网络识别文本验证码且无需分割,对于字符失真和复杂验证码取得较好的效果。MATAN等[15]采用空间位移神经网络(spatial displacement neural network,SDNN)和隐马尔科夫模型(hidden Markov model,HMM)对带有粘连的手写字符进行识别,识别率达到90%。Shi等[16]将CNN与循环神经网络(recurrent neural network,RNN)相结合,提出一种卷积循环神经网络(CRNN)实现验证码的整体识别。Du等[17]利用Faster R-CNN进行整体识别,对于不定长度序列的验证码有较好的识别效果。Lin等[18]利用卷积神经网络学习验证码的笔画和字符特征,极大提高了具有失真、旋转和背景噪声的验证码识别准确率。与传统方法相比,深度神经网络具有更好的学习能力,能有效提升分类识别效率。然而,大多数端对端识别算法直接采用现有的卷积神经网络结构,网络层数较深,训练参数量大,在有效样本数量有限的情况下容易出现过拟合和泛化能力不足的现象。
本研究提出一种基于深度卷积神经网络的端对端验证码识别方法。主要创新点:①采用并行级联卷积层构建Inception模块进而搭建卷积神经网络,既增加网络的宽度又提高网络对于不同尺度的适应能力,避免产生过多的训练参数。同时,采用全局平均池化层代替全连接层,可以防止过拟合,提高网络的学习效率。②整个过程将验证码字符图片直接作为网络输入,不进行图像分割。在网络训练过程中主动学习调节参数,可以避免传统方法中因过多人工干预造成图像信息被破坏导致的误差累积问题。
端对端验证码识别系统是将验证码图像直接输入至搭建的网络模型中,利用网络的学习能力自动提取验证码字符的特征信息进行训练,产生最优模型参数进行字符识别。与传统方法流程相比,该流程去除了字符图像分割环节,可以避免学习过程中误差累积问题。算法流程图如图1所示。
图1 端对端识别算法的流程图
1.2.1 验证码图像预处理
图像预处理是为了去除不利于识别的干扰信息,突出显示与字符相关的特征信息,从而提高识别正确率。预处理过程主要分为三个环节:灰度化、二值化和图像去噪。其中,灰度化采用加权平均法。
加权平均法通过对R、G、B三个分量分配不同大小的权值进行加权计算,并将计算结果作为整幅图像的灰度像素值,公式如下:
f(x,y)=0.3R(x,y)+0.59G(x,y)+0.11B(x,y)。
(1)
二值化过程中,由于验证码图像的目标信息通常位于中间区域,为避免重复计算图像周围的空白区域,减少计算复杂度,采用局部最优阈值法进行二值化[19]。其中,局部最优阈值采用Otsu算法计算:
(2)
式中,NA为目标区域的像素点数,N为灰度图像的像素点总和,μ为整体灰度均值,μA为目标区域的灰度均值。
图像去噪为可选操作,根据样本形式和噪声决定是否采用中值滤波去噪。
1.2.2 网络架构设计
本研究所提的深度网络架构是在Google-Net网络模型的基础上设计(图2)[19],其中,实线连接部分为本研究设计的卷积神经网络结构,虚线连接部分为传统卷积神经网络结构。网络结构上主要做了两点改进:一是采用由并行级联卷积组成的Inception模块代替中间的卷积层和池化层;二是采用全局平均池化层(global average pooling layer,GAP)来替换全连接层。采用Inception模块虽然加深了网络深度,但是可以减少网络训练参数,提高网络对多尺度目标的适应能力。全局平均池化层替代全连接层可以提高网络学习效率。所有Inception模块中卷积层的输出引入批量标准化操作(batch normalization),以此归正每层输入样本的分布,可以加快训练速度,提高泛化能力。各层的参数如表1所示。
Inception模块的结构由并行级联的卷积层构建(如图3所示),该结构便于利用不同大小的卷积核感知不同范围和尺度的局部特征,然后加以组合,提高网络的多尺度适应性,在减少训练权系数数量的同时,提高深度网络的学习能力。本研究网络用到4个Inception模块,且4个Inception模块的结构都是一致的。
利用全局平均池化层替代全连接层(如图4所示),可以正则化网络输出,防止训练过程中出现过拟合,提高分类准确性。
图2 本研究提出的深度网络结构与传统卷积神经网络结构对比
表1 本研究深度网络结构的参数配置
图3 简易Inception模块示意图
图4 采用全局平均池化层替换全卷积层示意图
1.2.3 训练过程
在训练过程中通过对每一个中间层的输入数据进行标准化操作,将样本的数据分布映射到均值为0、方差为1的正态分布范围内,当前层网络参数发生变化时,后层的均值方差不变,减少了层与层之间参数的耦合,通过引入批量标准化操作使得网络可以设置更高的学习率,降低初始化值加快网络训练速度,同时批量标准化对模型起到一定的正则化作用,减少了网络对于Dropout的需求。
在批量标准化的过程中,首先需要对网络的输入数据进行归一化处理:
(3)
式中,E(x(k))是指训练数据神经元x(k)的平均值,分母是指数据神经元x(k)的一个标准差。为了防止归一化改变数据的分布方式影响网络学习,通过引入两个超参数γ(k)、β(k)将其转换为:
(4)
选取3个不同类别的验证码图像作为样本数据集进行训练和识别(见表2)。
1)京东验证码
京东验证码包含了常见的验证码干扰方式,比如字符尺度变化、线性噪声、字符粘连等特征,比较适合用于测试验证码的适用性。
2)正方教务系统验证码
正方教务系统验证码具有点噪声和部分扭曲粘连的特性,可以用于评估粘连字符验证码识别方法的性能。
3)谷歌验证码
谷歌验证码是目前网络上难度最大的字符型验证码,具有复杂的扭曲、粘连等特征,传统验证码识别方法无法识别此类验证码。
表2 部分选用的验证码训练集
样本验证码图像的大小均为60×160像素(高度×宽度),初始学习率为0.01。实验过程首先对验证码数据集进行筛选,判断是否进行预处理或样本扩充操作,制作训练集和测试集,将训练集整体输入至网络结构中进行训练和调参,待其产生最优训练模型。其次,输入测试样本进行预测。统计正确预测个数(TP)和错误预测个数(TN),最后根据统计结果计算准确率(Accuracy,acc),acc=TP/(TP+TN)。为保证识别的鲁棒性,对谷歌验证码进行了两次训练,第一次选用256的批量样本迭代25次,后改用128的批量样本迭代45次完成训练。
对京东验证码、正方教务系统验证码和谷歌验证码的识别效果进行了对比实验,实验结果如表3所示。三种验证码的训练样本/测试样本/批量样本(batch-size)/迭代次数参数值分别为14 266、6 000、6 500张/420、1 000、500张/128、64、128张/50、40、25次。表3列出了不同验证码图像的识别准确率,同时也列出了四种传统深度网络得到的识别准确率比较。可以看出,本方法对京东验证码的识别准确率比AlexNet、VGG-16、Googlenet-v2、ResNet34分别提高了1.14%、1.71%、0.5%和0.31%,对正方教务系统验证码的识别准确率分别提高了2.75%、3.08%、1.13%和1.46%,对谷歌验证码的识别准确率分别提高了3.14%、2.05%、0.43%和1.3%。本方法对于3种不同类型验证码均有着较高的识别率、鲁棒性和良好的泛化能力。
表3 不同验证码图像的识别准确率比较
表4对不同网络架构的识别准确率和计算时间进行了对比。表1中的8层结构网络分别减少2层Inception模块和增加2层Inception模块,得到6层和10层结构的深度学习网络。根据统计结果,三种验证码采用8层结构网络的识别准确率比6层结构网络平均提高2.79%,训练时间平均增加274 s;10层结构网络的识别准确率比8层结构网络平均提高了0.59%,训练时间平均增加1 054 s。所以,从识别准确率和训练时间指标折衷考虑,8层结构网络的性能最好。
表4 不同网络结构识别准确率和时间比较
传统卷积神经网络的卷积层通常由许多卷积单元组成,用来从前一层的特征图中提取更高级的特征。但是,如何优化每一层各通道提取的特征,提高目标表示效率是深度学习技术中需要考虑的问题。通过采用并行的级联卷积层构建简易的Inception模块,用于替代传统网络中的卷积层,并在其中运用多个小卷积核代替原来的大卷积核,可以在减少参数量的同时,增加网络深度提高网络学习能力。
1)Inception模块中,通过使用两个3×3卷积来替代5×5卷积,由于两个3×3卷积核的参数量为:2KP3×3=2(32C2)=18C2,而一个5×5卷积核的参数量为:KP5×5=52C2=25C2,可以算出采用3×3卷积的堆积结构参数量为原结构的0.72倍。
2)每一个Inception模块内由三个并行级联卷积层组合而成,不同大小的卷积核与图像卷积后产生不同的感受野提取不同区域的特征,1×1的卷积将输入的图像降维后保留了原来的全局特征,1×1卷积和2个3×3卷积的串联组合可以提取输入图像的局部特征,池化层与1×1卷积串联后提取原输入图像一半大小的区域特征,最后将这三层并联卷积层提取的不同尺度特征进行合并,有效提升了网络对不同尺度的适应性。
对于含有复杂干扰信息或粘连的验证码,基于图像分割的传统方法很难识别,而且分割会破坏字符信息,导致误差累积。端对端的深度学习技术,从输入端到输出端会有一个对结果的预测,预测误差在网络的每一层反向传递与调整,直至得到预期的结果。通过将这种自主学习网络架构引入验证码识别,可以去掉字符分割步骤,并根据训练样本中干扰复杂程度来选择是否进行预处理操作,以此更好凸显和保留字符间的特征信息[20]。以京东验证码为例,与传统分类器算法(SVM)、基于BP神经网络的分割算法以及基于CNN的分割算法相比,本算法识别准确率分别提高了5.68%、9.67%和0.56%,识别准确率和速度均有较大提升。以上实验结果也表明采用端对端验证码识别方法可以达到更好的识别性能。
本研究提出一种基于深度卷积神经网络的端对端验证码识别方法。利用Inception模块代替卷积层构建深层卷积神经网络,整个过程将验证码图像直接作为网络输入,无须字符分割等过多人工干预,避免字符信息破坏造成错误累积的问题,利用网络学习能力自动提取字符特征进行训练,从而实现了端对端的训练和识别。实验结果表明,端对端的验证码识别方法对于不同类型的复杂验证码均有着较高的识别准确率和鲁棒性。