基于机器视觉的12306验证码识别 计算机竞赛

news2024/11/14 20:34:59

文章目录

  • 0 简介
  • 1 数据收集
  • 2 识别过程
  • 3 网络构建
  • 4 数据读取
  • 5 模型训练
  • 6 加入Dropout层
  • 7 数据增强
  • 8 迁移学习
  • 9 结果
  • 9 最后

0 简介

🔥 优质竞赛项目系列,今天要分享的是

基于机器视觉的12306验证码识别

该项目较为新颖,适合作为竞赛课题方向,学长非常推荐!

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

1 数据收集

12306的验证码是从8个图片中找到要求的物体,如图所示。

在这里插入图片描述

学长统计了1000个样本,发现12306的类别数其实只有80类,它们的类别以及对应的统计个数如下表

在这里插入图片描述

在这里插入图片描述

从上面的统计中我们可以看出,12306的验证码的破解工作可以转换成一个80类的分类问题。

数据集预览
在这里插入图片描述

在这里插入图片描述

2 识别过程

物体分类的代码可以简单分成三个部分:

  • 网络搭建;
  • 数据读取;
  • 模型训练。

但是在上面的三步中每一步都存在一些超参数,怎么设置这些超参数是一个有经验的算法工程师必须掌握的技能。我们会在下面的章节中介绍每一步的细节,并给出我自己的经验和优化策略。

3 网络构建

搭建一个分类网络时,可以使用上面几篇文章中介绍的经典的网络结构,也可以自行搭建。当自行搭建分类网络时,可以使用下面几步:

  • 堆积卷积操作(Conv2D)和最大池化操作(MaxPooling2D),第一层需要指定输入图像的尺寸和通道数;
  • Flatten()用于将Feature Map展开成特征向量;
  • 之后接全连接层和激活层,注意多分类应该使用softmax激活函数。

自行搭建网络时,学长有几个经验:

  • 1 通道数的数量取2^n;
  • 2 每次MaxPooling之后通道数乘2;
  • 3 最后一层Feature Map的尺寸不宜太大也不宜太小(7-20之间是个不错的选择);
  • 4 输出层和Flatten()层往往需要加最少一个隐层用于过渡特征;
  • 5 根据计算Flatten()层的节点数量设计隐层节点的个数。

下面代码是学长搭建的一个分类网络


model_simple = models.Sequential()
model_simple.add(layers.Conv2D(32, (3,3), padding=‘same’, activation=‘relu’, input_shape = (66,66,3)))
model_simple.add(layers.MaxPooling2D((2,2)))
model_simple.add(layers.Conv2D(64, (3,3), padding=‘same’, activation=‘relu’))
model_simple.add(layers.MaxPooling2D((2,2)))
model_simple.add(layers.Conv2D(128, (3,3), padding=‘same’, activation=‘relu’))
model_simple.add(layers.MaxPooling2D((2,2)))
model_simple.add(layers.Flatten())
model_simple.add(layers.Dense(1024, activation=‘relu’))
model_simple.add(layers.Dense(80, activation=‘softmax’))

在上面代码中VGG16()函数用于调用Keras自带的VGG-16网络,weights参数指定网络是否使用迁移学习模型,值为None时表示随机初始化,值为ImageNet时表示使用ImageNet数据集训练得到的模型。

include_top参数表示是否使用后面的输出层,我们确定了只使用表示层,所以取值为False。input_shape表示输入图片的尺寸,由于VGG-16会进行5次降采样,所以我们使用它的默认输入尺寸224
224 3,所以输入之前会将输入图片放大。

4 数据读取

Keras提供了多种读取数据的方法,我们推荐使用生成器的方式。在生成器中,Keras在训练模型的同时把下一批要训练的数据预先读取到内存中,这样会节约内存,有利于大规模数据的训练。Keras的生成器的初始化是ImageDataGenerator类,它有一些自带的数据增强的方法。

在这个项目中学长将不同的分类置于不同的目录之下,因此读取数据时使用的是flow_from_directory()函数,训练数据读取代码如下(验证和测试相同):


train_data_gen = ImageDataGenerator(rescale=1./255)
train_generator = train_data_gen.flow_from_directory(train_folder,
target_size=(66, 66),
batch_size=128,
class_mode=‘categorical’)

