计算机毕业设计-基于深度学习的验证码识别方法设计与实现

概要

  验证码是一个系统区分人类与非人类行为的有效方式。验证码识别技术能够使计算机程序输入正确的验证码,伪装成人类用户进入目标系统。另一方面,系统方面需要考虑破解验证码识别技术,修补验证方式的可能漏洞,使之能够更有效地区分人类与计算机的行为。深度学习能够使计算机更好地处理复杂的输入,因此能够识别更为复杂的验证码。深度学习是人工智能的一个重要分支,对于识别验证码图像,相对一些其他的学习算法,深度学习在同样的计算资源的条件下,具有更为优秀的性能,因此在处理同样的问题时深度学习能够节省一定的计算资源。
  本课题主要讨论了基于深度学习的验证码识别方法设计与实现。具体地,第一步采集验证码图像。这些验证码图像来源有两种:一是通过编程仿照常见的验证码图像生成数据集;二是从网站上下载验证码图像保存成数据集。第二步对验证码数据集进行去噪、定位等预处理,再使用垂直投影法进行分割,将分割出来的字符保存为学习样本。第三步构建卷积神经网络,使用采集的部分验证码图片对网络进行训练,调整参数。最后一步使用剩余的验证码图像对训练好的网络测试,整理测试结果,统计正确率,分析不同参数对神经网络性能的影响。
  经过测试,本论文设计的卷积神经网络基本能够成功地识别验证码图像,对仅包含数字的验证码图像识别效果较好,正确率达99.28%。

关键词:深度学习, 卷积神经网络, 验证码识别, 图像处理

一、研究背景与意义

  深度学习的应用领域有很多,其中之一就是验证码识别。
  验证码是一个系统区分人类与非人类的有效方式。验证码识别技术能够使计算机程序输入正确的验证码,伪装成人类用户进入目标系统。另一方面,系统方面需要先了解然后破解验证码识别技术,修补自身验证码的可能漏洞,使之能够更有效地区分人类与计算机的行为。随着互联网技术的发展,人们在使用互联网的同时越来越注重验证码的有效保护,希望网络的能够做到人类能识别而拦截所有机器程序的程度。
  当遇到黑客对网站发起攻击的时候,验证码就是网站安全的第一道防线[21,27],因此针对验证码识别的研究的实践意义不容小觑。我们可以通过研究验证码的识别技术,从根本上了解验证码的识别细节,从而做出针对性措施,加强验证码的保护能力,使验证码能够继续实现本身的价值。
  深度学习的初衷就是为了让计算机在处理某些问题时,能够拥有近似于人类的处理能力,这与验证码存在的意义是相对立的。验证码不希望机器能够像人类一样识别图像中的字符,而深度学习则努力使计算机能够尽可能地接近甚至超越人类。这一点一般的机器学习手段也能够实现,但是深度学习的优势在于能够将目标的特征逐级提取,比如我们学习汉字,先从基本的横、竖、撇、捺开始,最后将这些基本的特征进行组合,形成目标的完整特征,据此能够进行学习将目标分类或者预测。

二、验证码图像处理技术

  要使深度神经网络能够学习识别验证码,有两种可行性方案:一是端到端的识别,不对验证码进行分割预处理,而是直接通过神经网络得到输出[11,26,33]。二是分割识别,对验证码进行预处理和分割之后,按分割顺序将字符通过神经网络,并将得到的输出按顺序排列,得到网络对整张验证码图像的识别结果。
端到端的识别,涉及到的多标签分类问题颇为复杂[33]。限于个人能力与时间问题,本设计采用分割识别的方案。

3.1 图像预处理

在这里插入图片描述

图3-1 图像的灰度化和二值化

  由于待识别的验证码图像是彩色的图像,而验证码的识别,依据的是其字符形状而非字符色彩,所以二值化操作不会使需要的数据信息丢失。对输入的验证码样本,经过灰度化、二值化处理之后,能够降低图像数据的维数,有效降低数据处理的复杂度[31]。图3-1为初始的验证码样本图像及其经过二值化之后的图像。
  二值化之后的验证码图像没有了色彩数据的干扰,但是还有明显的噪点的存在,这些噪点无疑会影响到网络的识别效果,更直接的是影响到之后的分割处理,所以在分割识别之前,还需要对验证码图像进行去噪处理。图3-2为去噪之后的效果。
  经过二值化与去噪处理之后,验证码图像上少了许多干扰性数据,只保留待识别的字符和干净的背景,这能在很大程度上提升神经网络的识别效果。
