基于pytorch和CNN的图片验证码识别

0 引言
验证码,是一种区分用户是计算机还是人的公共全自动程序,本文利用新兴的深度学习框架PyTorch,并结合卷积神经网络(CNN)搭建的模型进行训练,对于收集到的由数字和字母(区分大小写)组成的复杂的图片验证码的识别取得了较为良好的效果。
1 PyTorch简介
PyTorch是Torch在Python上的衍生,与之前大多数采用静态计算图的开源框架比如TensorFlow、Caffe不同,PyTorch采用了动态计算图结构构建神经网络,PyTorch主要由3个包组成:1.torch:类似于Numpy的通用数组库,可以将张量类型转换为Tensor并放在CPU上计算。2.torch.nn:具有共同层和成本函数的神经网络库。3.torch.optim:具有通用优化算法(如Adam等)的优化包。

2 CNN模型搭建
卷积神经网络(CNN)的一般结构如下:1.输入层,用于数据的输入。2.卷积层:使用适当大小的卷积核进行特征提取与特征映射。3.激励层:用于非线性映射,这里使用torch.nn中的ReLU函数实现。4.池化层:对前面得到的特征映射图进行降维操作减小过拟合,本实验中采用的是最大池化层。5.全连接层:对特征进行重新拟合,减少信息量的缺失。6.输出层:目标结果输出。在本实验中,在池化层之后另外加上了批规范化层,对数据进行泛化,用于加快模型的收敛速度。此模型结构代码如下:
基于pytorch和CNN的图片验证码识别_第1张图片
其中nn.Sequential()可以看做是神经网络模块的一个有序容器,这样有利于快速搭建神经网络结构。num_batch表示每次放入网络的数据个数即图片数量,本实验网络的输入为长为120像素,宽为40像素,RGB三通道的验证码图片,通过第一个卷积层,保持输出的图片大小不变,输入通道数为3,输出通道数为16,卷积核大小此处设为33,随后通过一个最大池化层,对应的窗口大小为22,步长为3,然后在通过一个批规范化层以及一个激励层,这样便得到了第一层输出为166020的张量。同样的,经过上述类似的4组结构的卷积后,通过一个全连接层便为模型的输出。
通过全连接层的映射成为一个[num_batch,num_class*num_char]的张量输出,这里的num_class和num_char分别表示字符的种类和一张图片中的字符数量,分别为62和4。
3 加载数据集
3.1 数据集
本实验所收集的数据集来自2019年全国高校计算机能力挑战赛官方提供的5000张验证码图片,标签以csv文件给与如图1图2图3所示。
在这里插入图片描述
图1 验证码样本集
在这里插入图片描述
图2 验证码4Jy3
在这里插入图片描述
图3 验证码6GKz
3.2 Dataset
PyTorch里的Dataset是数据集的封装,可以高效方便的读取数据,代码所示:
基于pytorch和CNN的图片验证码识别_第2张图片
3.3 DataLoader
PyTorch里的DataLoader是对Dataset进一步封装,每次取一个num_batch的样本批次,代码如下所示:
基于pytorch和CNN的图片验证码识别_第3张图片
4 网络训练流程
神经网络训练的流程可以分为如下4个主要流程:1.定义网络,本实验则采用卷积神经网络;2.定义优化器和损失函数,此处使用torch库里的torch.optim.Adam()和nn.MultiLabelSoftMarginLoss()分别作为优化器和损失函数;3.遍历数据集dataloader,每次取一个num_batch放在GPU或CPU上训练,计算损失函数loss,本实验中,batch_size取128,epoch取200,学习效率取0.001。 4.训练集跑完一个epoch,计算测试集的准确率,用来评估模型。这里需要自己定义计算准确率的函数作为模型评估的指标,代码如下所示:
基于pytorch和CNN的图片验证码识别_第4张图片
5 实验结果及分析
训练完参数后,我们对新的5000张验证码图片进行测试,测试部分结果如图4所示,效果如图5所示。
基于pytorch和CNN的图片验证码识别_第5张图片
图4 预测结果
基于pytorch和CNN的图片验证码识别_第6张图片
图5 验证码识别效果
最后的结果表明,用此模型进行该类型的验证码进行识别,能达到96%左右的正确率,也就是说5000张图片中,还有200张验证码图片未识别成功,那些未识别成功的验证码有一个共同特点,字符与噪声几乎融合,色差很小(如图6所示)。
在这里插入图片描述
图6 未识别成功的验证码
6 结束语
本文针对2019年全国高校计算机能力挑战赛官网提供的验证码进行分析,提出了基于PyTorch和CNN的验证码识别算法,由于该类型的验证码图片中的字符间存在粘连,而且相同字符写法还不同,图片背景噪声与字符相融合,所以人眼很难识别,故本实验利用PyTorch深度学习框架,结合CNN卷积神经网络对数据集进行训练,结果表明能达到较高的识别正确率,测试集的正确率能够达到96%,当然,本实验也有需要改进的地方,在图片预处理方面,本实验并未做过多操作,如果在本套验证码图片上进行旋转,倒置,去一些噪点,从而达到扩充数据集的目的,预计结果会更好。
Github代码地址(内含数据集):https://github.com/JT623/Captcha

你可能感兴趣的:(神经网络,pytorch,机器学习)