使用CNN进行验证码识别:深度学习与图像预处理教程

验证码(CAPTCHA)广泛用于区分人类和自动化程序(如机器人),通常由扭曲的字母、数字或符号组成。为了实现验证码的自动识别,深度学习尤其是卷积神经网络(CNN)非常有效。本文将带你一起使用CNN构建一个验证码识别模型,并应用图像预处理技术来优化训练数据。
在这里插入图片描述
在这里插入图片描述

1. 预处理验证码图像

在训练模型之前,我们需要对图像进行一些预处理操作,以便让CNN能够更好地学习图像特征。以下是常见的图像预处理步骤:

  • 自适应阈值化:根据图像周围的区域动态确定阈值,适合处理光照不均的图像。
  • 形态学操作:如膨胀(Dilation)和腐蚀(Erosion),可以帮助去除噪声和连接断裂的字符。
  • 高斯模糊:去除图像中的噪声,平滑图像。

1.1 自适应阈值化

自适应阈值化是通过计算图像中每个小区域的均值或加权均值来确定该区域的阈值。这使得我们能更好地处理亮度不均的图像。

import cv2
import matplotlib.pyplot as pltpath1 = './samples/23n88.png'
path2 = './samples/23mdg.png'# 读取图像
img1 = cv2.imread(path1, cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread(path2, cv2.IMREAD_GRAYSCALE)# 自适应阈值化
thresh_img1 = cv2.adaptiveThreshold(img1, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 145, 0)
thresh_img2 = cv2.adaptiveThreshold(img2, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 145, 0)# 显示阈值化结果
plt.figure(figsize=(20,5))
plt.subplot(1, 2, 1)
plt.imshow(thresh_img1, cmap='gray')
plt.subplot(1, 2, 2)
plt.imshow(thresh_img2, cmap='gray')
plt.show()

1.2 形态学操作(闭运算)

闭运算是先进行膨胀操作,然后进行腐蚀操作,主要用于去除小的噪点并填补字符中的小空洞。

# 形态学操作:闭运算
close_img1 = cv2.morphologyEx(thresh_img1, cv2.MORPH_CLOSE, np.ones((5,2), np.uint8))
close_img2 = cv2.morphologyEx(thresh_img2, cv2.MORPH_CLOSE, np.ones((5,2), np.uint8))# 显示闭运算后的结果
plt.figure(figsize=(20,5))
plt.subplot(1, 2, 1)
plt.imshow(close_img1, cmap='gray')
plt.subplot(1, 2, 2)
plt.imshow(close_img2, cmap='gray')
plt.show()

1.3 膨胀操作

膨胀操作通过使用一个结构化元素对图像进行扫描,选择局部区域的最大值,通常用于扩展白色区域。

# 膨胀操作
dilate_img1 = cv2.dilate(close_img1, np.ones((2,2), np.uint8), iterations=1)
dilate_img2 = cv2.dilate(close_img2, np.ones((2,2), np.uint8), iterations=1)# 显示膨胀后的结果
plt.figure(figsize=(20,5))
plt.subplot(1, 2, 1)
plt.imshow(dilate_img1, cmap='gray')
plt.subplot(1, 2, 2)
plt.imshow(dilate_img2, cmap='gray')
plt.show()

1.4 高斯模糊

高斯模糊有助于去除图像中的噪点,使图像更加平滑。

# 高斯模糊
gauss_img1 = cv2.GaussianBlur(dilate_img1, (1,1), 0)
gauss_img2 = cv2.GaussianBlur(dilate_img2, (1,1), 0)# 显示模糊后的结果
plt.figure(figsize=(20,5))
plt.subplot(1, 2, 1)
plt.imshow(gauss_img1, cmap='gray')
plt.subplot(1, 2, 2)
plt.imshow(gauss_img2, cmap='gray')
plt.show()

1.5 将图像切割成小块

由于验证码通常包含多个字符,我们需要将每个字符切割出来作为模型的输入。这里,我们将图像分割成多个小块。

# 切割图像
image_list1 = [gauss_img1[10:50, 30:50], gauss_img1[10:50, 50:70], gauss_img1[10:50, 70:90], gauss_img1[10:50, 90:110], gauss_img1[10:50, 110:130]]
image_list2 = [gauss_img2[10:50, 30:50], gauss_img2[10:50, 50:70], gauss_img2[10:50, 70:90], gauss_img2[10:50, 90:110], gauss_img2[10:50, 110:130]]# 显示切割结果
plt.figure(figsize=(20,5))
for i in range(5):plt.subplot(1, 5, i+1)plt.imshow(image_list1[i], cmap='gray')
plt.show()

2. 构建卷积神经网络(CNN)

接下来,我们将使用卷积神经网络(CNN)进行字符识别。CNN对于图像分类任务非常有效,因为它能够自动提取图像特征。

from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, BatchNormalization, Dropoutdef cnn_model(input_shape, num_classes):model = Sequential()model.add(Conv2D(32, (3, 3), padding='same', activation='relu', input_shape=input_shape))model.add(BatchNormalization())model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Dropout(0.2))model.add(Conv2D(64, (3, 3), padding='same', activation='relu'))model.add(BatchNormalization())model.add(MaxPooling2D(pool_size=(2, 2)))model.add(Dropout(0.2))model.add(Flatten())model.add(Dense(128, activation='relu'))model.add(Dropout(0.5))model.add(Dense(num_classes, activation='softmax'))model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])return model# 创建模型
model = cnn_model((40, 20, 1), 19)  # 假设有19个类
model.summary()

