当前位置: 首页 > news >正文

用 TensorFlow 构建深度学习验证码识别系统

验证码识别一直是计算机视觉领域中的一个实际应用场景,它不仅需要图像处理的预处理能力,还需要深度学习模型对复杂字符进行准确的分类和预测。本文将基于 TensorFlow 来构建一个验证码识别系统,涵盖从数据生成、模型设计到训练与测试的全过程。

一、项目准备

在开始之前,请确保你已安装以下依赖:

pip install tensorflow pillow numpy captcha

TensorFlow:深度学习框架

Pillow:图像处理库

captcha:生成验证码数据

NumPy:数据处理

二、验证码数据集生成

为了训练模型,我们需要大量的验证码图片。这里使用 captcha 库来动态生成。

import numpy as np
from captcha.image import ImageCaptcha
import random
import string
from tensorflow.keras.utils import to_categorical

字符集:数字+字母

characters = string.digits + string.ascii_uppercase
captcha_length = 4 # 每个验证码长度
image_height, image_width = 60, 160

生成器

def generate_captcha_text():
return ''.join(random.choices(characters, k=captcha_length))

def generate_captcha_image():
captcha_text = generate_captcha_text()
image = ImageCaptcha(width=image_width, height=image_height)
captcha = image.generate_image(captcha_text)
return captcha, captcha_text

生成样例

img, txt = generate_captcha_image()
img.show()
print("验证码内容:", txt)

此代码能动态生成验证码并展示,同时打印其真实标签。

三、数据预处理

深度学习模型需要输入标准化的数据,因此要将图片转换为灰度矩阵,并将标签转为独热编码。

def preprocess_image(img):
img = img.convert('L') # 转灰度
img = img.resize((image_width, image_height))
img_array = np.array(img) / 255.0
return img_array.reshape(image_height, image_width, 1)

def encode_label(label):
# 独热编码
label_array = []
for char in label:
one_hot = to_categorical(characters.index(char), num_classes=len(characters))
label_array.append(one_hot)
return np.array(label_array).flatten()

构建批次数据

def generate_batch(batch_size=32):
while True:
X = np.zeros((batch_size, image_height, image_width, 1))
y = np.zeros((batch_size, captcha_length * len(characters)))
for i in range(batch_size):
img, txt = generate_captcha_image()
X[i] = preprocess_image(img)
y[i] = encode_label(txt)
yield X, y

这样我们就能批量生成训练数据。

四、模型设计

使用 卷积神经网络(CNN) 来提取验证码图像特征。

from tensorflow.keras import layers, models

def build_model():
model = models.Sequential()
model.add(layers.Conv2D(32, (3,3), activation='relu', input_shape=(image_height, image_width, 1)))
model.add(layers.MaxPooling2D((2,2)))

model.add(layers.Conv2D(64, (3,3), activation='relu'))
model.add(layers.MaxPooling2D((2,2)))model.add(layers.Conv2D(128, (3,3), activation='relu'))
model.add(layers.Flatten())model.add(layers.Dense(1024, activation='relu'))
model.add(layers.Dropout(0.5))
model.add(layers.Dense(captcha_length * len(characters), activation='softmax'))model.compile(optimizer='adam', loss='categorical_crossentropy',metrics=['accuracy'])
return model

model = build_model()
model.summary()

五、训练模型

利用我们定义的数据生成器,训练网络模型。

batch_size = 64
steps_per_epoch = 1000
epochs = 10

train_gen = generate_batch(batch_size)
val_gen = generate_batch(batch_size)

history = model.fit(
train_gen,
steps_per_epoch=steps_per_epoch,
epochs=epochs,
validation_data=val_gen,
validation_steps=100
)

训练过程中会输出准确率和损失曲线。

六、模型测试与预测

我们来测试模型能否正确识别新生成的验证码。
更多内容访问ttocr.com或联系1436423940
def decode_prediction(pred):
pred = pred.reshape(captcha_length, len(characters))
pred_text = ''.join([characters[np.argmax(vec)] for vec in pred])
return pred_text

测试

test_img, test_txt = generate_captcha_image()
X_test = np.expand_dims(preprocess_image(test_img), axis=0)
y_pred = model.predict(X_test)

print("真实:", test_txt)
print("预测:", decode_prediction(y_pred[0]))
test_img.show()

http://www.jsqmd.com/news/63156/

相关文章:

  • 20251205 之所思 - 人生如梦
  • 12.5每日总结
  • 永久关闭Windows自动更新
  • git洁癖:如果冲突采用远端
  • 大道至简,仅需三行代码训练YOLOv11
  • 快捷键
  • 球星 C 罗投资 AI 初创 Perplexity;微软开源 VibeVoice-Realtime,低延迟流式输出丨日报
  • 网络学习细节学习
  • 12月5日日记
  • Windows PyTorch安装
  • 日总结 36
  • faster r cnn 用到所有技术和流程
  • FEM/BDC Test Platform for BMW Key Programmer – Test F20 F30 F35 X5 X6 I3 Without Gearbox Plug
  • 春招准备之MyBatis框架篇 - 详解
  • 上海助听器验配哪家好?2025 年12月权威机构推荐报告:从资质核验到场景适配的全维度选择策略
  • 使用fail2ban屏蔽LINUX恶意暴力破解密码
  • 对接墨西哥股票市场 k线图表数据klinechart 数据源API
  • 代码随想录Day28_贪心2
  • 10412_基于Springboot的员工绩效管理系统
  • NFL如何用统一数据平台提升比赛与体验
  • MAF快速入门(1)化繁为简的Agent创建范式
  • CDN 迁移至 EdgeOne 工具使用指南
  • ssh连接错误:WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! - Hello
  • 20251205 - USPD 攻击事件:初始化缺失露破绽,黑客潜伏多日终得手
  • 每日反思(2025年12月5日)
  • DEBIAN 12.6手动安装LNMP环境记录
  • 如何将 iPhone 或 iPad 备份移至外置硬盘
  • 联想小新Pad Studio平板重装国际版系统教程(TB351FU)
  • Linux指定端口连接Redis
  • CSDN博客终于搬家至博客园了!