使用 PyTorch 进行验证码识别:基于卷积神经网络的实现

news/2025/2/2 13:30:09/文章来源:https://www.cnblogs.com/ocr12/p/18696798

在本教程中,我们将使用 PyTorch 实现一个验证码识别系统。验证码通常由随机生成的字符组成,我们可以通过训练一个卷积神经网络(CNN)来识别这些字符。本文将介绍如何使用 PyTorch 构建一个简单的 CNN 模型来识别验证码图像,并通过数据预处理和模型训练来提高识别精度。

  1. 环境准备
    首先,确保你已经安装了 PyTorch 和其他必要的库。可以使用以下命令安装所需的依赖:

bash
更多内容访问ttocr.com或联系1436423940
pip install torch torchvision opencv-python numpy matplotlib pillow
在本教程中,我们将使用 PyTorch 和 OpenCV 来处理图像数据,并使用 CNN 模型进行验证码识别。

  1. 构建卷积神经网络(CNN)
    在本部分,我们将构建一个基本的 CNN,用于验证码识别。该网络包含多个卷积层(Convolutional Layers)、池化层(Pooling Layers)和全连接层(Fully Connected Layers)。

(1) 定义 CNN 模型
python

import torch
import torch.nn as nn
import torch.optim as optim

class CaptchaCNN(nn.Module):
def init(self, num_classes):
super(CaptchaCNN, self).init()
self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1)
self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
self.conv3 = nn.Conv2d(64, 128, kernel_size=3, padding=1)

    self.pool = nn.MaxPool2d(2, 2)self.fc1 = nn.Linear(128 * 8 * 8, 512)self.fc2 = nn.Linear(512, num_classes)def forward(self, x):x = self.pool(torch.relu(self.conv1(x)))x = self.pool(torch.relu(self.conv2(x)))x = self.pool(torch.relu(self.conv3(x)))x = x.view(-1, 128 * 8 * 8)  # Flatten the tensorx = torch.relu(self.fc1(x))x = self.fc2(x)return x

(2) 模型解释
卷积层(Conv2d):用于提取图像的局部特征,如字符的边缘和轮廓。
池化层(MaxPool2d):通过对图像进行池化,减小特征图的尺寸,减少计算量。
全连接层(Linear):将卷积层提取的特征映射到最终的分类空间。
激活函数(ReLU):引入非线性,以提高模型的表现力。
3. 数据预处理
为了使用 CNN 进行验证码识别,我们需要对图像进行预处理。我们将使用 OpenCV 来读取和处理图像,然后将其转换为适合模型输入的格式。

(1) 读取并处理图像
python

import cv2
import numpy as np
import os
from PIL import Image

图像预处理:读取图像,转换为灰度图,归一化,调整尺寸

def preprocess_image(image_path):
# 读取图像并转换为灰度
img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)

# 调整图像大小
img = cv2.resize(img, (128, 64))  # 将图像调整为 128x64 尺寸# 归一化:将像素值缩放到 [0, 1]
img = img / 255.0
img = np.expand_dims(img, axis=-1)  # 增加颜色通道维度# 转换为 Tensor
img_tensor = torch.tensor(img, dtype=torch.float32)
img_tensor = img_tensor.unsqueeze(0)  # 增加批次维度
return img_tensor

(2) 加载数据集
我们假设数据集包含图像文件和相应的标签。每个图像文件名中包含标签(例如 "A12B.png"),我们将从文件名中提取标签并进行编码。

python

def load_data(data_dir):
images = []
labels = []
char_set = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' # 字符集

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]label_encoded = [char_set.index(c) for c in label]labels.append(label_encoded)images = np.array(images)
return images, labels
  1. 模型训练
    训练模型时,我们需要将标签进行适当的处理,并使用 交叉熵损失(Cross-Entropy Loss)来优化模型。

(1) 准备训练数据
将标签转换为 Tensor,并且创建数据加载器(DataLoader)来批量处理数据。

python

from torch.utils.data import Dataset, DataLoader

class CaptchaDataset(Dataset):
def init(self, image_paths, labels, char_set):
self.image_paths = image_paths
self.labels = labels
self.char_set = char_set

def __len__(self):return len(self.image_paths)def __getitem__(self, idx):image = preprocess_image(self.image_paths[idx])label = self.labels[idx]return image, torch.tensor(label)

准备数据集

image_paths = ['captcha_images/' + filename for filename in os.listdir('captcha_images')]
dataset = CaptchaDataset(image_paths, labels, char_set)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
(2) 训练模型
python

初始化模型、损失函数和优化器

num_classes = len(char_set)
model = CaptchaCNN(num_classes=num_classes)
criterion = nn.CrossEntropyLoss() # 交叉熵损失
optimizer = optim.Adam(model.parameters(), lr=0.001)

训练模型

num_epochs = 10
for epoch in range(num_epochs):
model.train()
running_loss = 0.0
for i, (inputs, labels) in enumerate(dataloader):
optimizer.zero_grad()

    # 前向传播outputs = model(inputs)# 计算损失loss = criterion(outputs, labels)# 反向传播loss.backward()optimizer.step()running_loss += loss.item()print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {running_loss/len(dataloader):.4f}')

(3) 模型评估
评估模型时,可以使用测试集进行验证,并计算模型的准确性。

python

在测试集上评估

model.eval()
test_images, test_labels = load_data('captcha_test_images')
with torch.no_grad():
correct = 0
total = 0
for i, (inputs, labels) in enumerate(test_images):
outputs = model(inputs)
_, predicted = torch.max(outputs, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()

accuracy = 100 * correct / total
print(f'Test Accuracy: {accuracy:.2f}%')

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