基于深度学习的验证码图像识别

2019-03-19 06:54宋小鹏杜春晖
测试技术学报 2019年2期
关键词:字符残差标签

徐 星,宋小鹏,杜春晖

(1.中北大学 信息与通信工程学院,山西 太原 030051;2.中国煤炭科工集团太原研究院有限公司,山西 太原 030006)

0 引 言

为了实现全自动、 大批量地抓取“企查猫”网站的信息,需要破解该网站的验证码.该网站的验证码图像包含4位字符,由数字和大写字母组成,共28个字符,为“0123456789ACDFHJKLN-PRSTUVXY”.

鉴于验证码在互联网中的广泛应用,国内外对验证码的识别进行了相关研究,出现了很多破解验证码的技术.目前,验证码识别主要有支持向量机(SVM)、 卷积神经网络(CNN)等方法.殷光等[1]将每张图像进行灰度化、 二值化后进行区域分割,将4位字符切割成4个单个字符供SVM分类器进行训练.该方法能够识别大多数图像不粘连的验证码.张涛等[2]也提出在验证码图像字符容易分割的情况下,对其先经过灰度化、 二值化、 去噪后,切割成单个字符,采用深度卷积神经网络的方法对单个字符进行训练、 识别后再合并的方法.该方法基于卷积神经网络强大的特征提取能力,并且使用了非线性激活函数,效果明显优于SVM的分类方法,但是也仅仅能够处理容易分割的验证码图像.对于不易分割的验证码,张涛等[2]将包含10个数字和26个字母的4位字符的标签使用1*144向量表示,每位字符占用1*36,采用深度学习端对端的单任务整体分类的方式进行训练.该方式分类类别较多,拟合效果不好,准确率只达到了85%.于鹏[3]、 温明莉[4]和洪洋[5]等都提出用深度神经网络对整张验证码图片进行多标签学习来完成多任务分类,端对端地识别出了验证码中的所有字符.该方法对特定位数并且图像噪声较少的验证码识别效果较好.张涛等[2]也提出使用CNN+RNN的方法进行验证码识别,但是由于其设计的CNN网络层数较浅,得出该方法没有优于只使用CNN的效果.

本文主要受图像描述(Image Caption)的启发,图像描述是指从图片中自动生成一段描述性文字,机器不仅要能检测出图像中的物体,而且要理解物体之间的相互关系,最后用合理的语言表达出来.谷歌开源了图像描述系统,提出使用Caption模型,使其能对图像生成更详细、 更准确的描述,解决图像标注问题[6].对于验证码图像,同样也可以采用此方法将图像中的字符表达出来.本实验将采用卷积神经网络(CNN)与循环神经网络(RNN)结合的方式,构造出复杂的CNN模型进行特征提取用于RNN语句的生成.这对于拥有动态位数,不容易被分割成一个个单独字符且图片背景复杂的验证码,具有良好的识别效果.

1 网络模型设计

图像描述就是由给定的图像生成一段描述文字.验证码图像描述要做的就是将验证码图像中的字符表达出来.目标是产生标注验证码字符的语句,是一个语句生成的任务,一对多的序列生成过程使用RNN进行; 描述的对象拥有大量的图像信息,利用CNN将更深层次的特征表达输出到RNN的输入端.将CNN与RNN结合的网络模型设计能够把时间、 空间的特性更加完整、 具体地表达出来.CNN适合用于空间扩展,其在神经元与特征卷积上的特性,使得它更专注于图像的特征提取,并且能够静态地输出图像特征; RNN适合用于时间扩展,由于它的特殊结构能够对神经元与时间上连续状态的输出进行计算,因此它擅长处理序列化数据,并且具有记忆功能.

1.1 CNN

