基于卷积神经网络的多字符类型验证码识别
Posted beta-1999
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于卷积神经网络的多字符类型验证码识别相关的知识,希望对你有一定的参考价值。
摘要:
??验证码作为一种互联网安全手段, 被广泛应用于互联网各类验证界面中。由于传统的图像识 别算法对于验证码的识别准确率及速度很大程度上都依赖于算法的设计及鲁棒性上,实际应用起来效果不是很好。在本次项目中,使用 Tensorflow 框架将卷积神经网络应用于验证码的特征提取及识别上,利用 Python 中的 Captcha 库随机生成具有"数字"、"大写英文字母"及"小写英文字母"的多字符类型验证码样本,用于卷积神经网络模型的训练及测试。
关键词: 验证码识别,卷积神经网络,Tensorflow
一、研究目的及应用背景
??如今,验证码已经广泛应用于各大网络平台及网站,主要针对的是一些恶意利用脚本进行网站爆破并窃取其他用户及平台信息的情况。随着图像处理技术的不断发展,原有的纯数字类型验证码几乎很难将这些有不良居心的人拒之门外。因此,近些年的验证码类型已经逐步发展到了多种字符类型嵌套,甚至引入了极具中国特色的汉字验证码系统。一方面,这确实增加了系统的防护能力,但是另 一方面,却也极大地增大了用户在肉眼识别上的难度。
??一切技术的进步都将会促进相应领域更长足的发展,验证码识别技术看似是一个具有争议的研 究方向,但是正是由于这一技术的日趋强大,才会促进反识别技术的不断进步,进而能够更加保障 用户信息的安全。因此,相信验证码识别技术在网络信息安全方面能够持续发挥出它的贡献。
二、相关概念介绍
2.1 卷积神经网络
2.1.1 概述
??卷积神经网络 (Convolutional Neural Networks, CNN) 是一类包含卷积计算且具有深度结构的前馈神经网络 (Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一。
??CNN一般包含如下的层级结构:
- 数据输入层(Input Layer)
- 卷积层(Convolution Layer)
- 池化层(Pooling Layer)
- 全连接层(Fully Connected Layer, FC)
??一个常见的MINST手写数字CNN结构如下图所示:
??一个卷积神经网络可以有若干卷积池化层和若干全连接层,其中,卷积池化层的作用在于对数据中冗余的信息进行剔除,提取出更加抽象和简洁的数据特征信息,提供给最后的全连接层进行特征分类。因此,一个基本的卷积神经网络可以看作是卷积 + 神经网络组成的。
2.1.2 数据输入层(Input Layer)
??该层主要是对原始数据做预处理,可以包括:
- 零均值(Zero Mean):把输入数据各个维度都中心化为 0 ,如下图所示,其目的就是把样本的中心拉回到坐标系原点上
- 归一化(Normalization):幅度归一化到同样的范围,如下所示,即减少各维度数据取值范围的差异而带来的干扰,比如,我们有两个维度的特征A和B,A范围是 0 到 10 ,而B范围是 0 到 10000 ,如果直接使用这两个特征是有问题的,好的做法就是归一化,即A和B的数据都变为0到1的范围
- PCA和白化:用PCA进行数据降维;白化是对数据各个特征轴上的幅度归一化
2.1.3 卷积层(Convolution Layer)
??该层主要完成输入数据的降维和特征提取。
??以输入数据为二维图像为例,图像卷积可以看作是一个个卷积核在图像上滑动,并于图像数据做卷积运算的过程。一个典型的卷积计算过程如下图所示,其中 (w) 为卷积核,(b) 为偏置矩阵。:
??对于神经网络的靠前卷积层,卷积完成的是一个较小范围的数据信息的抽取,而随着卷积层的逐渐增加,靠后的卷积层感受野逐渐增大,因此捕获数据的信息也就更加复杂、更加抽象。
2.1.4 池化层(Pooling Layer)
??经过卷积层的数据降维和特征提取,得到的特征数据可能维数还是很高,因此可以引入池化层。
??池化层是对卷积层计算出的结果进行进一步的降维。以二维数据图像为例,池化的做法是将卷积图像的每一个指定区域面积大小(一个Filter大小)内的数据用一个值代替,常见的方法有最大值池化(Max Pooling)和均值池化(Mean Pooling)。
??一个典型的最大值池化操作过程如下图所示:
2.1.5 全连接层(Fully Connected Layer, FC)
??全连接层在整个卷积神经网络中起到一个分类的作用,它将卷积池化层获取到的隐层特征映射到样本标记空间。
??在实际使用中,全连接层同样可以由卷积操作实现:
- 对于直接连接在卷积池化层后的全连接层,可以看作是卷积核尺寸为前层卷积结果同宽高的一个大的卷积。在实际编程过程中,我们通常采用的方法是将前层卷积结果从矩阵形式reshape为向量形式,再与同样表示为向量形式的全连接层卷积核进行矩阵
- 而对于直接连接在另一个全连接层后的全连接层来说,该层可以看作是卷积核尺寸为 1x1 的卷积操作。这将更加方便理解和编程实现。
??一个典型的全连接网络如下图所示:
2.2 Tensorflow
??TensorFlow 是一个采用数据流图(Data flow graphs),用于数值计算的开源软件库。节点(Nodes) 在图中表示数学操作,图中的线(Edges)则表示在节点间相互联系的多维数据数组,即张量(Tensor)。 它灵活的架构使得用户可以在多种平台上展开计算,例如台式计算机中的一个或多个 CPU(或 GPU)、 服务器、移动设备等等。TensorFlow 最初由 Google 大脑小组(隶属于 Google 机器智能研究机构) 的研究员和工程师们开发,用于机器学习和深度神经网络方面的研究,但这个系统的通用性使其也可广泛用于其他计算领域。
三、方案设计
3.1 验证码样本生成
3.1.1 Captcha库简介
??Captcha库是Python底下的一个拓展库,通过简单的调用 ImageCaptcha 类下的 generate() 函数,传入待生成的字符串变量,即可生成响应的 BytesIO 类型的验证码图像,内部默认添加横线和噪点两种干扰,字符有不同程度的扭曲变形。 生成示例如下图所示:
3.1.2 验证码生成类设计
??设计 Captcha 生成类, 成员函数包含:
-
随机文本生成函数 (generate_text)
?? 随机生成包含"数字"、"大写英文字母"及"小写英文字母"的指定长度的字符串; -
文本转向量函数 (text2vec)
?? 将输入的字符串重新编码成能够满足卷积神经网络输入要求的向量形式; -
文本转向量函数 (vec2text)
?? 将卷积神经网络输出的字符串重新解码成字符串形式; -
验证码图像预处理函数 (image_processing)
?? 将 ImageCaptcha 类生成的 BytesIO 类图像转换成能够进行图像处理的 array 类型, 并对原始图像依次进行灰度化、运用自适应阈值的二值化以及噪点腐蚀降噪处理;
?? 其中, 降噪过程设计了 6x6 的腐蚀核:
??利用该腐蚀核能够有效的滤除验证码图像中散乱的噪点, 滤除效果如下图所示:
-
验证码图像生成函数 (generate_captcha)
?? 返回生成的字符串类型的验证码文本、矩阵类型的验证码图像及预处理结果图像; -
图像保存函数( save_img2file)
?? 存储图像数据到本地文件夹;
3.2 卷积神经网络设计
3.2.1 卷积神经网络模型设计
?? 本项目中卷积神经网络共计 9 层。除输入层外,卷积层与最大值池化层替排列各计 6 层,最后 2 层为全连接层。各层结构如下所述:
- 第 0 层: 输入层, 图片大小: 60x160x1
- 第 1 层: 卷积层, 卷积核尺寸: 3x3,卷积核个数: 32, 步长:1,输出: 60x160*32
- 第 2 层: 池化层, 池化核尺寸: 2x2,步长:2, 输出: 30x80*32
- 第 3 层: 卷积层, 卷积核尺寸: 3x3,卷积核个数: 64, 输出: 60x160*64
- 第 4 层: 池化层, 池化核尺寸: 2x2,步长:2, 输出: 15x40*64
- 第 5 层: 卷积层, 卷积核尺寸: 3x3,卷积核个数: 32, 输出: 30x80*64
- 第 6 层: 池化层, 池化核尺寸: 2x2,步长:2, 输出: 8x20*64
- 第 7 层: 全连接层, 输出节点个数:1024
- 第 8 层: 卷积层,输出节点个数: 验证码长度x单个字符编码长度
?? 完整的网络结构如下图所示:
3.2.2 卷积神经网络参数设计
3.2.2.1 损失函数
?? 采用sigmoid交叉熵计算损失值,计算结果取平均值得到单个 batch 的 loss 均值。
3.2.2.2 学习率
?? 采用 Adam 优化器优化算法实现自适应学习率。
四、测试记录
4.1 软硬件参数
- 处理器:Intel(R) Core (TM) i5-7400 CPU @ 3.00GHz
- RAM内存大小:16GB
- 集显:Intel(R) HD Graphics 630
- 独显:NVIDIA GeForce GTX1050
- 操作系统:Windows 10
- 环境管理工具:Anoconda-4.5.12
- 软件库版本:Tensorflow-1.10.0,Python-3.5.6
- GPU相关环境配置:Tensorflow-gpu-1.10.0,CUDA-9.1.85,CUDNN-9.1
- 开发语言:Python
4.2 实验参数设定
- 验证码长度:4
- 验证码字符类型:数字、小写英文字母、大写英文字母,随机分配
4.3 实验记录
?? 实验时,为了探究图像噪点腐蚀预处理对检测结果有何影响,设置了对照组实验,并分别训练两组模型用于比较测试。
4.3.1 对照组测试
?? 该组对随机生成的训练集样本只做自适应阈值二值化处理处理,如下所示:
?? 训练集单个batch含 64 个样本,总共训练 22001 批,训练时测试样本单个 batch 含 100 个样本,每迭代 100 次测试一次,总计测试 220 次,训练结束时准确率单次最高 0.8675 。
?? 训练过程的 Loss、Accurancy 与迭代次数变化情况如下所示:
?? 加载训练好的模型,进行 10 次测试,单批样本 1000 个,测试过程部分截图如下:
?? 测试结果列表如下:
测试次数 | 准确率 | 总耗时(ms) | 单张平均耗时(ms) |
---|---|---|---|
1 | 0.8445 | 5773.3326 | 5.7733 |
2 | 0.8457 | 5581.7759 | 5.5818 |
3 | 0.8457 | 5569.4093 | 5.5694 |
4 | 0.8418 | 5366.4852 | 5.3665 |
5 | 0.8380 | 5421.3585 | 5.4214 |
6 | 0.8540 | 5353.6206 | 5.3536 |
7 | 0.8522 | 5341.7622 | 5.3418 |
8 | 0.8515 | 5483.7137 | 5.4837 |
9 | 0.8490 | 5376.1511 | 5.3762 |
10 | 0.8528 | 5607.5215 | 5.6075 |
平均值 | 0.8475 | 5487.5130 | 5.4875 |
?? 查看未完全识别正确的图像,可以发现错误来源大致可以归为三类:
4.3.2 实验组测试
?? 该组对随机生成的训练集样本增加 3.1.2 节所述的腐蚀降噪处理,如下所示:
?? 训练集单个batch含64个样本,总共训练 17304 批,训练时测试样本单个 batch 含 100 个样本,每迭代 100 次测试一次,总计测试 173 次,训练结束时准确率单次最高 0.9350 。
?? 训练过程的Loss、Accurancy与迭代次数变化情况如下所示:
?? 加载训练好的模型,进行 10 次测试,单批样本 1000 个,测试过程部分截图如下:
?? 测试结果列表如下:
测试次数 | 准确率 | 总耗时(ms) | 单张平均耗时(ms) |
---|---|---|---|
1 | 0.8740 | 42868.9543 | 42.8690 |
2 | 0.8930 | 42628.1756 | 42.6282 |
3 | 0.8995 | 42795.4068 | 42.7954 |
4 | 0.8965 | 42707.5214 | 42.7075 |
5 | 0.8965 | 42901.0147 | 42.9010 |
6 | 0.9093 | 42841.1872 | 42.8412 |
7 | 0.9107 | 42959.7112 | 42.9597 |
8 | 0.9038 | 42726.8357 | 42.7268 |
9 | 0.9025 | 42817.8351 | 42.8178 |
10 | 0.9070 | 42734.0121 | 42.7340 |
平均值 | 0.8993 | 42798.0700 | 42.7981 |
?? 查看未完全识别正确的图像,可以发现错误来源大致可以归为四类:
五、数据分析
5.1 损失(Loss)
??首先对于 Loss 的下降去情况,从 Fig.17 与 Fig.23 对比可以发现,两者的 Loss 随迭代次数增加的变化曲线都比较接近,而且从 Loss 下降的情况来说,在最开始很短的时间内 Loss 已经从一个较大的值下降到了一个较小的值,这说明了在这个时间内梯度下降得较快,因此可以知道这个时候的学习率是比较大的。而随着迭代次数的继续增加,Loss 逐渐趋近一个较为稳定的值,此时学习率应该是保持一个较低的值,以保证梯度下降得比较缓慢。这就从侧面反映了采用 Adam Optimizer 优化器优化算法能够有效地控制学习率大小,进而使得网络模型朝着一个相对正确的方向行进。
5.2 迭代次数与准确率(Accuracy)
?? 对比 Fig.18 和 Fig.24 ,两者均在迭代次数接近 2600 次时,准确率开始以一个较大的速度开始上升。而从训练数据来说,对照组总计训练了 22001 批次,平均准确率为 0.8475,而实验组总计训练 17304 批次,平均准确率为 0.8993。从训练样本数量上来说,实验组所需训练样本在达到同样准确率的前提下,平均准确率更高。因此,可以说明在引入图像噪点腐蚀预处理的情况下,能够使得检验准确率提高。
5.3 耗时
?? 首先是训练耗时,实验组花了一整个晚上进行训练,在 GPU 加速的情况下,耗时达到接近 12 小时,而测试组只花了不到 2 小时;而对于测试时的识别时长,从实验数据可以看出,实验组平均耗时约为测试组的 7.8 倍。从耗时结果来说,测试组以压倒性的优势战胜实验组。实际上,实验组多耗费的时间几乎全花费在图像预处理中对噪点进行腐蚀预处理上。在算法编写过程中,对于该算法所带来的时间花费其实是考虑到的,并且在尝试的时候,实际上测试过腐蚀核不同的移动步长对图像降噪的效果,很遗憾试过几种方案后最终还是只能采用步长为1的方案,而这势必就引入了大量矩阵运算,最终拖慢模型训练和测试的进度。
5.4 识别效果
?? 从最终的识别结果来看,不论是对照组还是实验组,都无法解决字符粘连、大小写误判以及区分形态接近的字符这三种问题。其实,对于人眼来说,很多时候都不能很好的完成这样的识别工作。因此,在现实情况中,各大平台大多都避免了这类极易混淆的验证码生成,并且还设定了人性化的验证码刷新功能,降低用户使用的困难程度。
六、总结与展望
?? 在这个项目中,完成了对于多字符类型验证码的基于卷积神经网络的模型搭建、训练和测试。在对项目开始编程实现之前,事先又花了一个下午的时间重新学了一下 CNN 相关的概念,但是当真正开始动手编程时,才发现没有自己想象的那么轻松,很多东西纸上谈兵是真的没有自己实实在在的动手去实现来得真切的,因此在编码过程中,又不断翻阅了大量的博客资料和文献。下面谈谈自己在这个项目中的学习总结和展望。
6.1 总结
?? 在学习过程中,产生了比较多的疑虑,这里也适当地总结一些:
- 对于输入图像来说,是否使用彩色图(灰度图)相较于二值图一定就更好?
?? 这个问题我与同学和老师私下也讨论过。首先从信息量上来说,彩色图(灰度图)相较于二值图来说,包含的信息是明显是多得多的。但是信息量大一定就更好吗?这还得分情景。对于像 CIFAR 这类用于图像分类的数据集来说,很明显只通过二值图我们是不能获取到足够的特征去完成分类任务的。对应地,对于 MNIST 这类用于字符分类的数据集来说,由于其图像本身色彩变化不明显,很多时候我们只需要一个轮廓就能够很好地完成分类任务,类似的还有本项目所用的验证码数据集(经过二值化处理)以及老师提到的数码管图像数据集。
?? 除此之外,从程序计算的效率来说,如果采用二值化图像,由于其图像本身具有含较多的 0 像素值的特点,无疑也会在一定程度上加快模型训练的速度。
-
多类别分类(Multiclass classification)和多标签分类(Multilabel classification)的区别?
??举个例子来说,假如一个笼子里装了很多动物,现在随机抓一只出来,那么多类别分类神经网络要完成的任务就是分辨这只动物是什么,是属于鸡?兔子?还是其他。但是如果现在把整个笼子拿给神经网络识别呢?可能这个时候它就会满脸都是 ??? 了。多标签分类神经网络就是解决如何在一整个笼子中为每一只动物都打上标签,标记这里面有鸡、兔子或者其他动物。
??那么对于本项目所涉及的分类任务就属于多标签分类,因为我们的任务是从一张图片中识别出有哪几个字符。这一点从输出层的输出向量长度也可以看出,我们并没有分出 64x64x64x64 个类别,而只是输出了每个字符的标签预测值。 -
激励函数 Relu(Rectified Linear Units)
??我们知道,当我们在认真做一件事的时候,经常会忽略其他不相干的事物,这可以被称为信息的选择性接收。从微观角度来说,完成这样的一项任务,是大脑中的神经元对输入信号做出的选择性响应,这被称为神经元工作的稀疏性。但是如何让我们的人工神经网络也具有这样的优点呢?Relu函数便是一个例子。从 Fig.28来看,Relu 函数的特别之处它存在一个死区特性,对于信号强度小于一定值的输入,它的输出直接置 0,而当信号强度足够大时,它就直接将该信号不加改变地进行输出。这样的方法可以帮助我们的人工神经网络在滤除微小噪声的同时还不改变有用信息强度,进一步提高了特征的鲁棒性。
-
CNN 最后的全连接层的意义及层数选择问题
??对于全连接层的意义,这个问题在 2.1 节对卷积神经网络相关原理进行叙述的时候已经提到过了,简单总结一下就是全连接层接受了来自于卷积层降维后的特征,并将这些特征向样本标记空间映射。这样说的话,对于卷积层之后的分类问题,我们甚至可以不用神经网络,直接用支持向量机也应该是能够完成分类任务的,不过这样的话卷积神经网络就不是卷积神经网络了,应该被称为卷积支持向量机。
??对于全连接层的选择来说,我觉得可以这样解释:特征分类的问题就好比散点拟合问题一样,我们可以用一条直线拟合一堆散点,而为了追求更好的拟合度,我们还可以选择二次函数、三次函数甚至更高阶的函数,但是随着阶数的增大,我们所需要求解的系数就更多,计算的时间和难度也相应增加。同样地,全连接层的层数就好比我们的函数阶次,层数越多,我们对特征的分类就更加细致,最后得到的分类结果也会更加准确,但是我们需要求解的 w 和 b 的个数将会快速增加,这也就是为什么单纯的全连接网络使用的频率并不高的原因了。
??本项目中采用了两层全连接层,各层作用可以这样理解:第一层全连接层将前层卷积层提取出的图像特征进行特征分类,而第二层,也就是最后的输出层,则是在前层全连接层对特征分类的基础上,对不同特征视最终的标签分类施以不同的权重,算出最终的 predict 值,以便我们从中选取最大的 predict 值作为最终标签预测结果的标准。
??这么理解的话,其实我们最后也可以只用一层全连接层直接输出(这里要注意不是直接将两层合并了,因为中间还有非线性的Relu激活函数),只不过最终的分类效果可能不会更好。
??另外,在学习过程中,也发现现有研究中甚至有直接利用卷积层输出进行分类的。 -
固定学习率与自适应学习率
??我们知道,学习率是梯度下降中的 (η) 参数,它影响了梯度下降的速度快慢。
??固定学习率一般很少使用,原因在于要想模型正确地收敛,找到一个合适的固定学习率是不容易的。学习率过大会导致梯度下降过快甚至出现过冲的现象,而学习率过小,会导致收敛速度极度缓慢,甚至会囤于某一局部极小值不能挣脱。下面这张图很好地解释了这个问题:
??既然固定学习率不能很好地解决问题,我们自然而然的就想到了自适应学习率,这和我们做图像处理时选用自适应阈值道理是一样的,因为我们都想要找到一个鲁棒性更好的算法。现有的优化算法有很多,比如 AdaGrad 、RMSProp、Adam 等等。除了利用现有的优化器之外,我们还可以自定义一些,比如让学习率以指数下降、分段下降、多项式下降等等。在实验时,我也尝试过自定义方案,不过遗憾的是不管怎么调整,都不能使最终的训练结果收敛,因此最终还是采用了 tensorflow 中现成的 Adam 优化器优化算法。
??另外,还可以将优化器与自定义方案结合。比如在这篇论文作者提到,他采取的方案是每训练 1000 次,学习率下降为前一次的 (frac{1}{3}),同时采用 Adam 作为优化器。其实这段话是具有迷惑性的。我们知道 Adam 本就是用于自适应学习率的,也就是说,学习率在训练过程中会不断变化,而作者又提到每 1000 次就降低学习率,这很容易让人误认为第二次的人工操作是没意义的。事实上,我对这一方案进行了也进行了复现,很遗憾的是最后结果依旧是不收敛。后来就去请教老师,老师给出的解释也很合理:很多时候,优化器给出的解决方案并不是最优的,我们往往需要在优化器的基础上再人工施加干扰,进一步调整优化器得到的结果,而这对于某些特定的情形是具备合理性和可行性的。
??除了以上的问题之外,还有很多细枝末节的问题,这里不再一一阐述了。
6.2 展望
??对比文献中高达 99% 的训练结果,无疑本项目的成果是不具备任何优势的。改进的地方可以有如下方面:
- 训练数据集的处理
??我们从实验组的结果可以看出,虽然实验组处理时间略长,但是 40ms 一张的处理速度对于普通应用是足够了,毕竟还不到眨眼的时间。并且,本项目中的图像处理还仅仅是消除了部分噪点的影响,而干扰线是没有做处理的,因此可以从处理干扰的角度进行改进。
??实验中对于粘连字符是没有做任何处理的,而训练结果也表示本项目的卷积神经网络不具备处理这种情况的能力。因此,另外一个改进方案就是可以将数据集中的粘连字符设计相关算法进行分割调整之后再输入网络训练。在文献(^{[7]})中也提出了较好的解决方案。
-
网络结构的调整
??本项目中采用的是 3 个卷积池化层串接 2 个全连接层的方案,但并不是说这种方案一定就好,也许适当地增减网络层数和各层滤波核数会获得更好的效果 -
进一步优化网络的想法
??我们知道,生活中的验证码由于设计或者显示问题通常都具有不同尺寸,而对于一般的 CNN 网络,都要求输入数据是规格化的,也就是各个样本的尺寸都需要保持相同,这样导致的结果是,我们如果输入任何尺寸的图片,必须经过裁剪或者缩放来适应我们的网络尺寸要求,而这样的后果是要么就丢失了图像信息,要么就是扭曲了图像信息,这些都是不利于网络的训练和识别的。
??这一点其实不是卷积池化层要求的,而是全连接层必须要求的,因为对于紧跟在卷积池化层之后的全连接层来说,它的卷积核是要与前层输出的尺寸保持一致的,而卷积核的定义是我们在定义网络计算图时必须提前确定的。所以
??学术界对于这个问题,早在2015年就提出了解决方案(^{[9]}),那就是在卷积池化层与全连接层之间加入一个空间金字塔池化层(Spatial Pyramid Pooling, SPP),以使得在不改变输入图像尺寸的基础上从卷积层获得固定长度的输出供全连接层使用。
??因此进一步的优化可以考虑采纳这个方案。
七、参考文献
[1]李成建,李富成,刘建芳.基于卷积神经网络的数字验证码识别研究[J].电子设计工程,2019,27(17):107-111. DOI:10.3969/j.issn.1674-6236.2019.17.024.
[2]晋大鹏,张天心,刘涛.基于Python和CNN的验证码识别[J].软件工程,2019,22(6):1-4. DOI:10.19644/j.cnki.issn2096-1472.2019.06.001.
[3]秦波,顾乃杰,张孝慈, 等.基于卷积神经网络的图像验证码识别[J].计算机系统应用,2018,27(11):142-148. DOI:10.15888/j.cnki.csa.006648.
[4]张苏沛,刘军,肖澳文, 等.基于卷积神经网络的验证码识别[J].武汉工程大学学报,2019,41(1):89-92. DOI:10.3969/j.issn.1674-2869.2019.01.015.
[5]徐星,宋小鹏,杜春晖.基于深度学习的验证码图像识别[J].测试技术学报,2019,33(2):138-142. DOI:10.3969/j.issn.1671-7449.2019.02.009.
[6]刘欢,邵蔚元,郭跃飞.卷积神经网络在验证码识别上的应用与研究[J].计算机工程与应用,2016,52(18):1-7. DOI:10.3778/j.issn.1002-8331.1603-0181.
[7]李兴国,高炜.基于滴水算法的验证码中粘连字符分割方法[J].计算机工程与应用,2014,(1):163-166. DOI:10.3778/j.issn.1002-8331.1208-0310.
[8]王璐,张荣,尹东, 等.粘连字符的图片验证码识别[J].计算机工程与应用,2011,47(28):150-153. DOI:10.3778/j.issn.1002-8331.2011.28.041.
[9]He, Kaiming,Zhang, Xiangyu,Ren, Shaoqing, et al.Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition[J].IEEE Transactions on Pattern Analysis and Machine Intelligence,2015,37(9):1904-1916.
八、网络资料
[1] 基于卷积神经网络的验证码识别
[2] 深度学习之卷积神经网络(CNN)的应用-验证码的生成与识别
[4] 利用captcha生成随机验证码
[5] 神经网络的数据预处理
[7] 验证码识别技术
[8] RCNN学习笔记
[10] 3D Visualization of a Convolutional Neural Network
[11] 卷积神经网络CNN总结
[12] 卷积神经网络(CNN)前向传播算法
[13] 卷积神经网络(CNN)反向传播算法
[14] 什么是梯度下降法?
[15] 卷积神经网络的激活函数
[16] 基于CNN的四位数字验证码识别
[17] 卷积神经网络实现字符型验证码的破解
[18] SPP-Net论文详解
[19] 谈谈Tensorflow的dropout
[20] tensorflow 实现端到端的OCR:二代身份证号识别
[21] 神经网络权值为什么不能初始化为零
[21] 神经网络权重初始化问题
[23] 全连接层的作用是什么
[24] CNN学习笔记:全连接层
[26] CNN卷积层、全连接层的参数量、计算量
[27] 全连接层计算分解
[29] TensorFlow 官方文档中文版
[30] Tensorboard【上】 - Tensorflow入门教程
[31] CNN训练MNIST数据集及tensorboard详解
[32] 论文中绘制神经网络工具汇总
[33] CNN可视化
[34] NN SVG
[35] 主成分分析(PCA)原理详解
[36] 一文搞懂交叉熵在机器学习中的使用
[37] 二分类、多分类与多标签问题的区别
[38] Tensorflow实现各种学习率衰减
[39] TensorFlow可变学习率及不同初始学习率对网络影响的比较
[40] Adam优化算法
以上是关于基于卷积神经网络的多字符类型验证码识别的主要内容,如果未能解决你的问题,请参考以下文章