深度学习卷积神经网络识别光学字符验证码,及captcha使用简单案例

深度学习卷积神经网络识别验证码

文章目录

  • 深度学习卷积神经网络识别验证码
    • 一、引言
    • 二、导入必要的库
    • 三、防止 tensorflow 占用所有显存
    • 四、定义数据生成器并测试
    • 五、定义网络结构
    • 六、训练模型
    • 七、测试模型

一、引言

验证码识别,本身使用来判断访问网站的用户是不是一个真人,但是随着人工智能的发展,尤其是深度卷积神经网络的发展,使得验证码识别机器还是人的底线再被层层攻破,本文所使用的captcha 可以生成语音和图片验证码,验证码是由数字、大写字母、小写字母组成,可以自动生成验证码。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E7jq6PxI-1693272688113)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230828213513905.png)]

最好掌握的预备知识:

  • 有python脚本编程基础;
  • 了解图像处理、计算机视觉理论基础;
  • 对Opencv有一定的认识;
  • 对图像处理有操作经验;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6EZ6HRR7-1693272688114)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230828213911621.png)]
目的:通过Python语言与其各种资源库如numpy,pillow,tensorflow,keras等来实现。将效果实现出来。了解如何使用catptcha自动生成验证码数据,同时使用tensorflow撰写网络,来完成验证码训练,将使用高级框架的keras作为手写字母的网络主体。

二、导入必要的库

我们需要导入一个叫 captcha 的库来生成验证码。

我们生成验证码的字符由数字和大写字母组成。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9xBRQPC1-1693272688115)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230828185346056.png)]

导入成功后,我们使用jupyter notebook编写代码,使用py3.6.9,TensorFlow2.0+

from captcha.image import ImageCaptcha
import matplotlib.pyplot as plt
import numpy as np
import random
import tensorflow as tf%matplotlib inline
%config InlineBackend.figure_format = 'retina'#输出所有的ascii,用来生成验证码
import string
characters = string.digits + string.ascii_uppercase
print(characters)#验证码的长、宽、字符数、类别数
width, height, n_len, n_class = 128, 64, 4, len(characters)

输出结果:

0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ

三、防止 tensorflow 占用所有显存

#下面就是实现按需分配的代码
gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:try:#设置仅在需要时申请显存空间for gpu in gpus:tf.config.experimental.set_memory_growth(gpu, True)logical_gpus = tf.config.experimental.list_logical_devices('GPU')print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPUs")except RuntimeError as e:print(e)

四、定义数据生成器并测试

from tensorflow.keras.utils import Sequenceclass CaptchaSequence(Sequence):#这里传入的参数与上面的导入模块常量相对应def __init__(self, characters, batch_size, steps, n_len=4, width=128, height=64):self.characters = charactersself.batch_size = batch_sizeself.steps = stepsself.n_len = n_lenself.width = widthself.height = heightself.n_class = len(characters)self.generator = ImageCaptcha(width=width, height=height)def __len__(self):return self.stepsdef __getitem__(self, idx):X = np.zeros((self.batch_size, self.height, self.width, 3), dtype=np.float32)y = [np.zeros((self.batch_size, self.n_class), dtype=np.uint8) for i in range(self.n_len)]for i in range(self.batch_size):random_str = ''.join([random.choice(self.characters) for j in range(self.n_len)])X[i] = np.array(self.generator.generate_image(random_str)) / 255.0for j, ch in enumerate(random_str):y[j][i, :] = 0y[j][i, self.characters.find(ch)] = 1return X, y

测试代码:

def decode(y):y = np.argmax(np.array(y), axis=2)[:,0]return ''.join([characters[x] for x in y])
#注意每次运行输出结果可能不同,因为我们每次随机选择一个字符
data = CaptchaSequence(characters, batch_size=1, steps=1)  
X, y = data[0]
plt.imshow(X[0])
plt.title(decode(y))

结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8lx2zPpf-1693272688115)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230828214749531.png)]

注意:生成的验证码中字可能会出现不清晰的情况

例如这样:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w3VvkFwm-1693272688116)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230828191026978.png)]

