使用 Python 和 Keras 进行验证码识别:深度学习方法

news/2025/2/2 13:25:08/文章来源:https://www.cnblogs.com/ocr12/p/18696796

验证码(CAPTCHA)作为一种常见的安全机制,已经被广泛应用于防止自动化攻击。在本教程中,我们将使用 Python 和 Keras 深度学习框架来训练一个简单的卷积神经网络(CNN),用于验证码的自动识别。

  1. 环境准备
    安装依赖
    首先,你需要确保已安装以下软件和库:

Python 3.x
Keras
TensorFlow
OpenCV
Pillow(用于处理图像)
可以使用 pip 安装所需库:

bash
更多内容访问ttocr.com或联系1436423940
pip install tensorflow keras opencv-python pillow numpy
数据集准备
我们需要一个包含验证码的图像数据集。可以通过以下方式获取数据集:

自己生成数据集:使用脚本生成带有随机数字和字母的验证码图片。
从网上下载数据集:例如,使用 CAPTCHA 数据集 或其他公开数据集。
假设我们已经准备好了一个包含验证码图像和标签的数据集。每张图像的标签是对应的文本(如 "A12B")。

  1. 代码实现
    (1) 构建卷积神经网络(CNN)
    python

import tensorflow as tf
from tensorflow.keras import layers, models
import numpy as np
import cv2
import os
from tensorflow.keras.utils import to_categorical
from sklearn.model_selection import train_test_split

定义卷积神经网络模型

def create_model(input_shape, num_classes):
model = models.Sequential([
layers.Conv2D(32, (3, 3), activation='relu', input_shape=input_shape),
layers.MaxPooling2D((2, 2)),
layers.Conv2D(64, (3, 3), activation='relu'),
layers.MaxPooling2D((2, 2)),
layers.Conv2D(128, (3, 3), activation='relu'),
layers.MaxPooling2D((2, 2)),
layers.Flatten(),
layers.Dense(128, activation='relu'),
layers.Dropout(0.5),
layers.Dense(num_classes, activation='softmax')
])
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
return model
(2) 处理验证码图像数据
验证码图像通常包含字母和数字,因此我们需要将图像转换为适合神经网络输入的格式。

python

def preprocess_image(image_path):
# 读取图像并转换为灰度
img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, (128, 64)) # 将图像大小调整为一致的尺寸
img = img / 255.0 # 归一化到 [0, 1] 范围
return img

def load_data(data_dir):
images = []
labels = []
for filename in os.listdir(data_dir):
if filename.endswith(".png"):
img_path = os.path.join(data_dir, filename)
img = preprocess_image(img_path)
images.append(img)

        # 提取标签:假设标签嵌入在文件名中,如 "A12B.png"label = filename.split(".")[0]labels.append(label)images = np.array(images)
images = np.expand_dims(images, axis=-1)  # 添加通道维度
return images, labels

(3) 标签处理
验证码通常包含多个字符,因此需要对标签进行适当的处理。

python

def encode_labels(labels, char_set):
label_encoded = []
for label in labels:
encoded = [char_set.index(c) for c in label]
label_encoded.append(encoded)
return np.array(label_encoded)

def create_char_set():
# 定义字符集:可以根据需要自定义字母、数字或其他符号
char_set = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
return char_set
(4) 训练和评估模型
python

加载数据

data_dir = 'captcha_images'
images, labels = load_data(data_dir)

创建字符集

char_set = create_char_set()
num_classes = len(char_set)

对标签进行编码

labels_encoded = encode_labels(labels, char_set)
labels_encoded = to_categorical(labels_encoded, num_classes=num_classes)

将数据集分为训练集和测试集

X_train, X_test, y_train, y_test = train_test_split(images, labels_encoded, test_size=0.2, random_state=42)

创建和训练模型

input_shape = X_train.shape[1:] # 输入图像的形状
model = create_model(input_shape, num_classes)

训练模型

model.fit(X_train, y_train, batch_size=32, epochs=10, validation_data=(X_test, y_test))

评估模型

loss, accuracy = model.evaluate(X_test, y_test)
print(f'Test accuracy: {accuracy * 100:.2f}%')
3. 代码解析

  1. 模型架构
    卷积层(Conv2D):用于提取图像的特征,如字符的形状。
    池化层(MaxPooling2D):用于减小图像的尺寸,减少计算量。
    全连接层(Dense):通过全连接层将卷积层提取的特征映射到分类空间。
    Dropout:防止过拟合。
  2. 数据预处理
    图像灰度化和归一化:我们将图像转换为灰度,并将像素值归一化到 [0, 1] 范围,以便输入神经网络。
    标签编码:验证码标签通常包含字母和数字。我们将标签中的每个字符映射为数字(如字母 'A' 映射为 0,'B' 映射为 1,依此类推)。
  3. 模型训练与评估
    我们将数据集分为训练集和测试集,并使用 Adam 优化器 和 交叉熵损失 来训练模型。
    训练后,我们在测试集上评估模型的准确性,并打印结果。
  4. 进一步优化
  5. 增加数据量
    为了提高模型的泛化能力,您可以通过 数据增强(如旋转、平移、缩放等)来增加训练数据的多样性。

python

from tensorflow.keras.preprocessing.image import ImageDataGenerator

datagen = ImageDataGenerator(
rotation_range=10,
width_shift_range=0.1,
height_shift_range=0.1,
shear_range=0.1,
zoom_range=0.1,
horizontal_flip=True
)