在这里插入图片描述

图3-2 图像去噪

3.2 字符定位和分割

在这里插入图片描述

图3-3 目标定位

由于验证码图像中,字符的位置都是在图像内部,而边缘都是无用的背景信息,所以在进行字符分  割之前,对字符图像进行目标定位,确定字符的位置,割舍可能会带来干扰的边缘信息,能够对提升最终的识别正确率有很大的帮助[14,28]。定位算法并不复杂,其核心是确定字符区域的边界,在边界处进行背景切割,保留字符目标。算法流程如下:
  第一步:经过前面去噪预处理之后的图像通常只有目标区域和背景区域两部分,很容易检测到目标字符的左边界、右边界、上边界和下边界。
  第二步:这四个边界包围起来的区域就是定位到的字符所在的区域,根据这四个边界就能进行边缘切割,保留目标区域。图3-3是进行目标定位的示意图和结果。
图像预处理的最后一步是字符分割。
  字符分割的算法有很多种,复杂程度不一,针对待识别的验证码图像,酌情选择合适的分割算法。就本课题处理的验证码图像而言,字符之间无粘连,采用垂直投影法是最简单有效的分割算法,对验证码图像进行垂直方向上的投影,将投影值最少的位置作为分割点对图像进行分割。
在这里插入图片描述

图3-4 垂直投影分割
在这里插入图片描述

图3-5 图像分割结果

  图3-4所示为垂直投影算法分割的细节。算法流程如下:
  首先将待分割图像进行垂直投影,统计投影的值。没有字符存在的地方,甚至有字符存在并且粘连,但是粘连比较少的区域,其投影值会明显比字符所在区域的投影小得多。
第二步寻找这些投影值小的位置,初步确定为选取分割的点。
第三步结合具体的验证码图像特征,去除部分不可能的分割点,在剩下的分割点中选取合适点,即可进行分割。
  图3-5是图像分割前后的对比。为了与后面的卷积操作匹配,对分割之后的字符图像进行了边缘补零操作,避免在进行卷积时丢失字符的边缘特征。经统计,对采用的验证码样本进行使用垂直投影法分割的成功率是96.

三、网络性能分析

  

3.1 参数的选择

根据第四章的内容,网络各参数的选择都有一定限制,最初设置的参数如表5-1所示:
在这里插入图片描述

在实际的使用中,卷积核的大小、池化核大小以及网络层数,都由经验公式大概确定,并根据最终网络的性能进行参数调整以确定合适的参数值。

5.2 识别结果

在5.1节选取的初始值条件下,使用学习样本对网络进行训练,第一次训练的样本是通过编程生成的验证码图像,训练之后,网络对这类验证码的识别正确率较高,为99.28%。图5-1所示是网络对这类验证码的分割结果和识别结果。
此时用另一个测试集去测试网络,正确率并不理想,仅仅为47.246%。这是由两个数据集的差异造成的,虽然都是数字字符,但是第一类数据集本身有倾斜,而第二类没有,此外两种验证码还有其他特征差异,因此网络即使对相同数字提取的特征,也不完全相同。
在初次学习之后由于网络正确率偏低,需要使用第二类数据集在第一次训练的基础上对网络使用相同的参数再重复训练一次,因为样本集发生了变化,需要使网络“熟悉”第二类验证码的字符特征。在第二次学习之后,网络对第二次验证码的识别率有很大的提升,达到96.8116%。
在这里插入图片描述

图5-1 对自生成验证码的识别样例

图5-2是网络对第二类验证码的分割结果和识别结果。
在这里插入图片描述

图5-2 对采集的验证码识别样例