3. 数据增强与过采样

3.1 SMOTE

SMOTE(合成少数类过采样技术)可以帮助我们增加少数类的样本量,以解决类别不平衡的问题。

from imblearn.over_sampling import SMOTE# 假设 X_train 和 y_train 是训练集和标签
X_train = np.reshape(X_train, (4160, 40*20*1))  # 扁平化图像
X_train, y_train = SMOTE(sampling_strategy='auto', random_state=1).fit_resample(X_train, y_train)X_train = np.reshape(X_train, (8037, 40, 20, 1))  # 恢复图像形状

3.2 使用 ImageDataGenerator 进行图像数据增强

数据增强可以生成更多样化的训练数据,从而帮助模型泛化能力的提升。

from keras.preprocessing.image import ImageDataGenerator# 定义数据增强
traingen = ImageDataGenerator(rotation_range=5, width_shift_range=[-2, 2])
traingen.fit(X_train)# 使用生成器
train_set = traingen.flow(X_train, y_train)

4. 模型训练与评估

我们可以使用Keras的ModelCheckpointReduceLROnPlateau回调来保存最佳模型,并在训练过程中调整学习率。

from keras.callbacks import ModelCheckpoint, ReduceLROnPlateaucheckp = ModelCheckpoint('./captcha_model.h5', monitor='val_loss', save_best_only=True)
reduce = ReduceLROnPlateau(monitor='val_loss', patience=20, verbose=1)history = model.fit(traingen.flow(X_train, y_train, batch_size=32), validation_data=(X_test, y_test), epochs=10, callbacks=[checkp, reduce])

5. 测试与预测

训练完成后,我们可以用测试集进行评估,并通过model.predict()进行预测。

# 加载最佳模型
model = load_model('./captcha_model.h5')# 预测
pred = model.predict(X_test)
pred = np.argmax(pred, axis=1)# 打印准确率和分类报告
from sklearn.metrics import accuracy_score, classification_report
print('Accuracy:', accuracy_score(y_test, pred))
print(classification_report(y_test, pred))

6. 测试样本

我们还可以使用训练好的模型对一些新的验证码样本进行预测。

def get_demo(img_path):img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)img = t_img(img)img = c_img(img)img = d_img(img)img = b_img(img)image_list = [img[10:50, 30:50], img[10:50, 50:70], img[10:50, 70:90], img[10:50, 90:110], img[10:50, 110:130]]Xdemo = np.array([img_to_array(Image.fromarray(img)) for img in image_list]) / 255.0ydemo = model.predict(Xdemo)ydemo = np.argmax(ydemo, axis=1)for res in ydemo:print(info[res])print(img_path[-9:])

在这里插入图片描述
在这里插入图片描述

总结

通过图像预处理技术、数据增强、以及卷积神经网络的结合,我们可以构建一个高效的验证码识别系统。在实际应用中,可以根据具体的验证码类型调整预处理和模型参数,以提高准确性和泛化能力。

需要数据集的添加

在这里插入图片描述

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

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

相关文章

STM32 51单片机设计半导体制冷片温控设计

目录 前言 一、本设计主要实现哪些很“开门”功能? 二、电路设计原理图 1.电路图采用Altium Designer进行设计: 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 基于STM32与51单片机的半导体制冷片温控设计 前言 随着现代工业、医疗…

ssm114基于SSM框架的网上拍卖系统的设计与实现+vue(论文+源码)_kaic

摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势,商品拍卖当然也不能排除在外,随着商品拍卖管理的不断成熟,它彻底改变了过去传统的经营管理方式,不仅使商品…

算法每日双题精讲——滑动窗口(长度最小的子数组,无重复字符的最长子串)

🌟快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区。 🌟 别再犹豫了!快来订阅我们的算法每日双题精讲专栏,一起踏上算法学习的精彩之旅吧!💪…

批量从Excel某一列中找到符合要求的值并提取其对应数据

本文介绍在Excel中,从某一列数据中找到与已知数据对应的字段,并提取这个字段对应数值的方法。 首先,来明确一下我们的需求。现在已知一个Excel数据,假设其中W列包含了上海市全部社区的名称,而其后的Y列则是这些社区对应…

MaxKB

docker 安装 MaxKB docker run -d --namemaxkb --restartalways -p 8080:8080 -v ~/.maxkb:/var/lib/postgresql/data -v ~/.python-packages:/opt/maxkb/app/sandbox/python-packages cr2.fit2cloud.com/1panel/maxkbdocker psCONTAINER ID IMAGE …