卷积神经网络作为一种深度学习架构,是一种多层神经网络,通过一系列方法,它成功地将数据量庞大的图像识别问题不断降维,最终使其能够被训练,并且得到了较高的准确率[7,8].本实验中CNN的目的是以一定的模型对事物进行特征提取,由于卷积和池化计算的性质,使得图像中的平移部分对于最后的特征向量是没有影响的,提取到的特征更不容易过拟合.网络的层数越多,意味着能够提取到不同等级的特征越丰富.并且,对深层次的网络结构能够提取到更抽象的特征,得到更多的语义信息.但是随着网络深度的增加,网络准确度出现饱和,甚至出现下降的问题,ResNet通过短路机制加入了残差单元,并证明了加深的残差网络比简单叠加层的深度网络更容易优化,准确度得到了明显提升[9].本实验根据ResNet网络的特性,创新性地构建出24层的卷积神经网络,结构如表 1 所示,Conv1为卷积层,它使用64个7*7大小的卷积核; Conv2_x、 Conv3_x为多重残差单元,其中Conv2_x为3重残差单元,每重残差单元由3个卷积层构成,而Conv3_x为4重残差单元,同样地,每重残差单元包含3个卷积层.对于Conv2_中的残差单元,如图 1 所示,该结构将输入端与输出端短路连接,有助于解决神经网络训练出现梯度消失和梯度爆炸的问题.x为输入值,F(x)为三层卷积后得到的值,F(x)+x表示网络最终结果.若直接去拟合一个潜在的恒等映射函数H(x)=x比较困难.但是,如果把网络设计为H(x)=F(x)+x,如图 1 所示,可以转换为学习一个残差函数F(x)=H(x)-x.因此只要F(x)=0,就可以构成一个H(x)=x的恒等映射,而且对于残差的拟合会更加容易.

表 1 卷积神经网络结构

图 1 残差单元示意图Fig.1 Diagram of residual cells

1.2 RNN

在众多自然语言处理的任务中,循环神经网络(RNN)已经取得了巨大成功,用于语言建模[10],文本生成[11],机器翻译[12],语音识别[13],生成图片的文字描述[6].卷积神经网络(CNN)解决了图像空间问题,但还存在图像时间问题.RNN具有记忆功能,当前的输出由上一时刻的输出和当前的输入共同决定,因此使其在处理序列的问题上得到了广泛的应用.长短期记忆网络(LSTM)作为一种特殊的RNN模型,通过设计遗忘门避免了以往RNN出现当前系统状态受之前系统状态影响的问题,使其得到了广泛的应用[14].LSTM是根据前面的信息推出后面的,但有时只看前面的信息是不够的,可能需要由前面若干输入和后面若干输入共同决定,以使推测更加准确.Bartz等[15]采用双向循环神经网络(Bidirectional Long-Short Term Memory, BLSTM)弥补了这一问题,并用于语言识别.因此,本实验采用BLSTM处理卷积神经网络输出的特征,识别验证码序列.双向循环神经网络,如图 2 所示,输入序列中的第一个是原样的,第二个是输入序列的反转副本.这可以为网络提供额外的上下文,使得网络得到更快、 更好的拟合.

图 2 BLSTMFig.2 Diagram of BLSTM

1.3 损失函数

采用CTC(Connectionist Temporal Classification) Loss作为序列有监督学习的损失函数进行模型训练时,不需要将数据对齐和一一标注,只需要一个输入序列和一个输出序列即可以训练,并且直接输出序列预测的概率,不需要外部的后处理[16].因为CTC允许神经网络在任意一个时间段预测标签,但要求输出的序列顺序必须是正确的,这样就不需要让标签和图像中的字符严格对齐了,而且CTC输出的是整个序列标签,因此也不需要再做一些外部的后处理.CTC Loss在分类处理时需要多设置1个长度即空格,否则会无法预测出连续两个相同的字母或者数字的验证码序列了.

2 数据集制作及评估标准

2.1 数据集制作