总结原因可能有以下几点:

  1. 图片尺寸过小:在代码中,如果设置了验证码图片的宽度和高度为64和32,这可能导致生成的验证码图片较小,从而导致字体较小且不清晰。可以尝试增大图片尺寸,例如将宽度设置为128,高度设置为64。
  2. 图片缩放导致失真:在生成图片时,使用了np.array(self.generator.generate_image(random_str)) / 255.0 将图像转换为numpy数组并进行了归一化处理。如果在这个过程中对图像进行了缩放操作,可能会导致图像失真,从而影响字体的清晰度。可以尝试去除归一化处理,或者调整归一化的方式,确保图像不失真。
  3. 字体类型和大小:验证码生成器ImageCaptcha使用默认的字体类型和大小生成验证码。如果默认字体类型和大小不适合生成清晰的验证码,可以尝试更换字体类型并调整字体大小。可以参考ImageCaptcha的文档,了解如何更改字体类型和大小。
  4. 图像参数调整:除了上述因素外,还可以尝试调整一些图像生成的参数,例如干扰线的宽度、噪点的数量等,以提高验证码的清晰度。

五、定义网络结构

train_data = CaptchaSequence(characters, batch_size=512, steps=1000)
valid_data = CaptchaSequence(characters, batch_size=128, steps=100)
x_train, y_train = train_data[0]
x_val, y_val = valid_data[0]
from tensorflow.keras.models import *
from tensorflow.keras.layers import *input_tensor = Input((height, width, 3))
x = input_tensor
for num_cnn,num_kernel in enumerate([32,16,8]):for j in range(num_cnn):x = Conv2D(num_kernel, kernel_size=(3,3), padding='same', kernel_initializer='he_uniform')(x)x = Conv2D(num_kernel, kernel_size=(3,3), padding='same')(x)x = BatchNormalization()(x)x = Activation('relu')(x)x = MaxPooling2D(pool_size=(2,2))(x)x = Flatten()(x)
x = [Dense(n_class, activation='softmax',name='c%d'%(i+1))(x) for i in range(n_len)]
model = Model(inputs=input_tensor, outputs=x)
model.summary()

网络结构总结如下:

Model: "model"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_1 (InputLayer)            [(None, 64, 128, 3)] 0                                            
__________________________________________________________________________________________________
conv2d (Conv2D)                 (None, 64, 128, 16)  448         input_1[0][0]                    
__________________________________________________________________________________________________
conv2d_1 (Conv2D)               (None, 64, 128, 16)  2320        conv2d[0][0]                     
__________________________________________________________________________________________________
batch_normalization (BatchNorma (None, 64, 128, 16)  64          conv2d_1[0][0]                   
__________________________________________________________________________________________________
activation (Activation)         (None, 64, 128, 16)  0           batch_normalization[0][0]        
__________________________________________________________________________________________________
max_pooling2d (MaxPooling2D)    (None, 32, 64, 16)   0           activation[0][0]                 
__________________________________________________________________________________________________
conv2d_2 (Conv2D)               (None, 32, 64, 8)    1160        max_pooling2d[0][0]              
__________________________________________________________________________________________________
conv2d_3 (Conv2D)               (None, 32, 64, 8)    584         conv2d_2[0][0]                   
__________________________________________________________________________________________________
batch_normalization_1 (BatchNor (None, 32, 64, 8)    32          conv2d_3[0][0]                   
__________________________________________________________________________________________________
activation_1 (Activation)       (None, 32, 64, 8)    0           batch_normalization_1[0][0]      
__________________________________________________________________________________________________
max_pooling2d_1 (MaxPooling2D)  (None, 16, 32, 8)    0           activation_1[0][0]               
__________________________________________________________________________________________________
conv2d_4 (Conv2D)               (None, 16, 32, 8)    584         max_pooling2d_1[0][0]            
__________________________________________________________________________________________________
conv2d_5 (Conv2D)               (None, 16, 32, 8)    584         conv2d_4[0][0]                   
__________________________________________________________________________________________________
batch_normalization_2 (BatchNor (None, 16, 32, 8)    32          conv2d_5[0][0]                   
__________________________________________________________________________________________________
activation_2 (Activation)       (None, 16, 32, 8)    0           batch_normalization_2[0][0]      
__________________________________________________________________________________________________
max_pooling2d_2 (MaxPooling2D)  (None, 8, 16, 8)     0           activation_2[0][0]               
__________________________________________________________________________________________________
flatten (Flatten)               (None, 1024)         0           max_pooling2d_2[0][0]            
__________________________________________________________________________________________________
c1 (Dense)                      (None, 36)           36900       flatten[0][0]                    
__________________________________________________________________________________________________
c2 (Dense)                      (None, 36)           36900       flatten[0][0]                    
__________________________________________________________________________________________________
c3 (Dense)                      (None, 36)           36900       flatten[0][0]                    
__________________________________________________________________________________________________
c4 (Dense)                      (None, 36)           36900       flatten[0][0]                    
==================================================================================================
Total params: 153,408
Trainable params: 153,344
Non-trainable params: 64

六、训练模型

开始训练

from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint
from tensorflow.keras.optimizers import Adamcallbacks = [EarlyStopping(patience=3), ModelCheckpoint('cnn_best.h5', save_best_only=True)]model.compile(loss='categorical_crossentropy',optimizer=Adam(1e-3), metrics=['accuracy'])
history = model.fit(x_train, y_train, epochs=100, validation_data=(x_val,y_val),callbacks=callbacks, verbose=1)

载入最好的模型继续训练一会

model.load_weights('cnn_best.h5')callbacks = [EarlyStopping(patience=3),ModelCheckpoint('cnn_best.h5', save_best_only=True)]
#学习率降低,
model.compile(loss='categorical_crossentropy',optimizer=Adam(1e-4), metrics=['accuracy'])
model.fit(x_train, y_train, epochs=100, validation_data=(x_val,y_val),callbacks=callbacks, verbose=1)

保存最好的模型

model.save('../cnn_best.h5')

七、测试模型

X, y = data[0]
y_pred = model.predict(X)
plt.title('real: %s pred:%s'%(decode(y), decode(y_pred)))
plt.imshow(X[0], cmap='gray')
plt.axis('off')

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q0NnLMwd-1693272688117)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20230828215633050.png)]

