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

用 TensorFlow 和 CNN 实现验证码识别

在本教程中,我们将使用 TensorFlow 和 卷积神经网络(CNN) 来构建一个验证码识别系统。TensorFlow 是一个流行的深度学习框架,支持构建和训练神经网络。通过构建卷积神经网络(CNN),我们可以自动从图像中提取特征并执行字符分类任务。

  1. 环境准备

首先,我们需要安装 TensorFlow 和其他一些常用的图像处理库:

pip install tensorflow opencv-python numpy matplotlib pillow
更多内容访问ttocr.com或联系1436423940

tensorflow:TensorFlow 深度学习框架。

opencv-python:用于处理图像,进行预处理和特征提取。

numpy:用于处理数值数据,特别是数组和矩阵。

matplotlib:用于可视化图像和结果。

  1. 数据集准备与图像预处理

验证码图像通常包含字符干扰、噪点、扭曲等,我们需要对图像进行预处理以提高识别的准确性。常见的预处理步骤包括:灰度化、二值化、去噪和字符分割。

(1) 图像预处理

在这个步骤中,我们将使用 OpenCV 对图像进行灰度化、二值化和去噪处理。

import cv2
import numpy as np

def preprocess_image(img_path):
# 读取图像
img = cv2.imread(img_path)

# 转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 使用 Otsu 的方法进行二值化
_, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)# 高斯模糊去噪
blurred = cv2.GaussianBlur(binary, (5, 5), 0)return blurred

示例图像路径

img_path = 'captcha_images/test1.png'
processed_img = preprocess_image(img_path)

显示处理后的图像

cv2.imshow('Processed Image', processed_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

(2) 提取字符区域

验证码中的每个字符通常由轮廓框住。我们将使用 OpenCV 的轮廓检测方法来提取字符区域,并将其分割开。

def extract_characters(processed_img):
contours, _ = cv2.findContours(processed_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
char_images = []
for contour in contours:
x, y, w, h = cv2.boundingRect(contour)
if w > 10 and h > 10: # 忽略小的噪点
char_img = processed_img[y:y+h, x:x+w]
char_images.append(char_img)

# 按照字符从左到右的顺序排序
char_images.sort(key=lambda x: x[0][0])  # 排序依据是字符的左上角 x 坐标
return char_images

提取字符区域

char_images = extract_characters(processed_img)

显示提取的字符

for i, char_img in enumerate(char_images):
cv2.imshow(f'Character {i+1}', char_img)
cv2.waitKey(0)

cv2.destroyAllWindows()

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

接下来,我们使用 TensorFlow 来构建卷积神经网络(CNN)。CNN 由多个卷积层和池化层组成,能够自动从图像中提取特征,并对图像进行分类。

(1) 定义 CNN 模型

我们将构建一个简单的 CNN,包括两个卷积层、两个池化层,并在最后使用全连接层输出验证码的类别。

import tensorflow as tf
from tensorflow.keras import layers, models

def create_cnn_model():
model = models.Sequential()
# 卷积层1
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))

# 卷积层2
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))# 展平层
model.add(layers.Flatten())# 全连接层
model.add(layers.Dense(128, activation='relu'))
model.add(layers.Dense(36, activation='softmax'))  # 36 类(假设验证码包含数字和字母)return model

创建模型

model = create_cnn_model()
model.summary()

  1. 数据加载与训练准备

为了训练模型,我们需要准备图像数据集。我们将加载图像并将其调整为 28x28 的大小,这样便于 CNN 进行处理。同时,我们需要将图像像素值规范化到 [0, 1] 之间。

(1) 数据加载与标签预处理

验证码通常包含数字和字母,我们需要将每个字符的图像提取出来,并为每个图像分配一个标签。

import os
import numpy as np
import cv2
from tensorflow.keras.utils import to_categorical

def load_data(image_dir):
images = []
labels = []

for filename in os.listdir(image_dir):if filename.endswith('.png'):img_path = os.path.join(image_dir, filename)img = preprocess_image(img_path)img = cv2.resize(img, (28, 28))  # 将图像调整为28x28img = np.expand_dims(img, axis=-1)  # 添加通道维度# 假设标签是文件名中的数字或字母label = int(filename.split('_')[0])  # 例如 '1_test.png' -> '1'labels.append(label)images.append(img)images = np.array(images)
labels = np.array(labels)# 归一化
images = images.astype('float32') / 255.0# 标签 one-hot 编码
labels = to_categorical(labels, num_classes=36)return images, labels

加载数据

image_dir = 'captcha_images/train'
images, labels = load_data(image_dir)

分割训练集和测试集

from sklearn.model_selection import train_test_split

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

  1. 训练模型

接下来,我们使用训练集训练模型。我们将使用 交叉熵损失 和 Adam 优化器 来训练模型。

(1) 训练模型

编译模型

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

训练模型

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

  1. 测试与预测

训练完成后,我们可以使用测试数据对模型进行评估,并进行预测。

(1) 测试模型

评估模型

test_loss, test_acc = model.evaluate(X_test, y_test)
print(f'Test accuracy: {test_acc:.4f}')

(2) 预测新的验证码
def predict(model, img_path):
img = preprocess_image(img_path)
img = cv2.resize(img, (28, 28))
img = np.expand_dims(img, axis=-1) # 添加通道维度
img = np.expand_dims(img, axis=0) # 添加批次维度
img = img.astype('float32') / 255.0

# 进行预测
prediction = model.predict(img)
predicted_label = np.argmax(prediction, axis=1)return predicted_label[0]

预测新的验证码

predicted_label = predict(model, 'captcha_images/test1.png')
print(f"Predicted label: {predicted_label}")

http://www.wxhsa.cn/company.asp?id=6990

相关文章:

  • 用 PyTorch 和 CNN 进行验证码识别
  • 用 Keras 和 CNN 进行验证码识别
  • 从 Bank Conflict 数学表示看 Buffer 设计 Trade-Off
  • 被彼此笼罩 任泪水将我们缠绕 深陷入恶魔的拥抱 在阴冷黑暗处灼烧 吞下这毒药
  • mysql无法连接服务器的mysql #mysql8
  • DAG 最小路径覆盖问题 笔记
  • SP3D c# 开发独立的exe
  • python错误code
  • 瑞 ping 我
  • java八股文笔记 - 指南
  • NOIP 模拟赛十六
  • 【AT_dp_y】Grid 2 - Harvey
  • C#十五天 026多态重写 027抽象类与开闭原则 028接口,依赖反转,单元测试
  • 解题报告-P11844 [USACO25FEB] Friendship Editing G
  • 两种判断计算机大小端模式的方法
  • CSP-S模拟23
  • CF1413F Roads and Ramen
  • 复现The Annotated Transformer代码时遇到的问题和相关链接
  • Node.js 文件上传中文文件名乱码难题,为什么只有Node会有乱码困难,其他后端框架少见?
  • ROS2之节点
  • 9.17日总结
  • ECT-OS-JiuHuaShan 框架,元推理AGI奇迹
  • Mapper与Mapper.xml的关系
  • Rocky Linux10.0安装zabbix7.4详细步骤 - 教程
  • 【P3158】放棋子 - Harvey
  • 最强AI语音克隆和文本配音工具!与真人无异,CosyVoice下载介绍
  • 近日C++线上练习结果
  • 密力根油滴实验实验报告
  • Linux 系统插入U盘/移动硬盘实现自动挂载
  • 来点人瑞平我