我们已近确定了是分类任务,所以class_mode的值取categorical。

5 模型训练

当我们训练模型时首先我们要确定的优化策略和损失函数,这里我们选择了Adagrad作为优化策略,损失函数选择多分类交叉熵categorical_crossentropy。由于我们使用了生成器读取数据,所以要使用fit_generator来向模型喂数据,代码如下。


model_simple.compile(loss=‘categorical_crossentropy’, optimizer=optimizers.Adagrad(lr=0.01), metrics=[‘acc’])
history_simple = model_simple.fit_generator(train_generator,
steps_per_epoch=128,
epochs=20,
validation_data=val_generator)

经过20个Epoch之后,模型会趋于收敛,损失值曲线和精度曲线见图,此时的测试集的准确率是0.8275。从收敛情况我们可以分析到模型此时已经过拟合,需要一些策略来解决这个问题。

在这里插入图片描述

6 加入Dropout层

Dropout一直是解决过拟合非常有效的策略。在使用dropout时丢失率的设置是一个技术活,丢失率太小的话Dropout不能发挥其作用,丢失率太大的话模型会不容易收敛,甚至会一直震荡。在这里我在后面的全连接层和最后一层卷积层各加一个丢失率为0.25的Dropout。收敛曲线和精度曲线见下图,可以看出过拟合问题依旧存在,但是略有减轻,此时得到的测试集准确率是0.83375

在这里插入图片描述

7 数据增强

Keras提供在调用ImageDataGenerator类的时候根据它的参数添加数据增强策略,在进行数据扩充时,学长有几点建议:

  • 1 扩充策略的设置要建立在对数据集充分的观测和理解上;
  • 2 正确的扩充策略能增加样本数量,大幅减轻过拟合的问题;
  • 3 错误的扩充策略很有可能导致模型不好收敛,更严重的问题是使训练集和测试集的分布更加不一致,加剧过拟合的问题;
  • 4 往往开发者需要根据业务场景自行实现扩充策略。

下面代码是我使用的数据增强的几个策略。


train_data_gen_aug = ImageDataGenerator(rescale=1./255,
horizontal_flip = True,
zoom_range = 0.1,
width_shift_range= 0.1,
height_shift_range=0.1,
shear_range=0.1,
rotation_range=5)
train_generator_aug = train_data_gen_aug.flow_from_directory(train_folder,
target_size=(66, 66),
batch_size=128,
class_mode=‘categorical’)

其中rescale=1./255参数的作用是对图像做归一化,归一化是一个在几乎所有图像问题上均有用的策略;horizontal_flip =
True,增加了水平翻转,这个是适用于当前数据集的,但是在OCR等方向水平翻转是不能用的;其它的包括缩放,平移,旋转等都是常见的数据增强的策略,此处不再赘述。

结合Dropout,数据扩充可以进一步减轻过拟合的问题,它的收敛曲线和精度曲线见图4,此时得到的测试集准确率是0.84875。

在这里插入图片描述

8 迁移学习

除了我们自己构建网络以外,我们还可以使用现成的网络预训练模型做迁移学习,能使用的网络结构有:

  • Xception
  • VGG16
  • VGG19
  • ResNet50
  • InceptionV3
  • InceptionResNetV2
  • MobileNet
  • DenseNet
  • NASNet

使用经典模型往往和迁移学习配合使用效果更好,所谓迁移学习是将训练好的任务A(最常用的是ImageNet)的模型用于当前任务的网络的初始化,然后在自己的数据上进行微调。该方法在数据集比较小的任务上往往效果很好。Keras提供用户自定义迁移学习时哪些层可以微调,哪些层不需要微调,通过layer.trainable设置。Keras使用迁移学习提供的模型往往比较深,容易产生梯度消失或者梯度爆炸的问题,建议添加BN层。最好的策略是选择好适合自己任务的网络后自己使用

以VGG-16为例,其使用迁移学习的代码如下。第一次运行这段代码时需要下载供迁移学习的模型,因此速度会比较慢,请耐心等待。