本次识别验证码是为了解决实际爬虫遇到的问题,验证码图片来自“企查猫”网站,使用python语言编码发送http请求到该网站验证码图像接口来获取验证码图片.获得的验证码图像如图 3 所示,宽为80像素,高为160像素.收集到22 388张验证码,将这些验证码图片按照0.75,0.15,0.10的比例分为训练集、 验证集和测试集三部分.训练集为16 791张,验证集为3 358张,测试集为2 239张.验证码字符包含28个字符,为“0123456789ACDFHJKLNPRSTUVXY”.验证码图像标签的制作采用手工打标签,打完标签后进行检查排错以确保标签的正确性,因为实验采用的是监督学习,没有正确的标签则不会有较高的识别准确率,这也会避免训练中出现过拟合的现象.

图 3 验证码2KN6Fig.3 Captcha 2KN6

2.2 评估标准

本实验采用准确率评估验证码的识别效果,用识别对的验证码图片数量去除参与识别的验证码图片数量.

3 实验过程

① 本实验采用Caffe[17]框架进行训练,将数据集制作好后修改Caffe源码使其支持多标签输入和训练; ② 将图像数据和标签转换成LMDB格式的数据库文件; ③ 设计CNN与RNN结合的网络模型结构,使之能够适合处理验证码标注任务; ④ 训练和测试网络; ⑤ 使用Flask搭建基于深度学习的验证码图像识别服务器; ⑥ 编写代码,发送post请求,返回识别结果; ⑦ 制作软件图形化界面,可视化识别,如图 4 所示,当点击“识别”按钮后会发送下载验证码图片的请求并调用识别程序,在界面会显示这幅验证码图片和识别结果.

图 4 验证码识别图形用户界面Fig.4 Captcha recognition GUI

4 实验结果及分析

从图 5 中可见,迭代初始阶段验证码识别的准确率不高,随着迭代次数的增加,识别准确率突然上升; 在迭代7 000次后,模型的识别准确率缓慢上升; 在10 000次迭代后,模型平均识别率基本达到稳定,最终收敛在97%左右,并且并没有出现过拟合.测试结果显示,2 239张图片有65张图片被识别错,识别正确率达到97.09%.由此可见,本文设计的基于深度学习的验证码识别正确率高,效果很好.通过观察实验结果发现,存在的部分误判是因为验证码字母的复杂变形导致字母与字母之间很容易产生混淆,如K、 H、 N等,人眼也很难分辨.对这一问题,可以通过反复排查打标签的正确性来避免人为因素,另外还可以增加更多的训练样本和加深卷积神经网络的层数来进一步提高识别率.

图 5 迭代次数与正确率的关系图 Fig.5 The diagram of the relation between the number of iterations and the correct rate

5 结束语

本文针对“企查猫”网站的验证码进行分析,由于该类型的验证码图片中的字符之间存在粘连,不容易被分割成一个个单独的字符.对此本文提出利用端到端的思想搭建深度学习模型,省去预处理和分割环节,然后进行训练识别,取得了较好的结果.实验结果证明了采用CNN结合RNN的方式进行训练,能够达到较高的识别准确率,没有出现过拟合现象,并且能够识别动态位数的验证码.采用这种图像描述的方处理验证码识别问题,效果很好,可以将此技术应用于车牌识别或身份证号码识别上.但是对于如果不经过训练的验证码,直接使用这个训练好的模型可能达不到如此好的效果,需要采集大量地训练样本并且对此打上正确的标签,重新进行训练.

猜你喜欢
字符残差标签
基于双向GRU与残差拟合的车辆跟驰建模
基于残差学习的自适应无人机目标跟踪算法
字符代表几
一种USB接口字符液晶控制器设计
图片轻松变身ASCⅡ艺术画
基于递归残差网络的图像超分辨率重建
HBM电子称与西门子S7-200系列PLC自由口通讯
无惧标签 Alfa Romeo Giulia 200HP
不害怕撕掉标签的人,都活出了真正的漂亮
综合电离层残差和超宽巷探测和修复北斗周跳