基于Python和CNN的数字验证码识别

2020-08-13 12:33张国荣刘炳君付成丽
关键词:池化灰度卷积

张国荣,刘炳君,付成丽

(忻州师范学院 计算机系,山西 忻州 034000)

0 引言

在当前网络环境中,验证码本身是用来区分人机的一种全自动验证程序,在一定程度上提高了网络防御力,又被称为“反向图灵测试”.目前,多数网站在用户注册、登录、下载甚至发表评论等情况下都用验证码进行验证,从而保证合法有效的用户权益.一般要求人类的识别率达到90%以上,机器的识别率低于0.01%[1].验证码的分类有滑块验证码、文本验证码、图像验证码、拼图验证码等,本文主要研究由四位数字组成的图片验证码.

深度学习中应用最为广泛的卷积神经网络CNN,在原来多层神经网络的基础上,加入了特征学习部分,用来模仿人脑对信号处理,成为了图像识别方向最热门的技术,在图像特征提取与识别中优势明显.鉴于CNN有很好的特征提取能力,因此本文采用CNN对验证码进行识别.

1 相关研究工作

随着验证码在人工智能领域的突出作用,国内外学者在验证码的识别方法上有着广泛的探索与研究.文献[2]和文献[3]分别利用残差设计和调整卷积分组数量对图像验证码进行识别[2,3].文献[4]提出对验证码无须预分割的端对端的识别方法[4].文献[5]提出改进识别空心验证码的方法[5].

目前,对于CNN的研究及应用更为广泛.Hinton等人在2006年提出深度置信网络(DBN)用于处理特征降维以加快训练深度网络[6].2012年继Alex Krizhevsky提出比较有利于网络优化和训练的AlexNet[7]后,更多更深的神经网络被提出,如著名的VGGNet就是在AlexNet的基础上加深并用小卷积(3*3)提高了在ImageNet数据集上的精度.2015年,何恺明等人提出了残差网络(DRN),因有残差连接使得随着网络深度的显著提升,误差却不断下降[8].如今,CNN被应用在多个领域.文献[9]提出端到端的单步进行文本验证码识别的通用算法[9].文献[10]提出了改进LeNet-7系统以提高红外图像行人检测率[10].文献[11]采用 CNN进行语音模型训练,以处理语音中信号多样性的问题[11].文献[12]提出SA-CNN以提升视觉情感分析的效果[12].

2 验证码获取及预处理

2.1 验证码训练集与测试集

本文采用在Python 3编程环境下使用深度学习框架Keras进行网络模型搭建,利用 PIL( Python Imaging Library)图像处理库批量生成各项参数可调的数字验证码图片,包括图片大小、格式、干扰点等,自动生成3 000张4位数字图片验证码,默认图片大小为60×160,RGB格式,包含少量的干扰点、线条及扭曲.本文使用其中的2 400张图片作为训练集训练网络参数,600张图片作为测试集测试网络识别的效果.训练集与测试集无交叉重叠.部分验证码样本示例图如图1所示.

图1 验证码样本

2.2 验证码图片预处理

2.2.1 灰度化处理

对于自动生成的RGB格式图片验证码,从图1中可以看出会有噪点、线条及相互连接等一定的干扰来模拟网络环境中的验证码.由于灰度图像的像素点变化范围较RGB格式的图像像素点小得多,因而在进行图像处理时,会首先进行灰度化图像.灰度化方法一般有分量法、平均值法、最大值法、加权平均法.本文采用加权平均法提取灰度图,将原RGB图像三个分量的像素值以不同的权重进行加权平均后得到的像素值作为灰度值,其常用的计算公式如下:

Gray=0.298 9R+0.578 0G+0.114 0B

其中,Gray表示所求坐标(i,j)位置处的像素值,R,G,B分别为三个分量的坐标(i,j)位置的像素值.

2.2.2 二值化处理

图像的二值化处理,是指将灰度图像像素点的灰度值由某个阈值划分为两部分,使图像显示出明显的黑色及白色效果,便于对图像进一步处理,使图像计算更为简单,且有利于凸显出关注目标的轮廓.

二值化操作的关键在于阈值的选取.本文中阈值设为200,预处理前的图片与预处理后的图片对比如图2与图3所示.

3 网络模型设计

3.1 卷积神经网络概念

CNN以二维矩阵数据形式输入,与传统的深度神经网络(Deep Neural Network,DNN)的不同在于其隐藏层的神经元仅与局部区域(即局部感受野)输入层的神经元相连.在结构上,它主要由多个卷积层和池化组合而成.

卷积层采用卷积来代替传统DNN的全连接,卷积层的每一个神经元只和前一层的一个局部窗口即感受野的神经元相连,构成卷积核.卷积核在卷积操作时对应的权值和偏移值共享,使得CNN的训练简单化,提高了迭代效率.

池化,目的是降维,能够简化卷积层的输出参数,提高所提取特征的鲁棒性.特征图像经过池化操作后通道数不会改变.下采样尺度为2*2的池化,应用频率非常高,其效果相当于高度和宽度缩减一半,大大降低了模型参数.

激活函数的作用是为了增加神经网络模型的非线性,从而提升神经网络模型表达能力,解决线性模型所不能解决的问题.不同的激活函数带来的效果有一定的差异,从计算量、梯度消失、反向传播求误差等多方面考虑,sigmoid函数在BP神经网络中用得较多,目前ReLu函数及其改进函数在CNN中用得较多.

损失函数,是用来衡量模型的预测值与真实值不一致的程度,从而评估模型的好坏.神经网络优化的过程实质就是最小化损失函数的过程,损失函数越小,说明模型的预测值愈接近真实值,模型的健壮性也就越好.

3.2 网络模型的设计与实现

本次实验中,采用的神经网络模型共四层,前三层每层进行两次卷积操作和一次池化操作,第四层为全连接层,结构如图4所示.

图4 网络结构

具体定义代码如图5所示.

图5 定义CNN结构的代码

4 实验过程与分析

本文选择Adam梯度下降算法作为模型优化器,输出1×40的向量表示识别结果,损失函数采用binary_crossentropy.

在该模型训练中发现,batch_size的设置值也极为重要,若设置得太小会增加训练时间且不利于损失函数的收敛,设置得太大容易陷入局部最小值.通过比较训练效果,最终在本次实验中选取batch_size为32,epochs为10,在测试集上的验证码识别率达到98.8%.

训练情况和测试结果分别如图6和图7所示.

5 总结

本文针对网站中常见的数字验证码利用4层卷积神经网络训练模型并进行识别,取得了不错的识别率,对于验证码识别相关领域的研究及应用具有一定的借鉴意义.当然,也有不足之处,通过在神经网络中每层进行两次卷积操作时,虽然能够提取出到更多的图像特征和减少很多参数,使得神经网络在较少的训练次数下得到更好的训练结果,但也在一定程序上增加了过拟合的风险.

猜你喜欢
池化灰度卷积
基于高斯函数的池化算法
采用改进导重法的拓扑结构灰度单元过滤技术
卷积神经网络中的自适应加权池化
基于3D-Winograd的快速卷积算法设计及FPGA实现
Bp-MRI灰度直方图在鉴别移行带前列腺癌与良性前列腺增生中的应用价值
Arduino小车巡线程序的灰度阈值优化方案
卷积神经网络的分析与设计
从滤波器理解卷积
基于卷积神经网络和池化算法的表情识别研究
用于手写汉字识别的文本分割方法