TensorFlow 和 CRNN 的验证码识别系统实现

news/2025/2/11 23:37:15/文章来源:https://www.cnblogs.com/ocr12/p/18710704

在本文中,我们将介绍如何使用 TensorFlow 框架,结合 卷积神经网络(CNN) 和 递归神经网络(RNN)(具体是 CRNN,即卷积递归神经网络)实现验证码识别。验证码广泛用于防止自动化攻击,而通过深度学习技术,尤其是结合 CNN 和 RNN 的特性,我们可以构建一个高效的验证码识别系统。

  1. 环境准备
    首先,确保已经安装了必要的 Python 库。可以使用以下命令来安装:

pip install tensorflow numpy opencv-python pillow
TensorFlow:用于构建和训练深度学习模型。
NumPy:用于数据处理。
OpenCV:用于图像处理。
Pillow:用于图像处理。
2. 数据准备与预处理
验证码图像通常由多个字符组成。为了让深度学习模型有效地处理这些字符图像,我们需要对图像进行预处理。这些步骤包括:灰度化、缩放、归一化以及字符标签编码。

(1) 数据集加载与预处理
假设验证码的每个图像文件名包含验证码的内容(如 AB12.png 对应标签 AB12)。我们将创建一个数据集类来加载这些图像并对其进行预处理。

import os
import cv2
import numpy as np
import tensorflow as tf
from tensorflow.keras.utils import Sequence

class CaptchaDataset(Sequence):
def init(self, image_dir, char_set, batch_size=32, image_size=(128, 64), sequence_length=4):
self.image_dir = image_dir
self.image_paths = [os.path.join(image_dir, fname) for fname in os.listdir(image_dir)]
self.char_set = char_set
self.batch_size = batch_size
self.image_size = image_size
self.sequence_length = sequence_length

def __len__(self):return len(self.image_paths) // self.batch_sizedef __getitem__(self, idx):batch_paths = self.image_paths[idx * self.batch_size:(idx + 1) * self.batch_size]images = []labels = []for path in batch_paths:# 读取图像并进行灰度化img = cv2.imread(path, cv2.IMREAD_GRAYSCALE)img = cv2.resize(img, self.image_size)img = img.astype('float32') / 255.0  # 归一化处理# 获取标签:文件名作为标签label = os.path.basename(path).split('.')[0]label_encoded = [self.char_set.index(c) for c in label]# 填充标签,使其长度一致label_encoded = label_encoded + [0] * (self.sequence_length - len(label_encoded))images.append(img)labels.append(label_encoded)# 转换为numpy数组并返回return np.array(images).reshape(self.batch_size, *self.image_size, 1), np.array(labels)

字符集定义:包含大写字母和数字

char_set = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"

初始化数据集

train_dataset = CaptchaDataset(image_dir="captcha_images", char_set=char_set, batch_size=32)
(2) 标签编码
验证码中的每个字符将通过索引转换为数字。例如,“A” 对应 0,“B” 对应 1,以此类推。为了统一标签长度,我们在短标签后面添加零填充。

  1. 构建 CRNN 模型
    为了识别验证码中的字符,我们将构建一个 CRNN(卷积递归神经网络) 模型。CRNN 结合了 CNN 和 RNN(LSTM),CNN 用于提取图像的空间特征,RNN(LSTM)用于处理字符序列的时序依赖。

(1) 定义模型架构

from tensorflow.keras import layers, models

def build_crnn_model(input_shape=(64, 128, 1), num_classes=36, sequence_length=4):
input_img = layers.Input(shape=input_shape)

# 卷积层1
x = layers.Conv2D(32, (3, 3), activation='relu', padding='same')(input_img)
x = layers.MaxPooling2D((2, 2))(x)# 卷积层2
x = layers.Conv2D(64, (3, 3), activation='relu', padding='same')(x)
x = layers.MaxPooling2D((2, 2))(x)# 卷积层3
x = layers.Conv2D(128, (3, 3), activation='relu', padding='same')(x)
x = layers.MaxPooling2D((2, 2))(x)# 卷积层4
x = layers.Conv2D(256, (3, 3), activation='relu', padding='same')(x)# 转换为一维特征
x = layers.Reshape(target_shape=(-1, 256))(x)# LSTM 层:处理序列数据
x = layers.Bidirectional(layers.LSTM(128, return_sequences=True))(x)# 输出层
output = layers.Dense(num_classes, activation='softmax')(x)model = models.Model(inputs=input_img, outputs=output)return model

构建 CRNN 模型

model = build_crnn_model(input_shape=(64, 128, 1), num_classes=len(char_set), sequence_length=4)

编译模型

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.summary()
(2) 模型架构解释
卷积层(Conv2D):提取图像的局部特征。
池化层(MaxPooling2D):减少图像尺寸,从而减小计算量。
LSTM层:用于学习字符的时序依赖,帮助识别验证码中的字符顺序。
输出层:每个时间步(字符)生成一个分类结果。
4. 模型训练
使用 交叉熵损失函数 和 Adam优化器 来训练模型。

(1) 训练代码

epochs = 10
model.fit(train_dataset, epochs=epochs, steps_per_epoch=len(train_dataset), verbose=1)
(2) 训练过程
在每个训练周期,模型会通过前向传播计算输出,之后通过反向传播更新权重。使用训练集来计算误差并优化模型参数。

  1. 模型评估与预测
    训练完成后,我们可以使用测试集评估模型的性能,并对单个验证码图像进行预测。