可见测试模型效果并不理想,因为我们的训练迭代次数少,网络结构简单,不过我们可以增加网络层数,调节网络参数然后重新训练一个更好的模型。

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

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

相关文章

ASUS华硕天选4笔记本电脑FA507XV原厂Windows11系统22H2

天选四FA507X原装系统自带所有驱动、出厂主题壁纸LOGO、Office办公软件 华硕电脑管家、奥创控制中心等预装程序,恢复出厂状态W11 链接:https://pan.baidu.com/s/1SPoFW7wR5KawGu-yMckNzg?pwdayxd 提取码:ayxd

【数据分析】统计量

1. 均值、众数描述数据的集中趋势度量,四分位差、极差描述数据的离散程度。 2. 标准差、四分位差、异众比率度量离散程度,协方差是度量相关性。 期望值分别为E[X]与E[Y]的两个实随机变量X与Y之间的协方差Cov(X,Y)定义为: 从直观上来看&…

Docker拉取RocketMQ及可视化界面

本文介绍Docker拉取RocketMQ及可视化界面操作步骤 Linux下安装Docker请参考:Linux安装Docker 文章目录 安装namesrv创建挂载目录授权相关权限拉取镜像运行容器查看运行情况 安装Broker创建挂载目录及配置文件目录授权相关权限创建配置文件运行容器查看运行情况 安装…

C++day6(多态实现动物园的讲解员和动物表演的相关介绍、用函数模板实现不同数据类型的交换功能)

1.比喻:动物园的讲解员和动物表演 想象一下你去了一家动物园,看到了许多不同种类的动物,如狮子、大象、猴子等。现在,动物园里有一位讲解员,他会为每种动物表演做简单的介绍。 在这个场景中,我们可以将动…

李宏毅 2022机器学习 HW2 上分路线

baseline增加concat_nframes (提升明显)增加batchnormalization 和 dropout增加hidden layer宽度至512 (提升明显) 提交文件命名规则为 prediction_{concat_nframes}[{n_hidden_layers}{dropout}_bn].csv

如何向BertModel增加字符

这里写自定义目录标题 看起来add_special_tokens和add_tokens加入的新token都不会被切分。

vue3使用Elementplus 动态显示菜单icon不生效

1.问题描述 菜单icon由后端提供&#xff0c;直接用的字符串返回&#xff0c;前端使用遍历显示&#xff0c;发现icon不会显示 {id: 8, path:/userManagement, authName: "用户管理", icon: User, rights:[view]}, <el-menu-item :index"menu.path" v-f…

手写数字识别之网络结构

目录 手写数字识别之网络结构 数据处理 经典的全连接神经网络 卷积神经网络 手写数字识别之网络结构 无论是牛顿第二定律任务&#xff0c;还是房价预测任务&#xff0c;输入特征和输出预测值之间的关系均可以使用“直线”刻画&#xff08;使用线性方程来表达&#xff09…

机器学习笔记 - 基于OpenMMLab在自定义数据集上训练RTMDet网络