model_trans_VGG16 = models.Sequential()
trans_VGG16 = VGG16(weights=‘imagenet’, include_top=False, input_shape=(224,224,3))
model_trans_VGG16.add(trans_VGG16)
model_trans_VGG16.add(layers.Flatten())
model_trans_VGG16.add(layers.Dense(1024, activation=‘relu’))
model_trans_VGG16.add(layers.BatchNormalization())
model_trans_VGG16.add(layers.Dropout(0.25))
model_trans_VGG16.add(layers.Dense(80, activation=‘softmax’))
model_trans_VGG16.summary()

它的收敛曲线和精度曲线见图5,此时得到的测试集准确率是0.774375,此时迁移学习的效果反而不如我们前面随便搭建的网络。在这个问题上导致迁移学习模型表现效果不好的原因有两个:

  • VGG-16的网络过深,在12306验证码这种简单的验证码上容易过拟合;
  • 由于include_top的值为False,所以网络的全连接层是随机初始化的,导致开始训练时损失值过大,带偏已经训练好的表示层。

在这里插入图片描述

为了防止表示层被带偏,我们可以将Keras中的层的trainable值设为False来达到此目的。结合之前

9 结果

我将12306网站验证码的破解工作转换成了一个经典的多分类问题,并通过深度学习和一些trick将识别率提高到了91.625%。

训练测试结果:
在这里插入图片描述

在这里插入图片描述

9 最后

🧿 更多资料, 项目分享:

https://gitee.com/dancheng-senior/postgraduate

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ES6之Set集合(通俗易懂,含实践)

Set是什么?它的方法有哪些?它在实例开发中有什么作用? 让我为大家介绍一下吧! ES6提供了新的数据结构 Set(集合) 。它类似于数组,但成员的值是唯一的。 创建方法: let s new Set()console.log(s)它属于什…

使用时间潜在瓶颈网络进行图像分类

介绍 简单的循环神经网络(RNN)对学习 时间压缩表示表现出强烈的归纳偏差。方程 1显示了递推公式,其中h_t是整个输入序列 的压缩表示(单个向量)x。 方程 1:递推方程。(来源:Aritra 和 Suvaditya)另一方面,Transformers(Vaswani 等人)对于学习时间压缩表示几乎没有归…

探索随机森林: 机器学习中的集成学习神器

机器学习 第七课 随机森林 概述机器学习机器学习的主要分类监督学习无监督学习强化学习 集成学习提高准确性增强稳定性提升泛化能力 集成学习的主要方法BaggingBoostingStacking 随机森林的理论基础决策树的基本原理随机森林的生成过程随机森林的优势与局限性 随机森林的实际应…

IDEA 构建web项目-详细教程

1、创建一个新项目 1、点击File,选择New,然后点击Project 2、选择Empty Project,然后点击Next 3、新建一个项目 4、在新建完项目后,点击Finish后会弹出Open Project这个窗口,建议选择New Window 5、在Project Structure中选择Project Settings --> M…

rosbag记录与回放数据以及通过GMapping算法创建地图与导航

1、引言 通过前面几章的介绍,明白了ROS的工作原理,并且我们也能遥控机器人了,那机器人如何在实际环境中自主导航呢?要做到这点,机器人必须知道它自己在哪以及需要到哪儿去。 意味着,机器人需要有一个周围环…

3分钟教你用Python+Appium实现自动化测试

一、环境准备 1.脚本语言:Python3.x IDE:安装Pycharm 2.安装Java JDK 、Android SDK 3.adb环境,path添加E:\Software\Android_SDK\platform-tools 4.安装Appium for windows,官网地址 Redirecting 点击下载按钮会到GitHub…

中创 | 数据泄露事件频发:卡西欧数据泄露涉及149个国家用户

49%的企业在过去两年中遭受了数据泄露 网络安全事件导致关键业务意外停机,平均损失为每小时20万美元\小时 一、卡西欧发生数据泄露事件 作为享有盛名的国际品牌,卡西欧40年来总销量突破1亿只,尽管卡西欧享誉全球,拥有顶级的网…

mac安装nodejs,跑vue程序

