科 毕 业 设 计(论 文)学院(部) 电子信息学院 题 目 基于深度学习的验证码识别
方法设计与实现 年 级 2014 专业 电子信息工程 班 级 14电信
学号 **********
姓 名 温美松 指导老师 黄鹤 职称
副教授 论文提交日期
2018年5月
本
目录
中文摘要 ................................................. - 1 - Abstract ................................................. - 2 - 第一章 绪论 .............................................. - 4 - 1.1 课题研究背景及意义 ................................ - 4 - 1.2 国内外研究现状 .................................... - 5 - 1.3 研究内容 .......................................... - 6 - 1.4 论文结构 .......................................... - 6 - 第二章 深度学习的基本理论 ................................ - 8 - 2.1 神经元的数学模型 .................................. - 8 - 2.2 多层前向神经网络 .................................. - 9 - 2.3深度神经网络 ..................................... - 10 - 2.4 神经网络的学习方式 ............................... - 11 - 第三章 验证码图像处理技术 ............................... - 12 - 3.1 图像预处理 ....................................... - 12 - 3.2 字符定位和分割 ................................... - 13 - 第四章 卷积神经网络的设计与实现 ......................... - 16 - 4.1 网络结构 ......................................... - 16 - 4.2 网络初始化 ....................................... - 19 - 4.3 误差反向传播 ..................................... - 21 - 4.3.1 全连接层的反向传播 .......................... - 22 - 4.3.2 池化层的反向传播 ............................ - 23 - 4.3.3卷积层的反向传播 ............................ - 24 -
第五章 网络性能分析 ..................................... - 25 -
5.1 参数的选择 ....................................... - 25 - 5.2 识别结果 ......................................... - 25 - 5.3 隐层神经元数量对网络性能的影响 ................... - 26 - 5.4 学习率对网络性能的影响 ........................... - 28 - 第六章 总结 ............................................. - 30 - 6.1 工作总结 ......................................... - 30 -
6.2 不足与展望 ....................................... - 30 - 参考文献 ................................................ - 32 - 致谢 .................................................... - 35 -
苏州大学本科生毕业设计(论文)
中文摘要
验证码是一个系统区分人类与非人类行为的有效方式。验证码识别技术能够使计算机程序输入正确的验证码,伪装成人类用户进入目标系统。另一方面,系统方面需要考虑破解验证码识别技术,修补验证方式的可能漏洞,使之能够更有效地区分人类与计算机的行为。深度学习能够使计算机更好地处理复杂的输入,因此能够识别更为复杂的验证码。深度学习是人工智能的一个重要分支,对于识别验证码图像,相对一些其他的学习算法,深度学习在同样的计算资源的条件下,具有更为优秀的性能,因此在处理同样的问题时深度学习能够节省一定的计算资源。
本课题主要讨论了基于深度学习的验证码识别方法设计与实现。具体地,第一步采集验证码图像。这些验证码图像来源有两种:一是通过编程仿照常见的验证码图像生成数据集;二是从网站上下载验证码图像保存成数据集。第二步对验证码数据集进行去噪、定位等预处理,再使用垂直投影法进行分割,将分割出来的字符保存为学习样本。第三步构建卷积神经网络,使用采集的部分验证码图片对网络进行训练,调整参数。最后一步使用剩余的验证码图像对训练好的网络测试,整理测试结果,统计正确率,分析不同参数对神经网络性能的影响。
经过测试,本论文设计的卷积神经网络基本能够成功地识别验证码图像,对仅包含数字的验证码图像识别效果较好,正确率达99.28%。
关键词:深度学习, 卷积神经网络, 验证码识别, 图像处理
- 1 -
苏州大学本科生毕业设计(论文)
Abstract
The verification code is an effective way to distinguish human or non-human behavior. The verification code recognition technology enables the computer program to input the correct verification code, disguised as a human user to enter the target system. On the other hand, the system needs to consider cracking the verification code recognition technology, repair the possible holes in the verification methods, so that it can more effectively distinguish the behavior of human and computer. Deep learning enables computers to process complex inputs better, and therefore to recognize more complex verification codes. It is an important branch of artificial intelligence. For the recognition of verification code images, compared with some other learning algorithms, deep learning in the same condition of computing resources, has better performance. Therefore, deep learning can save certain computing resources when dealing with the same problems than other general algorithms.
This paper mainly discusses the design and implementation of verification code recognition method based on deep learning. Specifically, the first step is to capture the images of the verification code. There are two sources of these CAPTC-code images: one is to generate by programming to emulate common CAPTC-code images; the other is to download the CAPTC-code images from websites and save them into datasets. The second step is to pre-process the data set of verification code such as de-noising, locating, and then using vertical projection method to segment the characters and save the characters as training samples. The third step is to construct the convolutional neural network and to train the network using some pictures of the CAPTCA to adjust the parameters. The last step is to use the rest of the verification code images to test the network. And then collate the test results, count the correct rate and analyz the effect of different parameters on the performance of neural network.
After testing, the convolutional neural network designed in this paper can recognize the image of verification code successfully, and it is better to recognize the image which only contain numbers, the correct rate is 99.28%.
- 2 -
苏州大学本科生毕业设计(论文)
Keywords : Deep Learning, Convolutional Neural Network, Verification Code
Identification, Image Processing
- 3 -
苏州大学本科生毕业设计(论文)
第一章 绪论
人工智能指的是模仿生物神经学,构建神经元的数学模型,使其能对复杂的信息进行处理。自从西班牙解剖学家Cajal在19世纪末创立神经元学说之后,神经元的一些生物学特征和相关的部分电学性质相继被发现。1943年,神经元的M-P模型被首次提出,创建该模型的是来自美国的心理学家McCulloch以及另一位数学家Pitts。来自加拿大的神经心理学家Hebb在1949年提出了“Hebb法则”,他认为学习现象的发生在于神经元突触的产生和变化。来自美国的心理学家Rosenblatt结合了以上三人的理论,首次用精确的数学算法来定义神经网络,提出了“感知机”模型。
神经网络的基础就是感知机。一般的神经网络也叫多层感知机,分为输入层、隐藏层和输出层,而具有多个隐藏层的神经网络就是深度神经网络。深度学习就是运用深度神经网络,模仿人脑对声音、图像等数据进行解释的过程,能够很好地将复杂多变的输入映射为具体输出,具有从少量样本中学习集中特征的能力。
1.1 课题研究背景及意义
深度学习的应用领域有很多,其中之一就是验证码识别。
验证码是一个系统区分人类与非人类的有效方式。验证码识别技术能够使计算机程序输入正确的验证码,伪装成人类用户进入目标系统。另一方面,系统方面需要先了解然后破解验证码识别技术,修补自身验证码的可能漏洞,使之能够更有效地区分人类与计算机的行为。随着互联网技术的发展,人们在使用互联网的同时越来越注重验证码的有效保护,希望网络的能够做到人类能识别而拦截所有机器程序的程度。
当遇到黑客对网站发起攻击的时候,验证码就是网站安全的第一道防线[21,27],因此针对验证码识别的研究的实践意义不容小觑。我们可以通过研究验证码的识别技术,从根本上了解验证码的识别细节,从而做出针对性措施,加强验证码的保护能力,使验证码能够继续实现本身的价值。
深度学习的初衷就是为了让计算机在处理某些问题时,能够拥有近似于人类的处理能力,这与验证码存在的意义是相对立的。验证码不希望机器能够像人类一样识别图像中的字符,而深度学习则努力使计算机能够尽可能地接近甚至超越人类。这一点一般的机器学习手段也能够实现,但是深度学习的优势在于能够将目标的特征逐级提
- 4 -
苏州大学本科生毕业设计(论文)
取,比如我们学习汉字,先从基本的横、竖、撇、捺开始,最后将这些基本的特征进行组合,形成目标的完整特征,据此能够进行学习将目标分类或者预测。
1.2 国内外研究现状
早在1986年,Rumelhar、Hinton等人就初步将反向传播算法(BP,Back Propagation)应用于神经网络的学习之中[1],使神经网络的学习过程变得简单可行。但是,第一因为训练数据集规模太小,第二由于计算资源有限,即使训练一个比较简单的网络都可能需要非常长的时间。与其它的机器学习模型相比较,当时的BP网络模型在正确率上并没有明显优势,更多的学者普遍青睐其他的浅层的机器学习模型,比如支持向量机模型、Boosting模型等。
直到19年,LeCun根据误差的反向传播算法,成功地将神经网络应用于识别美国邮政服务提供的手写邮政编码数字[2]。根据这一成果,并结合Fukishima在1980年提出的关于卷积(Convolution)、池化(Pooling)的概念(当时还不称为卷积和池化)[3],1998年LeCun提出了LeNet-5网络模型[4]。LeNet-5具有多层神经元,使用合适的梯度学习方法和反向传播算法,能够对图像进行特征的逐级提取,在针对手写字母的识别中取得了非常好的效果,是深度学习史上第一个可称为完善的卷积神经网络(CNN,Convolutional Neural Networks)。至此,人们对卷积神经网络的研究步入了第一次高潮时期。
但是在之后近十年的时间里,有关卷积神经网络的研究渐渐陷入泥沼,其中的主要原因分为两点:第一是当时的人们发现深度神经网络在根据BP算法进行训练时所需的计算资源非常多,仅仅凭借当时的硬件方面的研究水平几乎不可能实现那种大规模的计算;第二是包括支持向量机(SVM,Support Vector Machine)在内的许多浅层机器学习算法也渐渐开始崭露头角,人们投入到卷积神经网络中的研究热情和精力渐渐稀少。一直到2006年Hinton指出“多隐层神经网络具有更为优异的特征学习能力,并且其在训练上的复杂度可以通过逐层初始化来有效缓解”[5,10],有关深度学习和卷积神经网络的研究才再度为人们所关注,深度学习的研究再一次涌起热潮。
2012年,Hinton的学生Alex等人在ImageNet竞赛上提出了AlexNet[24]。这是在LeNet-5诞生之后深度学习的又一大进步。AlexNet较LeNet-5有许多新的思想,包括但不局限于数据增强、局部归一化、激活函数采用ReLU、DropOut方法等[6,10,19,25],
- 5 -
苏州大学本科生毕业设计(论文)
在ImageNet竞赛中以高出第二名近10%正确率的优异性能奠定了CNN在深度学习中的重要地位[22]。
继Alex之后,关于CNN的研究迭出不穷,成果丰硕,其中较为经典的模型之一是2014年中文大学教授汤晓鸥、王晓刚及其研究团队提出的DeepID深度学习模型,在LFW (Labeled Faces in the Wild)数据库上获得了99.15%的识别率,这个结果超过了人眼的识别效果(实验表明,如果仅仅给出人脸中心区域,人的肉眼在LFW上的识别率为97.53%)[18]。汤晓鸥及其团队于2014年连续发表了文三篇文献,对深度学习进行了系统阐述的同时,尝试从理论上解释CNN模型强大的特征提取能力,这也是人们首次试图去研究CNN的本质属性,标志着对CNN的研究步入新的时代
[7,8,9]
。
1.3 研究内容
本课题主要讨论基于深度学习的验证码识别方法设计与实现,在深度学习的理论基础上,设计了一个卷积神经网络,对几种常见的验证码图像进行识别,通过调整神经网络的参数来分析讨论不同的识别结果。这些验证码图像部分来自计算机生成与网站上类似的验证码,部分来自人工在网站上的采集。
在图像识别之前首先对验证码样本进行二值化和去噪处理,并采用垂直投影法进行图像字符的分割,将分割之后的字符按顺序保存,作为卷积神经网络的输入数据。从所有验证码样本中选取部分作为网络的学习样本,对网络进行训练,部分作为测试样本,用于检测训练后的网络的性能。
最后通过调整网络的参数,分析了总结部分参数对网络性能的影响。
1.4 论文结构
本论文第一章是绪论,详述了深度学习的研究背景、验证码识别的研究意义和国内外的深度学习的发展现状,介绍了主要的工作情况和论文的结构。
第二章介绍了深度学习的一些基本理论内容,从神经元的M-P模型,到通用的神经网络模型,再到深度神经网络的一般模型,都做了具体的介绍。
第三章介绍了本课题所用到的图像处理技术,包括图像去噪、目标定位与图像分
- 6 -
苏州大学本科生毕业设计(论文)
割,图像预处理是保障网络识别率的重要前提之一。
第四章是关于如何用Matlab语言构建深度神经网络的内容。涉及到采用的卷积神经网络的基本结构、数据的前向传播、误差的反向传播、网络的权值参数更新等内容。
第五章描述了运用第四章构建的网络进行训练学习之后,对实验结果的分析讨论。通过观察实验结果,分析并修改可能对其产生影响的参数,尝试进一步优化网络。
第六章是总结和展望。
- 7 -
苏州大学本科生毕业设计(论文)
第二章 深度学习的基本理论
人工神经网络是计算机对生物神经网络的一种模拟和近似,由大量的人工神经元(感知器)通过相互连接,构成自适应的非线性动态网络。神经网络的每一层都由大量的神经元节点组成,节点之间通过权值参数连接,成功训练好的神经网络能够处理复杂的非线性问题,而神经网络学习的本质就是权值和偏置量的自适应调整。
2.1 神经元的数学模型
依据人体神经元的生物结构,来自美国的心理学家McCulloch和另一位数学家Pitts于1943年提出了神经单元的数学模型:
x1bw1x2w2...w3x3
fy图2-1 神经元的M-P模型
根据图2-1可以得到神经元的输出为:
yf(xiwib) ( 2.1)i1n其中,x1、x2...xn是输入的n个数据量,w1、w2...wn是神经元的连接量,b是偏置量,
y为神经元的输出。f是激活函数,它的作用是加入非线性因素,在一定程度上能够用来解决线性模型表达、分类能力不足的问题[12,13]。
使用较为广泛的激活函数有sigmoid函数:
1y (2.2)x1e- 8 -
苏州大学本科生毕业设计(论文)
tanh函数:
1e2xy (2.3)2x1e
relu函数:
x,x0y (2.4)0,x0
以及softmax函数:
siTexiej1n (2.5)xj这里xi表示输入向量Xx1,x2,...xn中的第i个数据,输出si代表xi的指数占所有输入数据的指数的和的概率。
2.2 多层前向神经网络
神经网络是大量神经元组成的网络,处于不同层的神经元作用不同,它们彼此合作,组成了能够对复杂的输入数据进行解释的网络。典型的前向神经网络结构如图2-2所示[32]。
输入层隐藏层输出层x1x2.........y1y2xn图2-2 前向神经网络模型
- 9 -
yt苏州大学本科生毕业设计(论文)
根据图2-2容易得到输入-输出关系为
1THf(XWB1) (2.6)T2Yf(HWB2)其中,Xx1,x2,...xn是输入向量,W1{wij}kn是输入层与隐藏层的全连接权值矩
T阵,Hhi,h2,...hk是隐藏层向下的输出值,W2{wij}tk是隐藏层与输出层之间的
T全连接权值矩阵,B1b1,b2,...bk为隐藏层神经元H对应的偏置向量,
TTB2b1,b2,...bt是输出层神经元Y对应的偏置向量,Y(y1,y2,...yt)T是网络最终的
输出向量。
网络的输出矢量Y一般不是最终的结果,比如用作分类的网络,输出层采用的激活函数一般是softmax函数,Y矢量中的每一个分量yi的值就代表了网络“认为”输入属于第i类的概率。通常需要加一个判断函数得到网络的分类结果:
iargmax{yi}网络将概率最大的类别作为分类的结果。
2.3深度神经网络
所谓“深度”神经网络是相对于一般的神经网络而言的,通常将具有两个及两个以上的隐藏层的神经网络称为深度神经网络,与此对应,只有一个隐藏层的神经网络就是“浅度”神经网络。一般的深度神经网络结构如图2-3所示。
输入层隐藏层隐藏层隐藏层输出层..................图2-3 通用深度神经网络结构
- 10 -
苏州大学本科生毕业设计(论文)
一般的浅度神经网络的局限性,是在样本有限和计算资源有限的情况下,对复杂函数的映射能力有限,针对复杂的分类问题,这类神经网络的泛化能力受到了一定制约。在这样的前提下,若要使浅度神经网络达到深度神经网络的效果,所需的神经元数量和权值矩阵的尺寸,是非常惊人的。
深度学习可通过学习一种深层的非线性的网络结构,实现对复杂函数的近似逼近,并具备从少数样本里面集中捕获数据的本质特征的强大能力。多个隐层的神经网络可以用较少的参数来表示较为复杂的函数,比浅层的神经网络具有更优异的映射能力,能够对输入信息的特征进行更本质的刻画,这对数据的特征的收集、归纳与分类是更为有利的。
2.4 神经网络的学习方式
深度神经网络的学习方式有多种,较为常见的有监督学习、无监督学习两种。 有监督学习(Supervised Learning)要求神经网络学习的时候,人为地提供监督信号,或者说期望输出,称为“标签”。网络将根据输入,通过自身权值传递信号,产生最终输出,与期望的输出进行比较从而计算误差,再根据误差来调整整个网络的权值和偏置参数,最终达到与监督信号非常接近的程度。有监督学习方式通常用于样本标签已知的分类模式。
无监督学习(Unsupervised Learning)不需要借助外部的监督信号,能够在没有标签的条件下对原始的数据资料进行分类,解析数据的内部结构。不同于有监督学习网络,无监督学习网络在学习时并不知道它的分类结果正确与否。无监督学习的特点是仅仅对网络本身提供输入范例,而网络本身会自主地从这些范例中找出数据潜在的分类规则。当学习完成后,也能够通过新的学习和测试将之应用到新的样本中。
- 11 -
苏州大学本科生毕业设计(论文)
第三章 验证码图像处理技术
要使深度神经网络能够学习识别验证码,有两种可行性方案:一是端到端的识别,不对验证码进行分割预处理,而是直接通过神经网络得到输出[11,26,33]。二是分割识别,对验证码进行预处理和分割之后,按分割顺序将字符通过神经网络,并将得到的输出按顺序排列,得到网络对整张验证码图像的识别结果。
端到端的识别,涉及到的多标签分类问题颇为复杂[33]。限于个人能力与时间问题,本设计采用分割识别的方案。
3.1 图像预处理
图3-1 图像的灰度化和二值化
由于待识别的验证码图像是彩色的图像,而验证码的识别,依据的是其字符形状而非字符色彩,所以二值化操作不会使需要的数据信息丢失。对输入的验证码样本,经过灰度化、二值化处理之后,能够降低图像数据的维数,有效降低数据处理的复杂度[31]。图3-1为初始的验证码样本图像及其经过二值化之后的图像。
二值化之后的验证码图像没有了色彩数据的干扰,但是还有明显的噪点的存在,这些噪点无疑会影响到网络的识别效果,更直接的是影响到之后的分割处理,所以在分割识别之前,还需要对验证码图像进行去噪处理。图3-2为去噪之后的效果。
经过二值化与去噪处理之后,验证码图像上少了许多干扰性数据,只保留待识别的字符和干净的背景,这能在很大程度上提升神经网络的识别效果。
- 12 -
苏州大学本科生毕业设计(论文)
图3-2 图像去噪
3.2 字符定位和分割
图3-3 目标定位
由于验证码图像中,字符的位置都是在图像内部,而边缘都是无用的背景信息,所以在进行字符分割之前,对字符图像进行目标定位,确定字符的位置,割舍可能会带来干扰的边缘信息,能够对提升最终的识别正确率有很大的帮助[14,28]。定位算法并不复杂,其核心是确定字符区域的边界,在边界处进行背景切割,保留字符目标。算法流程如下:
第一步:经过前面去噪预处理之后的图像通常只有目标区域和背景区域两部分,很容易检测到目标字符的左边界、右边界、上边界和下边界。
第二步:这四个边界包围起来的区域就是定位到的字符所在的区域,根据这四个
- 13 -
苏州大学本科生毕业设计(论文)
边界就能进行边缘切割,保留目标区域。图3-3是进行目标定位的示意图和结果。
图像预处理的最后一步是字符分割。
字符分割的算法有很多种,复杂程度不一,针对待识别的验证码图像,酌情选择合适的分割算法。就本课题处理的验证码图像而言,字符之间无粘连,采用垂直投影法是最简单有效的分割算法,对验证码图像进行垂直方向上的投影,将投影值最少的位置作为分割点对图像进行分割。
图3-4 垂直投影分割
图3-5 图像分割结果
图3-4所示为垂直投影算法分割的细节。算法流程如下:
- 14 -
苏州大学本科生毕业设计(论文)
首先将待分割图像进行垂直投影,统计投影的值。没有字符存在的地方,甚至有字符存在并且粘连,但是粘连比较少的区域,其投影值会明显比字符所在区域的投影小得多。
第二步寻找这些投影值小的位置,初步确定为选取分割的点。
第三步结合具体的验证码图像特征,去除部分不可能的分割点,在剩下的分割点中选取合适点,即可进行分割。
图3-5是图像分割前后的对比。为了与后面的卷积操作匹配,对分割之后的字符图像进行了边缘补零操作,避免在进行卷积时丢失字符的边缘特征。经统计,对采用的验证码样本进行使用垂直投影法分割的成功率是96.3%。
- 15 -
苏州大学本科生毕业设计(论文)
第四章 卷积神经网络的设计与实现
4.1 网络结构
与一般的深度神经网络的全连接不一样,卷积神经网络的层与层之间并不都是全连接,其前面几层采用局部连接方式进行数据特征的感受与提取,最后几层通过全连接将提取到的特征值映射为输出的分类结果[15,16,17,20]。
32285221451451010255322825输出层输入卷积层池化层卷积层池化层全连全连接层1接层2图4-1 卷积神经网络
图4-1所示为本课题所用的卷积神经网络的结构图。
网络第一层为输入层(Input Layer),输入层的输入为输入图像,输出也是输入图像,作用非常简单,是网络与外界的输入接口,将外界的输入图像传给后面的各层。
第二层是卷积层(Convolutional Layer),卷积核的大小为5×5,一个卷积层的细节如图4-2所示。
对于每个卷积核,设其25个权值参数分别为w1~w25,当其扫描到输入图像某个区域j时,该区域25个与卷积核权值对应位置的像素分别为x1~x25,卷积核对应的偏置参数为b,则会在输出图像上产生一个输出,设这个输出为yj,采用的激活函数为f,则有:
25yjf(wixib) ( 4.1)i1对输入图像而言,这样的卷积操作是逐个像素进行的。每扫描一个次,产生输出图像
- 16 -
苏州大学本科生毕业设计(论文)
中一个对应的像素点的值。由于边缘无法扫描,所以输入32×32的图像,经过5×5的卷积核扫描后,产生的输出图像尺寸为:
(32-5+1)×(32-5+1)=28×28
事实上,一个卷积核的本质是对输入的图像进行某个基本特征的提取。对于验证码字符而言,虽然字符是数字和字母,但基本特征和汉字类似,是横、竖、弯等笔画,所以需要多个卷积核对其进行多个基本特征的提取,因此得到的输出的图像又称为特征图。在此处,所选卷积核个数为6,对于英文字符和数字而言,六种笔画基本能描述一个字符。这6个卷积核参数并不相同,因此会向第三层池化层输出6个特征图。
图4-2 卷积操作示意图
第三层为池化层(Pooling Layer),也叫下采样层,池化层的计算与卷积层的计算基本类似:扫描输入图像的一个小区域,得到向下层输出的一个像素点的值。只不过池化层的卷积核作用是取扫描区域的最大值或者平均值等(最大池化、平均池化),并且其中的权值不由网络修改。
平均值池化(Mean Pooling)的示意图如图4-3所示:
图4-3 平均值池化示意图
在本课题所采取的平均值池化中,池化卷积核的尺寸为2×2,即输入图像中每2
- 17 -
苏州大学本科生毕业设计(论文)
×2的小区域中的像素值,被池化为输出图像的1个对应的像素值,所以池化卷积核的参数都是0.25。与第二层相似,设第j次扫描输入图像的小区域像素点为x1~x4,得到的对应的输出像素值为yj,则得到以下等式:
1yjxi ( 4.2)i14最大值池化(Max Pooling)示意图如图4-4所示:
4
图4-4 最大值池化示意图
设第j次扫描输入图像的小区域像素点为x1~x4,得到的对应的输出像素值为yj,得到最大值池化的输入、输出关系式为:
yjmax(xi|i1,2,3,4) (4.3)即在每扫描到的2×2的小区域中,保留像素值值最大的那个像素点作为下一层对应位置的像素值。
不管是平均值池化还是最大值池化,每次扫描的区域都是2×2,并且扫描的间隔是2,即扫描区域互不重叠。此外为了保证池化的像素点没有遗漏,要求输入图像长、宽能够被池化尺寸(扫描的小区域的尺寸)的长、宽整除。池化之后,图像的尺寸将大大减小,例如采用2×2的池化尺寸,得到的输出特征图将是输入图像的面积的四分之一,但关键信息依旧保留,这能够有效地节约大量的计算资源和计算时间,同时也降低了对网络的神经元数量、权值矩阵规模的要求。
在池化的时候,如果输出的是扫描区域的平均值,往往能保留整体数据的特征,而如果输出的是扫描区域的最大值,则能较好地保留数据纹理上的特征[23]。除了平均值池化和最大值池化之外,常用的池化模型还有随机池化(Stochastic Pooling)、重叠池化(Overlapping Pooling)、金字塔池化等(Spatial Pyramid Pooling)等。
网络的第四层与第二层一样,是卷积层,卷积核大小与也第二层一致。与第二层
- 18 -
苏州大学本科生毕业设计(论文)
不一样的是,第二层的输入图像为待识别的验证码字符,只需要卷积1张图像得到6张输出特征图,而第四层的输入是经过第三层池化层之后的6张14×14的特征图。前文提到过,图像卷积的操作实质上是特征的提取,这个在网络的第二层就可完成。第四层的卷积操作并非对第二层的重复,而是更进一步,对第二层提取到的基本笔画特征进行组合。
对特征的组合,有很多种方式。本课题采用的方式是全连接形式,即第三层输出的6张特征图作为第四层的输入,与6个不同的卷积核进行卷积,并将结果求和,得到第四层输出的1张特征图。为充分体现不同的基本特征的组合的结果,在本课题的网络中第四层将输出12张特征图。也就是说第四层卷积层拥有(6×12=)72个不同的卷积核,每个卷积核配备一个偏置量。
网络第五层与第三层一样,是池化层,目的同样是在保留关键信息的同时降低数据量,节省计算资源和计算时间。
网络的最后三层是全连接层与输出层。前面的卷积、池化操作,最终将提取出输入字符图像的特征,用这些作为特征值,相当于字符的唯一身份证号码,经过全连接层的计算能够的到最终的识别结果。
4.2 网络初始化
在网络前向传输的第一阶段,首先是初始化好所有的权值和偏置,才能根据输入图像得到分类结果。
在一般的网络中,通常使用均匀分布将权值矩阵初始化。均匀分布意味着每个权值矩阵的每个参数,都在一个范围内等概率取值。形式如下式:
wijrand(min,max) (4.4)rand是随机赋值函数,min和max分别是连接权值wij能取到的的最小值和最大值,通常这个范围是[-1,1]。可以用方差相乘的定理证明,采用这样的方式初始化的权值,将会导致网络的每层的方差依次以乘积的形式叠加,到最后输出层得到的结果方差将会很大或者很小。若每层的方差小于1,到最后的输出的方差将会很小,由于权值的更新依赖于输出层的均方误差,这会使得网络的调整非常缓慢。若每层的方差大于1,经多层传输之后输出层的方差将会非常大,这会使网络收敛速度更慢,甚至无法收敛。
- 19 -
苏州大学本科生毕业设计(论文)
因此本论文采用Xavier方法进行权值的初始化。
Xavier初始化是在均匀分布的基础上,对权值矩阵的最大值和最小值进行了公式化,从而尽量保证网络输出层的方差与输入层数据的方差基本一致,其初始化公式为:
66wrand(,) (4.5)nknk1nknk1kijk是第k层待初始化的权值参数,nk是第k层的参数个数,nk1是第k1层的参数个wij数。
4.3 前向传播
根据卷积网络的结构,设输入图像为X[xij]32,第二层的6个卷积核分别为
1261W1[wij]5,W2[wij]5,... ,W6[wij]5,输出的6个特征图分别为M1[mij]28,26M2[mij]28,... ,M6[mij]28,有:
Mpf(conv(X,Wp)B),p1,2,...6 (4.6)conv是卷积操作,B{bp|p1,2,...,6}是6个卷积核对应的偏置量,f为激活函数
sigmoid函数。
126设经第三层池化操作后输出的6张特征图为S1[sij... ,]14,S2[sij]14,S6[sij]14,16第四层的72个卷积核分别为K11~K16,... ,K12~K12,对应偏置为b1~b12,输出的12
张特征图为R1~R12,有:
Rpf(conv(St,Ktp)bp),p1,2,...12 (4.7)t11212设R1~R12经第五层池化层之后的输出为Z1[zij]5,Z2[zij]5,... ,Z12[zij]5,
6全连接层1表示为向量A1[ai2]n,这里n5512300是Z1~Z6的所有像素点个数,按顺序平拉成A1。全连接层2表示为向量A2[ai2]n,这里n是A2层的神经元数量,具体取值至今没有一个完全成立的理论来确定,只能根据经验公式
- 20 -
苏州大学本科生毕业设计(论文)
nn1n2a来确定[29]。n1表示上层A1层神经元数量,即300,n2表示下层即输出层神经元数量,为10,a是经验常数,一般取值为[0,10]。综上,A2层神经元数量初步取值为:
nn1n2a30010522设A1层和A2层之间的全连接权值矩阵为Wa[wij]22300,偏置量为Ba[bi]22,A2层和
TA2f(WaA1Ba) (4.8)TYf(WbA2Bb)输出层之间的全连接权值矩阵为Wb[wij]1022,偏置量为Bb[bi]10,由式(2.6)得:
TY[yi]10是网络的输出,据此可以得到卷积网络的分类结果。
4.3 误差反向传播
在有监督学习模式中,神经网络的权值,依赖的是最终输出的结果与给定的标签间的误差而进行更新。设网络最终输出为Y,给定的标签为Y0,则误差为:
eYY0 (4.9)i]10中,只有一个元素值为1,其余元素值为这里输出向量Y[yi]10和标签向量Y0[y00,值为1的元素所在的位置,就是这个样本所在的类别。比如对于10分类而言,
Y0[0 0 1 0...0]第三个元素为1,其余元素为0,代表这个样本是属于第三类的。
通常误差不会使用误差e来进行权值更新,而是使用均方误差:
121110i2i2Ee(YY0) (yy0) ( 4.10)222i1同时输入N个样本的时候,均方误差的表现形式为
1N121N12Eei(YiYi0) (4.11)Ni12Ni12这时候的E也称为损失函数,它表征着网络的输出与实际期望之间的偏离程度,而神
- 21 -
苏州大学本科生毕业设计(论文)
经网络最终的训练目标就是通过调整权值和偏置量,使网络的输出和期望尽可能一致,也就是使损失函数E达到最小值。
4.3.1 全连接层的反向传播
寻找损失函数E的最小值,可以通过计算其梯度来实现[30]。在梯度法中,梯度是使E增加的方向,其反方向就是E减小的方向。即权值W的调整为
EW (4.12)W其中是学习率,能够在一定程度上调节连接权值调整的幅度,在本网络中,是一个常量。 W 是误差E对权值矩阵W的偏导数,事实上,单独地计算每个权值分量和偏置量而进行调整,是不太可能的,更好的做法是以矩阵的形式计算每层的调整量,反向逐层调整,误差也随之逐层反向传导。
全连接层的权值更新步骤为:
1、设A1层和A2层之间的全连接权值矩阵为Wa[wij]22300,偏置量为Ba[bi]22,
A2层和输出层之间的全连接权值矩阵为Wb[wij]1022,偏置量为Bb[bi]10,输出层输
E出向量为Y,标签向量为Y0。由于激活函数采用sigmiod函数,其导数为:
f'(x)x(1x) (4.13)且根据式(4.8)、式(4.10)和式(4.13)有:
eY.*(1Y) (4.14)Bb点乘“.*”操作代表两个向量对应的元素相乘。残差:
ebe.* (4.15)Bb也称作输出层的灵敏度,表征了输出节点对总的误差产生的影响程度。
计算出输出层的灵敏度b后,全连接层其他的参数的调整都将依赖b的反向传播而进行,具体的传播可以由链式法则实现,最终得到全连接层的调整量为:
- 22 -
苏州大学本科生毕业设计(论文)
BbbTWAbb2 (4.15)TTBa(bWb).(A2.(1A2))WBATa1a
4.3.2 池化层的反向传播
池化层是卷积网络中不可导的一层,虽然池化层没有可供调整的参数,但是与池化层毗邻的卷积层需要调节权值和偏置量,故灵敏度需要传递给卷积层,需要先通过池化层。因为经过池化层的图像面积发生了变化,要使梯度能够继续反向传播至前面,则需要“上采样”。
设第n层为池化层,第n1层的灵敏度为n1,上采样操作将n1还原成第n层池化之前的尺寸,因为采用的池化尺寸是2×2,使用平均值池化,所以上采样的结果是每2×2的区域的灵敏度是一样的,是n1中对应位置的元素值。
设
则
n10.1 0.30.4 0.20.1 0.1 0.3 0.30.1 0.1 0.3 0.3n0.4 0.4 0.2 0.20.4 0.4 0.2 0.2
这样,梯度通过上采样传递到了池化层。
若采用的是最大值池化,则在池化的时候需要记录最大值在2×2区域中的位置,上采样之时其他位置补0。例如在前向传播时记录的位置为:
12 location1 4
- 23 -
苏州大学本科生毕业设计(论文)
那么n根据location记录的位置信息上采样的结果为:
0.1 0.3 00 0 0 0 0n10.4 0 0 00 0 0 0.2
4.3.3卷积层的反向传播
通过上采样求到的灵敏度,也就是采样层的上一层,卷积层的灵敏度n。设第kk1层为卷积层,其卷积核为Kik,对应的偏置量为bik,输入特征图为Mp,输出的特征
图为,有:
kk1Kikmrot180(Mm) (4.16)m1pkbik(m)u,v (4.17)m1u,vpEk(bm)u,vkbmu,v其中
是将偏置向量bik的每一元素求和,最后的结果作为误差对偏置的导数。
- 24 -
苏州大学本科生毕业设计(论文)
第五章 网络性能分析
5.1 参数的选择
根据第四章的内容,网络各参数的选择都有一定,最初设置的参数如表5-1所示:
表 5-1 网络的初始参数
参数 含义 K B 学习率 kmax 迭代 次数 10 nh W Bf 卷积核 卷积核 权值 Xavier 初始化 偏置 0 隐藏层 神经元数 22 全连接层 全连接层 权值 Xavier 初始化 偏置 0 初始值
1 在实际的使用中,卷积核的大小、池化核大小以及网络层数,都由经验公式大概确定,并根据最终网络的性能进行参数调整以确定合适的参数值。
5.2 识别结果
在5.1节选取的初始值条件下,使用学习样本对网络进行训练,第一次训练的样本是通过编程生成的验证码图像,训练之后,网络对这类验证码的识别正确率较高,为99.28%。图5-1所示是网络对这类验证码的分割结果和识别结果。
此时用另一个测试集去测试网络,正确率并不理想,仅仅为47.246%。这是由两个数据集的差异造成的,虽然都是数字字符,但是第一类数据集本身有倾斜,而第二类没有,此外两种验证码还有其他特征差异,因此网络即使对相同数字提取的特征,也不完全相同。
在初次学习之后由于网络正确率偏低,需要使用第二类数据集在第一次训练的基础上对网络使用相同的参数再重复训练一次,因为样本集发生了变化,需要使网络“熟悉”第二类验证码的字符特征。在第二次学习之后,网络对第二次验证码的识别率有很大的提升,达到96.8116%。
- 25 -
苏州大学本科生毕业设计(论文)
图5-1 对自生成验证码的识别样例
图5-2是网络对第二类验证码的分割结果和识别结果。
图5-2 对采集的验证码识别样例
5.3 隐层神经元数量对网络性能的影响
卷积神经网络实质上可以分为两部分,一是特征提取部分,这部分通过卷积和池化操作实现,另一部分是全连接部分,将提取到的特征值映射到输出层。整个网络中,对网络的最终性能有所影响的参数是比较多的,其中主要的参数之一就是全连接层当
- 26 -
苏州大学本科生毕业设计(论文)
中的隐藏层的神经元数量nh。
在4.3节中,nh的值是根据经验公式确认的,所谓经验公式是没有严格的理论论证,却能在某些场合使用并具有较好效果的公式,有可能会出现“此之蜜糖,彼之砒霜”的现象,在别的神经网络中适用的经验公式不一定能在本论文的网络中适用。考虑改变nh的值,来观察网络的性能变化,寻找使网络具有较优性能的参数值。
图5-3是修改nh的不同值来训练卷积神经网络,网络的正确率变化情况。图中横坐标是nh的不同取值,纵坐标是百分比显示的正确率。实线是使用编程生成的验证码样本集(第一类样本)对网络进行训练,使用来自网站的验证码样本集(第二类样本)对网络进行测试的正确率变化;虚线是使用第一类样本对网络训练之后,继续使用第二类样本对网络进行训练,再使用第二类样本对网络测试的正确率变化。
图5-3 隐层神经元数对网络正确率的影响
从图中可以看出,随着nh的值增大,网络在学习第一类样本之后,对第二类样本的识别率有所增加,在此基础上继续学习第二类样本,对第二类样本的识别正确率基本都会有很大提高,当nh9、nh12、nh22和nh72的时候,第二次学习的正确率最高,nh取到这些值的时候,第二次学习的正确率提高幅度也最为明显。当nh32的时候,第二次学习的正确率反而从第一次的66.3768%下降为.9275%。
- 27 -
苏州大学本科生毕业设计(论文)
5.4 学习率对网络性能的影响
除了隐藏层神经元,对网络性能有较大影响的是学习率。由第四章可知,网络的权值参数和偏置量的调整幅度,与学习率密切相关。若学习率较大,那么总误差E下降的速率就会比较快,但是可能会使权值参数和偏置量取不到最优解,而在最优解附近振荡,严重的时候甚至会跳过最优解,使网络发散。若学习率较小,网络收敛的精度会更高,但是由于每次调整的幅度不大,收敛速度将比较慢。
基于上一节的结论,取隐层神经元数量为nh22,其他参数参照5.1节不变,改变学习率,使用第一类验证码对网络进行训练,并用第二类验证码进行测试,统计正确率,结果如图5-4中的实线所示。在第一次训练的基础上使用第二类验证码对网络进行重复训练,再用第二类验证码对网络进行测试,结果如图5-4中的虚线所示。
图5-4 学习率对网络正确率的影响
从图5-4中可以发现,在这个神经网络中,基本上随着学习率从0.1增加到1,网络的两种正确率(实线代表经第一类样本训练之后对第二类样本的识别正确率,虚线代表在第一类样本训练之后继续用第二类样本训练,网络对第二类样本的识别率)都是上升的,只会在局部有所波动。
图5-5是不同的学习率对网络进行训练时网络的误差的收敛曲线的对比。
- 28 -
苏州大学本科生毕业设计(论文)
图5-5 收敛曲线在不同学习率下的变化
通过对比可以发现,随着学习率的取值变化,收敛曲线也会发生变化,但基本会集中在一定范围内,各收敛曲线的收敛速度相差并不多。不受影响的是曲线的收敛值。从图5-5中可以看出最终所有的收敛曲线几乎都收敛于同一阈值,这个值代表了网络经学习之后,网络的输出与给定标签的均方误差的总和。这个收敛值是0.4511。
- 29 -
苏州大学本科生毕业设计(论文)
第六章 总结
6.1 工作总结
自人工智能兴盛以来,关于深度学习的研究成果如浪花涌现,深度学习在人工智能中的地位也越来越重要。深度学习在对数据进行分类上的优越性能是普通网络无法比拟的,卷积神经网络也因众多研究成果而广受重视,自身也在图像处理领域有着得天独厚的优势。验证码字符的识别分类就是深度学习的一个经典应用。
本文在参考众多文献的基础上,深入理解深度学习和卷积网络基本理论,运用这些理论来构建卷积神经网络,解决验证码识别的问题。
验证码数据集来源有二:一为通过编写程序生成与常见验证码类似的验证码图像;二是到网站上进行人工采集。在使用卷积网络进行学习和测试之前,先对验证码数据集做预处理,预处理操作有四:一是二值化,降低数据的维度,很大程度上也减少了数据的复杂度;二是去噪,消除验证码图像中的噪点,能够使网络不受太多无用信息的干扰,提高识别正确率;三是字符定位,一定程度上较少原始图像边缘的无用背景信息对网络的干扰,提高识别正确率;四是字符分割,每次学习一个字符,一方面能够降低识别难度,另一方面也降低了对样本数量的要求。
本文最后对网络进行学习和测试,并分析了对网络性能影响较大的两个参数:全连接层隐层的神经元个数和学习率,通过分析这两个参数对网络收敛曲线和识别正确率的影响,能够为选取这两个参数的合适值提供方向,从而能够进一步地对网络进行优化。
6.2 不足与展望
本文采用的识别方法是图像分割之后再识别,这导致了最终的网络性能很大程度上依赖于图像预处理方法的有效性。当图像去噪效果较差、字符定位不准确、字符分割不准确时,用于网络学习的数据本身就是不稳定的,最终网络的识别正确率必然不会理想。最为理想的识别方式是端到端的识别,对验证码图像的预处理仅限于去噪等操作,不进行字符分割。中间过程的减少,将对网络最终性能的不良影响降到最低。但端到端的识别要求样本足够大,这对于人工采集样本而言又是非常大的工作量。如
- 30 -
苏州大学本科生毕业设计(论文)
何降低深度学习对样本的要求,是有待研究的一个问题。
此外,本文对卷积网络的构建部分依赖于已有的研究成果,部分依赖于经验公式。关于卷积核大小和隐藏层神经元个数的选取,迄今尚未有成功的理论指导,使网络最终的性能具备了不确定性,从而需要花费大量时间进行参数的调整测试来保证网络具有较好的性能,导致了神经网络参数的人工调节成为神经网络设计与实现中最耗时的步骤。如何能更快速地确定网络的最优参数,避免神经网络的调参陷入“农民工”境地,这也是深度学习将来的研究方向之一。
- 31 -
苏州大学本科生毕业设计(论文)
参考文献
[1] Rumelhart D E, Hinton G E, Williams R J. Learning Internal Representations by Error
Propagation[M]. Neurocomputing: foundations of research, 1986: 673-695.
[2] Lecun Y, Boser B E, Denker J S, et al. Backpropagation Applied to Handwritten Zip
Code[J]. Neural Computation, 19.
[3] Fukushima K. Neocognitron: A self-organizing neural network model for a mechanism
of pattern recognition unaffected by shift in position[J]. Biological Cybernetics, 1980, 36(4):193-202.
[4] Lecun Y. Gradient-Based Learning Applied to Document Recognition[J]. Proceedings
of the IEEE, 19, 86(11).
[5] Hinton G E,Salakhutdinov R R. Reducing the dimensionality of data with neural
networks[J].Science, 2006, 313(5786): 504-507.
[6] Krizhevsky A, Sutskever I, Hinton G E. ImageNet classification with deep
convolutional neural networks[C]. International Conference on Neural Information Processing Systems. Curran Associates Inc. 2012:1097-1105.
[7] Sun Y, Wang X, Tang X. Deep Learning Face Representation from Predicting 10,000
Classes[C]. IEEE Conference on Computer Vision and Pattern Recognition. IEEE Computer Society, 2014:11-18.
[8] Sun Y, Wang X, Tang X. Deep Learning Face Representation by Joint
Identification-Verification[J]. 2014, 27:1988-1996.
[9] Sun Y, Wang X, Tang X. Deeply learned face representations are sparse, selective, and
robust[J]. 2014:22-2900.
[10] Hinton G E,Osindero S,Teh Y-W.A fast learning algorithm for deep belief
nets[J].Neural Computation,2006,18(7):1527-15.
[11] 徐有正, 黄刚. 多标签图像的识别分类处理算法[J]. 计算机时代, 2017(10):9-12. [12] 李南星, 盛益强, 倪宏. 基于LM算法的MLP模型及其应用[J]. 网络新媒体技术,
2018, 7(1):59-63.
[13] 曲之琳, 胡晓飞. 基于改进激活函数的卷积神经网络研究[J]. 计算机技术与发展,
2017, 27(12):77-80.
[14] 傅鹏, 谢世朋. 基于级联卷积神经网络的车牌定位[J]. 计算机技术与发展,
- 32 -
苏州大学本科生毕业设计(论文)
2018(1):134-137.
[15] 张兆晨, 冀俊忠. 基于卷积神经网络的fMRI数据分类方法[J]. 模式识别与人工智
能, 2017, 30(6):9-558.
[16] 纪野, 李玉惠, 王蒙. 基于卷积神经网络的车型识别方法研究[J]. 传感器与微系
统, 2 017, 36(11):42-43.
[17] 李莲, 丁文宽. 基于卷积神经网络的辣椒识别[J]. 天津理工大学学报, 2017,
33(3):12-15.
[18] 张晴晴, 刘勇, 潘接林,等. 基于卷积神经网络的连续语音识别[J]. 工程科学学报,
2015, 37(9):1212-1217.
[19] 李旭冬, 叶茂, 李涛. 基于卷积神经网络的目标检测研究综述[J]. 计算机应用研
究, 2017, 34(10):2881-2886.
[20] 陈耀丹, 王连明. 基于卷积神经网络的人脸识别方法[J]. 东北师大学报(自然科
学), 2016, 48(2):70-76.
[21] 贾凡, 孔令智. 基于卷积神经网络的入侵检测算法[J]. 北京理工大学学报,
2017(12):1271-1275.
[22] 王振, 高茂庭. 基于卷积神经网络的图像识别算法设计与实现[J]. 现代计算机:专
业版, 2015(20):61-66.
[23] 龚丁禧, 曹长荣. 基于卷积神经网络的植物叶片分类[J]. 计算机与现代化, 2014,
2014(4):12-15.
[24] 于鹏. 基于深度卷积神经网络AlexNet的验证码识别研究[A]. 通信设计与应用,
2018, 66-67.
[25] 杨帅, 张有芬, 李玉惠,等. 基于深度卷积神经网络的车标分类[J]. 工业仪表与自
动化 装置, 2017(5):75-78.
[26] 温明莉, 赵轩, 蔡梦倩. 基于深度学习的端到端验证码识别[J]. 无线互联科技,
2017(14):85-86.
[27] 周正, 文亚飞, 鲍文平. 基于深度学习的人工智能用于识别破解字符型验证码[J].
通信 技术, 2017, 50(11):2572-2576.
[28] 吕刚, 郝平. 基于神经网络的数字验证码识别研究[J]. 浙江工业大学学报, 2010,
38(4):433-436.
[29] 孙晶晶, 静大海. 基于神经网络复杂背景下车牌识别系统的研究[J]. 国外电子测
- 33 -
苏州大学本科生毕业设计(论文)
量技术, 2017, 36(8):22-25.
[30] 费建超, 芮挺, 周遊,等. 基于梯度的多输入卷积神经网络[J]. 光电工程, 2015,
42(3):33-38.
[31] 陈以山, 张勇. 基于字符的图片验证码识别算法的设计与实现[J]. 电脑知识与技
术, 2017(1):190-192.
[32] 黄旭进, 曹飞龙. 矩阵输入的多层前向神经网络学习算法[J]. 中国计量大学学报,
2017(4):485-491.
[33] 李玉刚. 卷积神经网络的多标签学习研究[J]. 有线电视技术, 2018(1).
- 34 -
苏州大学本科生毕业设计(论文)
致谢
毕设到此是该结束了,与之相随的也还有四年的大学时光。大学生涯,是我人格培养、知识学习和个性形成的重要阶段,收获的点点滴滴,无法用言语积累,在此只能感恩。
首先我必须感谢黄鹤老师。我的整个毕业设计过程就像帆船航行于海面,黄鹤老师不是我的灯塔,是风,随着每次的讨论会,推着我一点点地向终点前进。当我的研究方向错误时,黄鹤老师又及时地进行了纠正,并提供参考资料,让我的毕设能够有一个好的开始。在进行毕业设计之前,我对深度学习的了解几乎可以不计,感谢黄鹤老师带我走进这扇门,让我了解和喜欢上神经网络,其中的哲学思想也将让我终身受用。
感谢电院的老师们,感谢我的班主任胡南老师,在四年中我得以吸收你们宝贵的知识,领略你们的风采。与知识并行的是你们的哲学观,在充满诱惑和迷雾的大学生活中,使我能在电院肥沃的土壤里像向日葵一样顽强地向上生长。
感谢我的家人朋友,在我的学习生涯中给予了我很多帮助和鼓励,让我能在失望之时重新振作,在绝望之时收获希望,在得意之时不至于忘形。
我还要感谢我的小组成员,从毕设开始到结束,在电子楼并肩作战,共同讨论神经网络的内容,也为我提供了许多灵感,使我能快速地理清思绪,在枯燥的研究工作中收获许多乐趣。
最后,再次向黄鹤老师、胡南老师以及其他老师,和我的家人朋友,我的同班同学和毕设小组成员,表示衷心的感谢和祝福。我们很多人都即将散落远方,甚至终身都难以再会,洛夫说,六月原是一本很伤感的书,也许我们终将成为彼此人生这本书边上最不起眼的一道纹,但请相信,彼此共有的,彼此共怀念,共祝愿。
- 35 -
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- xiaozhentang.com 版权所有 湘ICP备2023022495号-4
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务