datagen.fit(X_train)
2. 使用更复杂的网络架构
尝试使用更深的网络架构或预训练模型(如 VGG16 或 ResNet),可以提高模型的表现。
3. 使用 LSTM 或 CTC(Connectionist Temporal Classification)
验证码识别的标签通常是字符序列,因此可以使用 LSTM 网络(长短期记忆网络)或 CTC 损失来优化序列预测。

  1. 运行模型
    在确保训练数据和标签都准备好后,运行模型进行训练和评估:

bash

python captcha_recognition.py
模型训练完成后,可以在测试集上评估它的表现,并根据需要进行调优。

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

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

相关文章

Android Studio 2024 不需要三方插件,直接wifi 开发调试,真方便

在测试旧版本时,wifi插件折腾了几天,还是没折腾上,最后下载了最新Android Studio Ladybug Feature Drop | 2024.2.2版本,发现居然已经集成,且放到了最显眼的位置,wifi开发,一步到位了。手机中,进开发者模式,选中 无线调试 ,再点使用二维码配对设备然后扫码,即可,…

Maven高级 -2025/1/22

分模块开发 依赖管理 可选依赖 <dependency><groupId>com.itheima</groupId><artifactId>maven_03_pojo</artifactId><version>1.0-SNAPSHOT</version><!--可选依赖是隐藏当前工程所依赖的资源,隐藏后对应资源将不具有依赖传递-…

独立开发经验谈:如何借助 AI 辅助产品 UI 设计

我在业余时间开发了一款自己的独立产品:升讯威在线客服与营销系统。陆陆续续开发了几年,从一开始的偶有用户尝试,到如今线上环境和私有化部署均有了越来越多的稳定用户,在这个过程中,我也积累了不少如何开发运营一款独立产品的经验。我将在本文中介绍如何借助 AI 辅助产品…

Lazarus4Android 环境搭建

Lazarus4Android 开发环境搭建Lazarus4Android 开发环境搭建 一、下载相关文件最关键的就是这两个文件,其他的JDK、NDK、Java环境另说。 这里要注意,gradle版本必须小于7,不然无法使用。 二、IDE内部设置 安装完成laz4A之后可能会报错,无需理会,启动IDE即可。安装卸载软件…

14-断点调试单个用例

在pycharm的Terminal输入hytest,其实是输入了python -m hytest.run,意思就是执行了hytest包里面的run.py文件 然后再点击debug按钮的时候就可以进行调试了,相当于执行了cd H:\my\autotest后 python.exe -m hytest.run --test *0101

博图18安装过程记录

博图V18安装过程记录刚开通博客园,搬运一些之前的帖子过来。 博图18安装过程记录 下载 西门子中智赛官网给的链接,是正版软件。 安装 TIA Potral STEP7将ISO解压或装载。管理员身份运行。 选择典型安装,等待安装完成。 插曲1 无法更改安装路径 这是因为之前安装过博图15.1(或…

题解:P11617 递推

前言 第一次在 OI 中见到求数列极限的题,有点意思。 但是为什么会过这么多人啊。 思路分析 做一点尝试: \[\sum_{i=m} \sum_{j=0}^{m} r_ja_{i-j}=0 \]然后对于相同的 \(a_i\),合并同类项: \[\sum_{i=m}\sum_{j=0}^{m} r_ja_i + \sum_{i=0}^{m-1}\sum_{j=0}^{i} r_{m-j}a_i…

AI编程助手带来的洞察和启发——程序员职业的变革

前言 从chatgpt的横空出世到国内大模型的强势崛起, 从AI只会写诗作画到辅助编程, AI作为新质生产力的重要角色逐渐进入各行各业,为行业带来新的可能性。Cursor、通义灵码这类"AI程序员"的出现一方面给编码工作带来了便利,另一方面也对软件从业人员带来极大的冲击…

个人数据保全计划:部署joplin server笔记同步服务

前言 在这个数据爆炸的时代,个人数据的价值愈发凸显,成为我们生活与工作中无可替代的重要资产。上一篇文章里,我介绍了从印象笔记迁移至 Joplin 的过程,这是我寻求数据自主掌控的关键一步。在探索同步方案时,我尝试了 OneDrive,原以为它能提供稳定高效的同步服务,可实际…

【deepseek】在deepin系统上部署运行deepseek-r1

环境配置LM-Studio官网:https://lmstudio.ai/修改“镜像源”cd /opt/apps/ai.lmstudio/files/LM_Studio/resources/app/.webpack/main 使用vscode打开进行编辑,./resources/app/.webpack/main/index.js./resources/app/.webpack/main/llmworker.js./resources/app/.webpack/m…

C++ 编译静态链接 (-static)

因为很长一段时间内并不知道这个编译参数究竟是干什么用的,只知道这个参数在 NOI 系列赛事中普遍使用,并且会导致编译输出文件变大,直到碰到具体问题了才发现这个参数的作用 -static 参数是静态链接开关,不加这个参数默认是动态链接,加上这个参数以后是静态链接,先说一下…

https://avoid.overfit.cn/post/e57ca7e30ea74ad380b093a2599c9c01

DeepSeekMoE是一种创新的大规模语言模型架构,通过整合专家混合系统(Mixture of Experts, MoE)、改进的注意力机制和优化的归一化策略,在模型效率与计算能力之间实现了新的平衡。DeepSeekMoE架构融合了专家混合系统(MoE)、多头潜在注意力机制(Multi-Head Latent Attention, ML…