一、什么是 RTMDet? RTMDet是一种高效的实时目标检测器,其自报告指标优于YOLO 系列。它在COCO上实现了52.8% 的 AP ,在 NVIDIA 3090 GPU 上实现了300+ FPS,使其成为当前号称最快、最准确的目标检测器之一。 RTMDet 与其他实时物体检测器的对比。 RTMDet 采用了一种…

Windows-docker集成SRS服务器的部署和使用

Windows-docker集成SRS服务器的部署和使用 一、Windows Docker安装 Docker Desktop 官方下载地址&#xff1a; https://docs.docker.com/desktop/install/windows-install/ 下载windows版本的就可以了。 注意&#xff1a;此方法仅适用于 Windows 10 操作系统专业版、企业版、…

3D模型转换工具HOOPS Exchange助力打造虚拟现实应用程序

挑战&#xff1a; 支持使用各种 CAD 系统和 CAD 文件格式的客户群向可视化硬件提供快速、准确的数据加载提供对详细模型信息的访问&#xff0c;同时确保高帧率性能 解决方案&#xff1a; HOOPS Exchange领先的CAD数据转换工具包 结果&#xff1a; 确保支持来自领先工程软件…

如何DIY制作干洗店洗护小程序

洗护行业正逐渐迎来线上化的浪潮&#xff0c;传统的干洗店也开始尝试将业务线上化&#xff0c;以提供更便捷的服务给消费者。而制作一款洗护小程序&#xff0c;成为了干洗店实现线上化的重要一环。今天&#xff0c;我们就来分享一下如何使用第三方制作平台制作洗护小程序的教程…

四、Kafka Broker

4.1.1 Zookeeper 存储的 Kafka 信息 4.1.2 Kafka Broker 总体工作流程 4.2 生产经验 - 节点的服役和退役 自己的理解&#xff1a;其实就是将kafka的分区&#xff0c;负载到集群中的各个节点上。 1、服役新节点 2、退役旧节点 4.3 kafka副本 1、副本的作用 2、Leader的选…

go gin 自定义验证

我们上一篇已经提到了gin中binding时候可以指定json字段大小等限制&#xff0c;但是那个错误却是英文的&#xff0c;现在想搞成中文的&#xff0c;以便前端可读&#xff0c;demo如下 package mainimport ("net/http""reflect""github.com/gin-gonic/…

1.RabbitMQ介绍

一、MQ是什么&#xff1f;为什么使用它 MQ&#xff08;Message Queue&#xff0c;简称MQ&#xff09;被称为消息队列。 是一种用于在应用程序之间传递消息的通信方式。它是一种异步通信模式&#xff0c;允许不同的应用程序、服务或组件之间通过将消息放入队列中来进行通信。这…

深度学习3. 强化学习-Reinforcement learning | RL

强化学习是机器学习的一种学习方式&#xff0c;它跟监督学习、无监督学习是对应的。本文将详细介绍强化学习的基本概念、应用场景和主流的强化学习算法及分类。 目录 什么是强化学习&#xff1f; 强化学习的应用场景 强化学习的主流算法 强化学习(reinforcement learning) …

css 分割线中间带文字

效果图 代码块&#xff08;自适应&#xff09; <div class"line"><span class"text">我是文字</span></div>.line{height:0;border-top:1px solid #000;text-align:center;}.text{position:relative;top:-14px;background-color:#…

C语言(第三十二天)

1. 递归是什么&#xff1f; 递归是学习C语言函数绕不开的一个话题&#xff0c;那什么是递归呢&#xff1f; 递归其实是一种解决问题的方法&#xff0c;在C语言中&#xff0c;递归就是函数自己调用自己。 写一个史上最简单的C语言递归代码&#xff1a; #include <stdio.h>…

2023.8.25 关于 Selenium 常用 API 详解

目录 引言 打开页面 查找页面元素 输入文本 点击操作 提交操作 清除文本 获取文本和属性值 ​编辑 选择多个元素 获取页面标题和URL 等待操作 浏览器操作 多层框架定位 窗口操作 屏幕截图 下拉框元素选择操作 ​编辑 执行脚本 文件上传 引言 本文讲的所有…

广州华锐互动:VR垃圾分类虚拟科普系统让学习过程更加丰富有趣

在我们的日常生活中&#xff0c;垃圾分类已成为一项重要的公民责任。然而&#xff0c;由于缺乏对垃圾分类的深入理解和相关知识&#xff0c;许多人在实践中往往感到困惑和挫败。为了解决这个问题&#xff0c;一种创新的解决方案应运而生&#xff1a;垃圾分类VR虚拟仿真教学系统…