(1) 评估模型

使用测试集评估模型

test_dataset = CaptchaDataset(image_dir="test_captcha_images", char_set=char_set, batch_size=32)
loss, accuracy = model.evaluate(test_dataset, steps=len(test_dataset), verbose=1)
print(f"Test Accuracy: {accuracy * 100:.2f}%")
(2) 进行预测
更多内容访问ttocr.com或联系1436423940
def predict_captcha(model, img_path, char_set, sequence_length=4):
img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, (128, 64))
img = img.astype('float32') / 255.0
img = np.expand_dims(img, axis=0) # 增加批次维度
img = np.expand_dims(img, axis=3) # 增加通道维度

# 预测
pred = model.predict(img)
pred_label = ''.join([char_set[np.argmax(pred[0][i])] for i in range(sequence_length)])return pred_label

测试预测

test_image_path = "captcha_images/test1.png"
predicted_label = predict_captcha(model, test_image_path, char_set)
print(f"Predicted CAPTCHA label: {predicted_label}")

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

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

相关文章

Deepseek最强白嫖指南-通过GROQ调用api使用deepseek-70B模型

众所周知最近deepseek很火,非常火!火出圈,各种博主割韭菜也是割到爆炸💥! 今天给大家写一个通过Groq调用Free api来使用deepseek的70B模型。当然不止这一个模型!DeepSeek-70B 是一款强大的大语言模型,您可以通过 Groq 提供的 API 免费调用该模型。以下是详细的教程,指…

【DeepSeek】本地DeepSeek下载慢,中断、内网无法安装方案来了

最近在群里有不少人反馈,ollama安装deepseek有以下几个问题。 1,特别慢,或者多次中断,导致下载不下来 2,无魔法 3,想在内网环境安装,没有网络 我研究了下解决方案。通过已经下载的模型,可以直接导入。 反向解析模型 查看本地的模型 ollama listNAME …

【Windows 日志】Windows 日志清理秘籍:基于登录日志精准清扫术

免责声明 如果使用本文档中的信息导致任何直接或间接的后果和损失,我们提醒您,这将由您个人承担。我们不承担由此产生的任何责任。前言 痕迹清理技术是渗透测试中的关键环节,它旨在消除操作痕迹以防止溯源、隐藏攻击手法,并为进一步的渗透活动争取时间。然而,并非每次渗透…

shell自动化编程简介0

自动化运维是未来的运维的必然趋势会写代码 会用工具Shell编程的特点简单、高效 功能强大 可移植性好作为运维开发人员,编写Shell脚本是第一步 误区:Shell编程就是Linux命令堆积?简单理解:Linux命令+编程语法(if/else、for、while、判断)经验之谈运维的核心就是执行正确的…

【免杀系列】 进程镂空

# 恶意软件 # 进程镂空免责声明 请注意,任何未经授权的使用或由此产生的直接或间接后果和损失,均由使用者自行承担。我们提供的资源和工具仅供学习和研究之用,我们不鼓励也不支持任何非法活动。前言 进程镂空(Process Hollowing),又称为“傀儡进程”,是一种恶意软件(…

关于this的练习

题目: 刚开始没有想到用面向对象的方法对书这个类进行操作 /* 我在练习中出现的问题: 1.读题时,不确定方法有没有返回值,以为自己在方法中写了输出语句,但是没有 2.在main函数中,发先需要返回值,并误将double认为int类型 3.在方法中修改返回值之后忘记加return语句 其实…

昆明理工大学25考研计算机调剂名额

--昆工昆明理工大学计算机技术人工智能软件工程网络空间安全计算机系统结构计算机软件与理论计算机应用技术网络与信息安全408考研综合程序设计891计算机专业核心综合数据库系统原理

【DeepSeek】打造智能微信机器人:wxauto 与 DeepSeek 的完美结合

免责声明: 本文仅用于交流学习,请大家务必保护好自己的账号安全,谨慎使用相关技术。# 自动化工具 在当今的数字化时代,自动化工具和人工智能技术的结合为我们的生活和工作带来了极大的便利。微信作为中国最流行的即时通讯工具之一,拥有庞大的用户群体。本文将介绍如何使用…

ZR 省选摆烂记

Day 1 - 数据结构 链表 Problem 1 - 洛谷 P10061 很精妙的链表题。 首先考虑特殊性质,旋转整个矩阵改怎么做。 显然只需要维护矩阵旋转了多少次即可。 特殊性质好做的原因正是矩阵的“结构”没有变,原来相邻的数还是相邻,即旋转后的修改可以映射到原来矩阵的修改。 因此考虑…

【Deepseek】教你将Deepseek接入WPS和Word/Excel日常办公使用

以下文章来源于像梦又似花 ,作者小编 以下是将DeepSeek功能集成到WPS中的详细步骤,无需本地部署模型,直接通过官网连接使用: 1、下载并安装OfficeAI插件 (1)访问OfficeAI插件下载地址:https://www.office-ai.cn/,下载插件(目前只支持windows系统)。 OfficeAI 助手 是…

4.2 内存的逻辑模型是楼房

编程语言中的数据类型表示存储的是何种类型的数据 根据程序中所指定的变量的数据类型的不同,读写的物理内存大小也会随之发生变化 在不同的编程语言中,变量可以指定的数据类型的最大长度也不相同 C语言中,8字节(=64位)的double类型是最大的