1. 下载node.js for mac,地址:Node.js。一路安装就可以了,无需修改。 2. mac终端,查看node和npm的版本。 3. 配置环境变量, vim .bash_profile增加PATH$PATH:/usr/local/bin/ 4. 但是毕竟npm安装一些东西还是太慢了所…

笔记本电脑的摄像头找不到黑屏解决办法

这种问题一般来说就是缺少驱动,就要下载驱动。 问题: 解决办法: 1.进入联想官网下载驱动 网站:https://newsupport.lenovo.com.cn/driveDownloads_index.html?v9d9bc7ad5023ef3c3d5e3cf386e2f187 2.下载主机编号检测工具 3.下…

类图表示法

设计模式,用设计图表示的话,主要用到类图。常见UML类图如下: 1、类图:矩形框,代表一个类(Class)。类图分为三层,第一层显示类的名称,如果是抽象类,则用斜体显…

ThinkPHP文件上传验证器

在thinkphp中的文件上传功能,添加验证器的过程中.踩得小坑&#xff0c;简单记录。 具体内容如下 代码如下. 视图层 就是简单的form表单,用来上传文件。 <form action"/admin/files/upFile" enctype"multipart/form-data" method"post">&…

项目部署Linux步骤

1、最小化安装centos7-环境准备 安装epel-release 安装epel-release&#xff0c;因为有些rpm包在官方库中找不到。前提是保证可以联网 yum install -y epel-release 修改IP net-tools net-tool&#xff1a;工具包集合&#xff0c;包含ifconfig等命令 yum install -y net-…

桶装水订水送水小程序开发搭建;

上门送水小程序桶装水配送是一款的同城上门配送平台&#xff0c;为用户提供便捷的桶装水配送服务。解决用户在获取干净健康的饮用水方面的需求&#xff0c;提供高效、便捷的在线预约和下单服务。 小程序平台开发&#xff0c;具备强大的技术支持和良好的用户体验。用户可以通过…

如何书写一篇好的博客?

前言 大家在写博客&#xff0c;一定不要为了火&#xff0c;才去写博客&#xff0c;用数量去博取访问量。我们可能会短暂的收获成就&#xff0c;但是质量上却没有被认可&#xff0c;这是非常不可取的。当未来面试官看我们的博客的时候&#xff0c;看到我们虽然访问量多&#xff…

分享一下怎么做一个房间预定链接

在旅游行业中&#xff0c;房间预定是非常重要的一环。随着互联网的普及和旅游业的发展&#xff0c;越来越多的人选择在网上预订房间。本文将介绍如何制作一个房间预定链接&#xff0c;以及推广该链接的方法和策略&#xff0c;帮助读者更好地了解房间预定的需求和实现方式。 一、…

如何在Postman中使用静态HTTP

首先&#xff0c;打开 Postman 软件。在 Postman 的菜单栏中&#xff0c;点击 “Preferences”&#xff08;偏好设置&#xff09;。 亲身经验&#xff1a;我自己尝试了这个方法&#xff0c;发现它非常适用于需要使用HTTP的场景。 数据和引证&#xff1a;根据 Postman 官方文档…

qt的一些自绘控件

https://download.csdn.net/download/venice0708/88469835

2023 年 Web 应用程序开发最佳技术堆栈

发现 Web 应用程序开发中的最新趋势技术&#xff0c;并找到有关更适合您的业务增长的技术堆栈的建议。&#x1f9e0;&#x1f4aa;&#x1f468;‍&#x1f4bb; 在不断发展的 Web 开发领域&#xff0c;您部署的技术堆栈不仅仅是编码&#xff0c;而是开辟一条成功之路&#xff…

极简运行Vue打包文件:让你的网页快速启动,高效展现!

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 ⭐ 专栏简介 &#x1f4d8; 文章内容 ⭐ 写…

“唯品会VIP商品API:一键获取奢侈品详情,尊享品质生活!“

要获取唯品会VIP商品的详细信息&#xff0c;您可以通过唯品会的API接口进行调用。 唯品会提供了多种商品选择&#xff0c;包括服装、美容护肤、鞋子、箱包、家居、母婴等等。在这些商品中&#xff0c;VIP奢侈品专区是唯品会的重要特色之一。 要获取VIP商品的详细信息&#xf…