四、总结

  自人工智能兴盛以来,关于深度学习的研究成果如浪花涌现,深度学习在人工智能中的地位也越来越重要。深度学习在对数据进行分类上的优越性能是普通网络无法比拟的,卷积神经网络也因众多研究成果而广受重视,自身也在图像处理领域有着得天独厚的优势。验证码字符的识别分类就是深度学习的一个经典应用。
  本文在参考众多文献的基础上,深入理解深度学习和卷积网络基本理论,运用这些理论来构建卷积神经网络,解决验证码识别的问题。
  验证码数据集来源有二:一为通过编写程序生成与常见验证码类似的验证码图像;二是到网站上进行人工采集。在使用卷积网络进行学习和测试之前,先对验证码数据集做预处理,预处理操作有四:一是二值化,降低数据的维度,很大程度上也减少了数据的复杂度;二是去噪,消除验证码图像中的噪点,能够使网络不受太多无用信息的干扰,提高识别正确率;三是字符定位,一定程度上较少原始图像边缘的无用背景信息对网络的干扰,提高识别正确率;四是字符分割,每次学习一个字符,一方面能够降低识别难度,另一方面也降低了对样本数量的要求。
  本文最后对网络进行学习和测试,并分析了对网络性能影响较大的两个参数:全连接层隐层的神经元个数和学习率,通过分析这两个参数对网络收敛曲线和识别正确率的影响,能够为选取这两个参数的合适值提供方向,从而能够进一步地对网络进行优化。

六、 目录

目录
中文摘要 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/470638.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[Uni-app] 微信小程序的圆环进度条

效果图&#xff1a; 组件完整代码如下&#xff1a; <template><view class"base-style":style"position: relative;width: diameter px;height: diameter px;display: flex;flex-direction: row;background-color: bgColor ;"><!…

RK3588+FPGA+AD+AI的智能数据采集与分析解决方案

RK3588是瑞芯微新一代旗舰级高端处理器&#xff0c;具有高算力、低功耗、超强多媒体、丰富数据接口等特点。搭载四核A76四核A55的八核CPU和ARM G610MP4 GPU&#xff0c;内置6.0TOPs算力的NPU。 RK3588复旦微FPGA方案 有五大技术优势 1. 内置多种功能强大的嵌入式硬件引擎&…

【Linux(1)】Linux的一些基本指令(补充上一篇)

思维导图 学习内容 通过上面的学习目标&#xff0c;我们可以列出要学习的内容&#xff1a; linux的一些指令&#xff1a;cd mkdir cp touch which rm cat alias 一些基本的概念&#xff1a;指令的概念&#xff0c;用户家目录是什么...... 一、Linux的一些指令 1.1 重新认识…

基于Spring Boot共享单车信息系统的设计与实现

摘 要 快速发展的社会中&#xff0c;人们的生活水平都在提高&#xff0c;生活节奏也在逐渐加快。为了节省时间和提高工作效率&#xff0c;越来越多的人选择利用互联网进行线上打理各种事务&#xff0c;然后线上管理系统也就相继涌现。与此同时&#xff0c;人们开始接受方便的生…

Opencv入门---绘图篇

目录 一、cv.line() 二,cv.cricle() 三&#xff0c;cv2.rectangle() 一、cv.line() cv.line()是 OpenCV 库中用于在图像上绘制直线的函数。它可以在图像上绘制一条直线&#xff0c;指定直线的起始点和结束点。 函数的语法如下&#xff1a; cv.line(img, pt1, pt2, color, th…

[LLM] 大模型基础|预训练|有监督微调SFT | 推理

现在的大模型在进行预训练时大部分都采用了GPT的预训练任务&#xff0c;即 Next token prediction。 要理解大语言模型&#xff08;LLM&#xff09;&#xff0c;首先要理解它的本质&#xff0c;无论预训练、微调还是在推理阶段&#xff0c;核心都是next token prediction&#…

dockerfile文件编写

文章目录 dockerfile是什么Dockerfile常用指令1. FROM2. MAINTAINER3. WORKDIR4.COPY5.ADD6.ENV7.RUN8.CMD9.ENTRYPOINT dockerfile是什么 Dockerfile是一个文本配置文件&#xff0c;用于自动化构建Docker镜像。 Dockerfile是由一系列命令和参数构成的脚本&#xff0c;它指导D…

zookeeper快速入门(合集)

zookeeper作为一个分布式协调框架&#xff0c;它的创建就是为了方便或者简化分布式应用的开发。除了服务注册与发现之外&#xff0c;它还能够提供更多的功能&#xff0c;但是对于入门来说&#xff0c;看这一篇就够了。后续会讲zookeeper的架构设计与原理&#xff0c;比如zookee…

resize-observer源码解读

resize-observer github 地址&#xff1a;https://github.com/devrelm/resize-observer 本地启动 npm installnpm startnode 18.16.0 (npm 9.5.1) 启动失败报错 node:internal/crypto/hash:71this[kHandle] new _Hash(algorithm, xofLen);^Error: error:0308010C:digital …

