一种改进Yolov7 算法在验证码识别中的应用
2023-11-09朱洪华
朱洪华
( 莆田学院 机电与信息工程学院, 福建 莆田 351100 )
0 引言
验证码是一种图灵测试, 可以自动区分计算机和人类。 人们使用验证码的目的是为了通过验证码将真实人类用户与计算机程序区分开来, 从而避免恶意攻击网络的行为, 保护网络的安全稳定。 对于经过设计的验证码图像, 通过人类的视觉感知系统可以很容易辨别出其中的有效信息,但计算机程序却没办法轻易识别。 正是由于这种强大的区分人机的功能, 验证码在互联网时代发挥着越来越重要的作用。
验证码技术主要有验证码设计和验证码识别两个研究方向, 且两者的发展是相辅相成的。 提高验证码设计技术会相应地提升识别验证码的难度, 有利于推动验证码识别技术的进步; 相反,验证码识别技术的提高有助于发现验证码设计过程中存在的漏洞, 从而带动验证码设计技术的进步。 因此, 开发更有效的验证码识别技术以带动验证码设计技术的提高将是一个长期的研究课题。
1 数据集收集
基于深度学习的验证码识别技术, 需要收集大量的样本来训练模型, 从而提高模型的准确率。 笔者主要通过随机自动生成和网页爬取两种方式来获取的大量验证码图片。 Python 语言提供了专门的验证码生成方法, 工作原理是随机生成字母和数字的组合, 经过变形和旋转, 再添加上一些干扰线和干扰点, 然后生成一张验证码图片(如图1)。 用验证码文字内容对图片进行命名, 并标记数据集。 采用自动生成验证码的方式可以很方便地获取大量的数据, 满足训练模型对大量数据的需求。
图1 自动生成的验证码
为了使训练的模型更加准确, 必须添加真实的验证码图片, 所以笔者使用网络爬虫工具从网页上爬取真实的验证码图片。 该工具通过本地程序对网络链接发起获取图片的请求, 并把图片保存到本地, 通过更换网址执行多次循环程序, 以此从网页获得大量的验证码图片样本。 图2 展示了部分通过爬虫工具获取的网络验证码图片。 与自动生成方法得到的验证码图片样式单一不同, 这种方法可以得到更多样式的验证码, 符合实际情况, 得到的数据集更为有效。 但爬取图像的缺点是必须对图像进行人工标注, 很难在短时间内获取大量图片。 因此, 可以结合两种采集方法获取数据。
图2 爬取的58 同城及搜狐网页上的验证码
2 验证码预处理
为了抵御攻击, 验证码通常会添加干扰点和干扰线, 有些还包括颜色变化或彩色背景, 大大增加了计算机识别的难度。 因此, 有必要对获取的验证码进行预处理, 这可以大大提高字符识别率。 图像的预处理步骤包括: 灰度化、 二值化和去噪。
2.1 灰度化和二值化
一般来说进行图像预处理的第一步是灰度化[1]。 对图像进行灰度化是为了减少颜色信息对后面步骤的影响。 采用图像灰度化中经常使用的加权平均法来获得灰度图像。 加权平均法的原理是按照一定的权重把彩色图像中的R、G、B三个通道的值进行加权平均, 如下式所示:
式(1) 中,ω1、ω2、ω3为R、G、B三个通道对应的权重。 使用不同的权重进行加权, 得到的灰度图像也不同, 因而可以根据需要灵活设计权重。
灰度化之后要对图像进行二值化, 通过设置阈值将图像转换为二值图像, 其中一个值的像素大于阈值, 另一个值的像素小于阈值。 经过二值化处理后, 把小于阈值的像素设置为0, 大于阈值的像素设置为255。 图像中只保留了0 和255两个值, 这样处理后图像不再复杂, 数据处理量也大大减少。
2.2 去噪
图像进行二值化处理后, 除了有待识别的字符目标外还存在噪声[2]。 噪声包括图像本身就存在的噪声, 也包括在验证码生成过程中随机加入的干扰线和干扰点。 对于字符识别来说, 可以把这些干扰线和干扰点统一定义为干扰噪声。 所以, 可以认为验证码图像中存在两种噪声: 随机噪声和干扰噪声。 因为干扰因素的产生方式和特征不同, 所以针对不同的噪声, 去除的方法也不同。
(1)随机噪声的去除
噪声会干扰图像中特征的提取, 所以需要在预处理阶段逐一处理。 全面考虑现有的噪声去除算法的优缺点后, 笔者决定综合运用现在广泛使用的连通域去噪法、 Hough 变换法和空间域滤波法, 具体步骤如下: 首先对图像中所有连接的域进行检测, 把每个连接域中的黑像素数计算出来; 然后确定阈值, 把像素值小于阈值的整个连接域移除掉; 接着利用Hough 变换法检测消除干涉线; 最后, 使用空间域滤波法来提高图像质量。 经过上述处理, 能够很好地把图像中的随机噪声去除掉。
(2)干扰噪声的去除
验证码中通常有大量的干扰噪声。 进行验证码安全测试时, 为了不影响用户体验, 让用户能快速区分出干扰线和字符, 所以干扰线的宽度一般设置得比字符笔划细。 因为单张验证码图片的大小有限, 一般情况下会把干扰线设置为一个像素宽。 笔者采用一种遍历算法来消除干扰线, 算法的具体步骤如下: 遍历二元图中的每一个像素, 将宽度为一个像素的线上的每个像素都设置成白色。 经过遍历之后, 可以删除大部分的干扰线和干扰点。 经过去噪处理之后, 去除了大部分的干扰线和干扰点, 验证码变得更容易识别。 验证码预处理结果如图3 所示。
图3 验证码预处理效果对比
3 改进版Yolov7 验证码检测算法
随着卷积神经网络和深度学习的发展, 现在的目标检测算法有了比较大的突破[3-4], 可以根据计算的步骤, 把目标检测模型分成两类。 一种是R-CNN(区域卷积神经网络)系列算法, 包括R-CNN、 Fast R-CNN 和Faster R-CNN 等, 它们是两级检测器。 第一步, 输入图像, 选择目标可能存在的区域, 并弱化背景信息, 生成具有一般精度的边界框; 第二步, 根据感兴趣区域提取候选框中的特征, 然后进行分类和回归。 这种方法虽然保证了一定的精度, 但由于检测器采用的是区域建议加分类回归的方法, 计算量大, 对设备有一定要求, 计算速度较慢, 难以满足实时检测的要求。 针对上述两级检测器的不足, 人们提出了另一种一级检测器, 主要基于Yolo(you only look once)系列算法和SSD(single shot multibox detector)算法, 只需一次检测即可直接预测目标类别和位置信息, 无需预先提出区域建议, 就能得到最终的检测结果。 SSD 使用卷积神经网络模型VGG16 提取特征, 并添加卷积层, 获得更多的特征映射。 SSD 是一个全卷积神经网络, 可以更快地获得检测结果。 然而, 随着速度的提高,目标的检测精度却降低了。 Yolo 算法已经发展到第七代(Yolov7), 它改进了SSD 算法的一些缺点, 比以往的Yolo 系列算法具有更快的速度和更高的精度。
采用Yolov7 算法进行验证码字符检测, 原始的主干网络在进行特征提取时, 一些局部信息在逐层提取的过程中常出现信息丢失等问题。 此外, 对于一些深层网络, 直接提取各个卷积层的输出存在困难。 所以笔者在Yolov7 算法的基础上, 采用残差密集网络(RDN)中提取多层特征的方式对Yolov7 进行改进[5], 提出RDN-Yolov7验证码检测算法。 RDN-Yolov7 算法在Yolov7 原始网络加入残差密集模块, 实现了在深层网络中也可以对各个层的不同特征进行提取和融合, 而且连续连接, 可以保证高级特征信息和低级特征信息的记忆和存储, 可以更好地预测验证码字符的位置。 残差密集模块结构如图4 所示, 每个残差密集模块内包含密集连接层和局部的残差连接, 通过这种设计使得当前卷积层可以直接访问位于它后面的所有层, 通过局部密集连接充分利用各层信息, 自适应保存累积的特征, 信息之间的传递不受层级位置的影响。
图4 残差密集模块结构
在残差密集模块中利用1×1 的卷积层能够自适应地融合不同层的特征, 最终形成局部特征的融合。 第s 个残差密集模块的公式如下所示。
式(2)、 式(3)中,Fs0是残差密集模块的初始输入,ω是卷积层的权重,Fs1,Fs2…Fsn是残差密集模块内部各个层的特征,σ是ReLU 激活函数,Fsn,LF则是进行1×1 卷积处理之后融合形成的局部特征。 残差密集模块与模块之间也依照这种连接方式, 当前位置模块可以访问后面模块的各个层传递信息, 多个模块直接连续传递,输出的结果进行自适应融合, 之后再利用卷积层进行特征提取, 获得当前需要的特征信息[6]。
RDN-Yolov7 采用残差密集模块来改进原有特征提取网络, 残差密集模块中的不同卷积层可以通过1×1 卷积自适应地保存密集连接信息, 从而提取局部密集特征。 然后, 通过残差连接将融合后的局部密集特征与浅层特征进行连接, 得到残差密集模块的最终特征信息。 深层网络中一般包含有更丰富和更有用的信息, 可以提取出更具代表性的特征, 但是直接对深层的卷积层进行提取比较困难, 通过残差密集和局部连接可以充分利用卷积层的层次性特点, 改善特征融合的方式,减少出现信息丢失和验证码字符缺失的情况。
4 实验平台与结果比较
4.1 实验平台
实验以Python 语言为基础, 以Pytorch 深度学习框架构建卷积神经网络, 训练数据集来自随机生成验证码、 58 同城验证码和搜狐验证码,具体数量见表1。 训练时使用的BatchSize 设定为16, 训练过程在进行30 次迭代之后停止。 学习率设定为0.000 1。
表1 验证码数据集构成 个
4.2 实验结果比较
为了评估RDN-Yolov7 验证码检测算法的表现, 笔者使用多个数据集对模型的性能进行测试, 然后再与目前目标检测领域先进的RCN、VGG-16、 SVM、 ResNet 算法进行对比, 最后再进行消融实验, 对有无残差密集网络模块的情况下Yolov7 算法性能差异进行比较。 不同算法检测成功率如表2 所示。
表2 不同算法检测成功率 %
从表2 可以看出, RDN-Yolov7 验证码检测算法在3 个数据集上表现最好, 检测成功率达到了98%以上, 证明了RDN-Yolov7 算法的有效性。 RDN-Yolov7 算法由于对网络结构的修改和模块的添加使得网络结构变得复杂, 在识别速度上较原版Yolov7 算法慢, 但是在检测成功率方面提高了许多, 综合性能大大优于原版Yolov7算法, 可以将此算法应用于对验证码检测成功率要求较高的场合。
5 结论
对验证码识别进行了深入分析, 在Yolov7算法的基础上提出了优化算法。 该算法借鉴了残差密集网络中提取多层特征的方式, 在Yolov7原始网络加入残差密集模块, 实现了在深层网络中也可以对各个层的不同特征进行提取和融合。经过实验验证, 所提出的方法较现有几种先进的方法有一定的提升, 具有很好的实际应用价值。