越南很火的slots游戏投放Google谷歌广告策略

越南很火的slots游戏投放Google谷歌广告策略 越南的slot游戏市场正在借助Google广告代投策略推动增长。随着智能手机的普及和互联网的普及,越南的游戏市场迅速增长,吸引了越来越多的投资者和开发者进入该市场。 在这个竞争激烈的市场中,广告…

现代无线通信接收机架构:超外差、零中频与低中频的比较分析

写在前面:本博客是对三种接收机架构的学习笔记,仅供个人学习记录使用。内容主要是上网查阅的资料,以及个人的一些理解。如有错误的地方请指出! 文章目录 一、通信机基本架构1、射频发射级的基本组成及完成功能2、射频接收级的基本…

探索MoviePy:Python视频编辑的瑞士军刀

文章目录 🎬 探索MoviePy:Python视频编辑的瑞士军刀第一部分:背景介绍第二部分:MoviePy是什么?第三部分:如何安装MoviePy?第四部分:MoviePy的基本函数使用方法1. 视频剪辑2. 视频拼接…

修改数据库和表的字符集

1、修改数据库字符集 mysql> show CHARACTER SET; 查看所有字符集 mysql> show create database wordpress; 查看数据库wordpress当前字符集mysql> alter database wordpress character set gbk; 将数据库wordpress字符集改为gb…

67页PDF |埃森哲_XX集团信息发展规划IT治理优化方案(限免下载)

一、前言 这份报告是埃森哲_XX集团信息发展规划IT治理优化方案,报告中详细阐述了XX集团如何优化IT治理结构以适应新的要求。报告还分析了集团管控模式的变化,提出了六大业务中心的差异化管控策略,并探讨了这些变化对IT治理模式的影响。报告进…

C# WPF FontDialog字体对话框,ColorDialog颜色对话框 引用

WPF 并没有内置FontDialog和ColorDialog,但可以通过引用 Windows Forms 的控件来实现字体和颜色选择对话框功能。FontDialog 允许用户选择字体、样式、大小等设置。 添加 Windows Forms的引用 项目工程:右键“引用”》“添加引用”》勾选System.Windows…

家政服务小程序,家政行业数字化发展下的优势

今年以来,家政市场需求持续增长,市场规模达到了万亿级别,家政服务行业成为了热门行业之一! 家政服务种类目前逐渐呈现了多样化,月嫂、保姆、做饭保洁、收纳、维修等家政种类不断出现,满足了居民日益增长的…

kubernetes简单入门实战

本章将介绍如何在kubernetes集群中部署一个nginx服务,并且能够对其访问 Namespace Namespace是k8s系统中一个非常重要的资源,它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。 默认情况下,k8s集群中的所有的Pod都是可以相…

2分钟在阿里云ECS控制台部署个人应用(图文示例)

作为一名程序员,我有大量的个人代码和应用托管在Github/Gitee这些代码仓库。当我想要部署这些代码到我的阿里云ECS服务器时,往往会很麻烦,主要问题有这些: 需要手动安装和配置git,过程非常繁琐。每次都需要登录到机器…

【Kafka】集成案例:与Spark大数据组件的协同应用

🐇明明跟你说过:个人主页 🏅个人专栏:《大数据前沿:技术与应用并进》🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、什么是kafka 2、Kafka 的主要特性 3、Kafka 的…

Docker 的安装与使用

Docker 的安装 Docker 是一个开源的商业产品,有两个版本:社区版(Community Edition,缩写为 CE)和企业版(Enterprise Edition,缩写为 EE)。 Docker CE 的安装请参考官方文档&#xf…

逐行加载 HTML 内容并实时显示效果:使用 wxPython 的实现

这篇博客中,我们将详细分析如何使用 wxPython 构建一个简单的桌面应用程序,用于逐行加载并显示 HTML 文件的内容,并在加载完成后通过浏览器组件呈现最终页面。通过该应用,我们可以体验到逐行加载 HTML 内容的视觉效果,…

【Linux】HTTP协议和HTTPS加密

文章目录 HTTP1、概念2、认识URL3、协议格式、请求方法和状态码4、HTTP请求和响应报头5、Cookie和Session HTTPS1、对称和非对称加密2、对称非对称加密安全分析3、证书 HTTP 1、概念 我们在应用层定制协议时,不建议直接发送结构体对象,因为在不同的环境…

计算机网络 (1)互联网的组成

一、互联网的边缘部分 互联网的边缘部分由所有连接在互联网上的主机组成,这些主机又称为端系统(end system)。端系统可以是各种类型的计算机设备,如个人电脑、智能手机、网络摄像头等,也可以是大型计算机或服务器。端系…

网络延迟对Python爬虫速度的影响分析

Python爬虫因其强大的数据处理能力和灵活性而被广泛应用于数据抓取和网络信息收集。然而,网络延迟是影响爬虫效率的重要因素之一。本文将深入探讨网络延迟对Python爬虫速度的影响,并提供相应的代码实现过程,以帮助开发者优化爬虫性能。 网络…