1、初识JVM

一、JVM是什么&#xff1f; JVM的英文全称是 Java Virtual Machine&#xff0c;其中文译名为Java虚拟机。它在本质上就是是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件。 JVM执行流程如下 二、JVM有哪些功能&#xff1f; 2.1 解释和运行 对字节码文…

【Web技术应用基础】HTML(1)——简单界面

题目1&#xff1a; <!DOCTYPE html> <html><head><meta charset"utf-8"><title>Hello world</title></head> <body bgcolor"F6F3D6"><!--用HTML语言向世界打声招呼吧&#xff01;--><h1 align&…

电脑怎么快速重装系统win7

电脑重装系统是解决软件问题、提升系统性能的常用手段。随着技术发展,一键重装系统成为了许多用户的首选方法,因为它简化了繁琐的操作步骤,节省了大量时间。尤其是对于非技术人员来说,一键重装提供了一种快速高效且不易出错的系统安装方式。如果你需要快速重装win7,那么可…

Spring Boot 自动化单元测试类的编写过程

前言 Web环境模拟测试 企业开发不仅要保障业务层与数据层的功能安全有效&#xff0c;也要保障表现层的功能正常。但是我们一般对表现层的测试都是通过postman手工测试的&#xff0c;并没有在打包过程中代码体现表现层功能被测试通过。那么能否在测试用例中对表现层进行功能测…

Android 项目实战,APP开发,含源码

Android 项目实战&#xff0c;APP开发&#xff0c;含源码 源码项目详情 源码项目详情 切鱼达人&#xff0c;Android休闲游戏开发 打砖块&#xff0c;Android休闲小游戏开发 “牛弹琴”&#xff0c;Android 弹钢琴 app 开发 2048 数字合成大作战&#xff0c;Android小游戏开…

NCV4276BDT50RKG低压差稳压器芯片中文资料PDF数据手册规格书引脚图参数价格

产品概述&#xff1a; NCV4276B是一款输出电流400 mA集成式低压差稳压器系列&#xff0c;设计用于恶劣的汽车环境。它包括宽工作温度和输入电压范围。该器件提供固定和可调电压版本&#xff0c;输出电压精度为 2%。它具有高峰值输入电压容差和反向输入电压保护。它还提供过流保…

【研发管理】产品经理-基础认知

导读&#xff1a;产品经理&#xff08;Product Manager&#xff09;是一个负责产品的全周期管理的职位&#xff0c;他们不仅参与产品的设计、开发、推广和销售&#xff0c;还涉及到产品的市场调研、用户需求分析、竞争分析、产品规划、产品测试以及后续的产品迭代等多个环节。产…

使用Redis做缓存的小案例

如果不了解Redis&#xff0c;可以查看本人博客&#xff1a;Redis入门 Redis基于内存&#xff0c;因此查询速度快&#xff0c;常常可以用来作为缓存使用&#xff0c;缓存就是我们在内存中开辟一段区域来存储我们查询比较频繁的数据&#xff0c;这样&#xff0c;我们在下一次查询…

Hive 数据迁移与备份

迁移类型 同时迁移表及其数据&#xff08;使用import和export&#xff09; 迁移步骤 将表和数据从 Hive 导出到 HDFS将表和数据从 HDFS 导出到本地服务器将表和数据从本地服务器复制到目标服务器将表和数据从目标服务器上传到目标 HDFS将表和数据从目标 HDFS 上传到目标 Hiv…

设计模式学习笔记 - 设计模式与范式 - 创建型:1.单例模式(上):为什么说支持懒加载的双重校验不必饿汉式更优?

今天开始正式学习设计模式。经典的设计模式有 23 种。其中&#xff0c;常用的并不是很多&#xff0c;可能一半都不到。作为程序员&#xff0c;最熟悉的设计模式&#xff0c;肯定包含单例模式。 本次单例模式的讲解&#xff0c;希望你搞清楚下面这样几个问题。&#xff08;第一…

Redis一些命令(2)

启动命令&#xff1a; redis-server /myredis/redis.conf&#xff08;指定配置文件&#xff09; redis-cli -a 123456 -p 6379&#xff08;-a 密码 -p 端口号&#xff09; redis-cli -a 123456 --raw&#xff08;解决中文乱码&#xff09; 关闭命令&#xff1a; redis-cli…