利用深度学习实现验证码识别-1

news2024/11/15 9:34:39

验证码(CAPTCHA)是网络安全中常用的一种机制,用于区分人类用户和自动化程序。然而,随着人工智能技术的发展,计算机视觉和深度学习算法在识别验证码方面取得了显著进展。本文将介绍如何使用PyTorch框架实现一个深度学习模型来识别简单的数字验证码。
在这里插入图片描述

数据生成与预处理

首先,我们需要创建一个数据集来训练我们的模型。在这个实现中,我们使用Python的PIL库生成简单的4位数字验证码图片:

import string
import random
from PIL import Image, ImageDraw, ImageFont

CHAR_SET = string.digits

def generate_captcha(text, font_size=36, width=100, height=40):
    image = Image.new('RGB', (width, height), (255, 255, 255))
    try:
        font = ImageFont.truetype("DroidSansMono.ttf", font_size)
    except IOError:
        font = ImageFont.load_default()
    draw = ImageDraw.Draw(image)
    draw.text((5, 5), text, font=font, fill=(0, 0, 0))
    return image

为了增强模型的泛化能力,我们应用了一些数据增强技术:

transform = transforms.Compose([
    transforms.Grayscale(),
    transforms.RandomRotation(10),
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))
])

这些转换包括将图像转换为灰度、随机旋转、转换为张量,以及标准化。

模型架构

我们设计了一个卷积神经网络(CNN)来处理验证码图像:

class CaptchaModel(nn.Module):
    def __init__(self):
        super(CaptchaModel, self).__init__()
        self.conv1 = nn.Conv2d(1, 32, 3, padding=1)
        self.conv2 = nn.Conv2d(32, 64, 3, padding=1)
        self.conv3 = nn.Conv2d(64, 128, 3, padding=1)
        self.fc1 = nn.Linear(128 * 5 * 12, 256)
        self.fc2 = nn.Linear(256, 4 * len(CHAR_SET))
        self.dropout = nn.Dropout(0.5)

    def forward(self, x):
        x = F.relu(F.max_pool2d(self.conv1(x), 2))
        x = F.relu(F.max_pool2d(self.conv2(x), 2))
        x = F.relu(F.max_pool2d(self.conv3(x), 2))
        x = x.view(x.size(0), -1)
        x = F.relu(self.fc1(x))
        x = self.dropout(x)
        x = self.fc2(x)
        return x.view(-1, 4, len(CHAR_SET))

该模型包含三个卷积层,每个卷积层后跟一个ReLU激活函数和最大池化层。然后,我们使用两个全连接层来处理特征,并输出每个字符的预测概率。

训练过程

训练过程包括以下步骤:

  1. 数据加载
  2. 模型初始化
  3. 定义损失函数和优化器
  4. 迭代训练
  5. 早停和模型保存
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = CaptchaModel().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

train(model, train_loader, criterion, optimizer, epochs=50)

我们使用交叉熵损失和Adam优化器。训练函数还包含了早停机制,以防止过拟合:

def train(model, loader, criterion, optimizer, epochs=10, patience=3, model_path='best_model.pth'):
    best_loss = float('inf')
    patience_counter = 0
    
    for epoch in range(epochs):
        running_loss = 0.0
        for images, labels in loader:
            images, labels = images.to(device), labels
            optimizer.zero_grad()
            outputs = model(images)
            
            labels_idx = []
            for label in labels:
                try:
                    labels_idx.append([CHAR_SET.index(c) for c in label])
                except ValueError as e:
                    print(f"Error processing label: {label} - {str(e)}")
                    continue
            
            labels_tensor = torch.tensor(labels_idx).to(device)
            
            if len(labels_tensor) == 0:
                continue

            loss = sum(criterion(outputs[:, i], labels_tensor[:, i]) for i in range(4))
            loss.backward()
            optimizer.step()
            running_loss += loss.item()
        
        avg_loss = running_loss / len(loader)
        print(f'Epoch {epoch+1}/{epochs}, Loss: {avg_loss:.4f}')
        
        if avg_loss < best_loss:
            best_loss = avg_loss
            torch.save(model.state_dict(), model_path)
            print(f"Model saved at epoch {epoch+1} with loss {avg_loss:.4f}")
            patience_counter = 0
        else:
            patience_counter += 1
        
        if patience_counter >= patience:
            print("Early stopping triggered")
            break

推理和可视化

训练完成后,我们可以使用模型进行推理:

def infer(model, image):
    model.eval()
    with torch.no_grad():
        image = image.to(device)
        output = model(image.unsqueeze(0))
    predicted_text = ''.join([CHAR_SET[torch.argmax(output[0, i]).item()] for i in range(4)])
    return predicted_text

def visualize_inference(model, image, true_label):
    predicted_text = infer(model, image)
    
    image_np = image.squeeze().cpu().numpy()
    plt.imshow(image_np)
    plt.title(f'True: {true_label}, Predicted: {predicted_text}')
    plt.axis('off')
    plt.show()

这些函数允许我们对单个图像进行预测,并可视化结果。
在这里插入图片描述

结论

本文展示了如何使用深度学习来识别简单的数字验证码。尽管这个实现专注于数字验证码,但相同的原理可以扩展到更复杂的验证码系统。随着模型和训练技术的不断改进,验证码识别的准确性可能会进一步提高,这也意味着验证码作为安全机制可能需要进一步演化以应对这些挑战。

这个项目不仅展示了深度学习在计算机视觉任务中的应用,还为更广泛的图像识别和文本提取问题提供了一个起点。未来的工作可能包括处理更复杂的验证码,如包含扭曲文本或背景噪声的验证码,或探索其他深度学习架构如循环神经网络(RNN)或注意力机制在此任务中的应用。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据图像处理26

六、图像分割 6.3 分水岭图像分割 6.3.1分水岭算法的基本概念 分水岭算法之所以得名&#xff0c;是因为其的分割原理与地理学中的分水岭现象非常相似。在地理学中&#xff0c;分水岭是分隔相邻水系的山岭或高地&#xff0c;雨水会分别流向两侧的水系。 分水岭算法常用于图像…

代码随想录训练营day34|62.不同路径,63. 不同路径 II,343.整数拆分,96.不同的二叉搜索树

不同路径1 题目 题目并不难想&#xff0c;每一个点只有两种走到的方法&#xff0c;要么从左侧来&#xff0c;要么从上侧来&#xff0c;所以 dp[i][j]dp[i-1][j]dp[i][j-1]; vector<vector<int>> dp(m,vector<int>(n,0)); for(int i0;i<m;i){for(int j0;j…

MLM之Qwen:Qwen2-VL的简介、安装和使用方法、案例应用之详细攻略

MLM之Qwen&#xff1a;Qwen2-VL的简介、安装和使用方法、案例应用之详细攻略 目录 Qwen2-VL的简介 1、主要增强功能&#xff1a; 2、模型架构更新&#xff1a; 3、性能 图像基准测试 视频基准测试 代理基准测试 多语言基准测试 4、新闻 5、限制 Qwen2-VL的安装和使用…

【hot100篇-python刷题记录】【翻转二叉树】

R7-二叉树篇 一眼递归 递归具有相同子问题的特点。 # Definition for a binary tree node. # class TreeNode: # def __init__(self, val0, leftNone, rightNone): # self.val val # self.left left # self.right right class Solution:def in…

metallb-speaker缓存

手动修改metallb-config arping返回2个mac地址 删除pod mac正常返回 pkill 进程 返回2个mac

pycharm 2024.1下载、安装

下载 下载官网&#xff1a; Other Versions - PyCharm 选择需要的版本下载&#xff0c;这里以 2024.1 的版本为例 安装 双击下载好的安装程序&#xff0c;点击下一步 选择安装路径&#xff0c;最好是英文路径&#xff1b;然后下一步 点击完成 激活 网址&#xff1a; Some…

突发!某GPU芯片独角兽!400+人 原地解散!

今天偶然打开脉脉APP&#xff0c;看看最近IT圈子又有什么劲爆消息&#xff0c;发现某芯片独角兽全员原地解散的消息登上热搜 No1了。 之前没有怎么关注过芯片行业&#xff0c;因此完全不知道这家公司&#xff0c;没想到成了热搜No1&#xff1b;由此可见该公司在行业内应该还是比…

安装vmtools管理虚拟机教程

目录 1.什么是vmtools 2.安装教程 2.1删除和安装 2.2文件的复制和粘贴 2.3指令操作 3.检验效果 4.小结 1.什么是vmtools vmtools就是安装之后可以让我们更好的管理我们的虚拟机&#xff1b; 我们可以设置windows和centos共享的文件夹&#xff0c;让该文件夹实现共享&am…

C++初始化列表,staic成员变量

初始化列表的引入 class Stack { public:Stack(int capacity){_arr (int*)malloc(sizeof(int) * capacity);if (_arr NULL){perror("malloc->_newarr");return;}_capacity capacity;} private:int _capacity;int _size;int* _arr; //默…

滚动视图ScrollView

activity_scroll_view.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_pare…

嵌入式全栈开发学习笔记---Linux常用库(json)

目录 入门级问题 为什么使用json? 什么是json? json-c库 json源码 安装方法 json-c API Json类型 C-API 将一个字符串转换成符合json格式的字符串(json对象) 定义一个字符串数组 定义一个json_object结构体指针 把一个字符串转换成一个json对象 将转换成json对…

TS类型注解(下)

文章目录 前言三、TypeScript类型约束&#xff08;5&#xff09;对象&#xff08;6&#xff09;接口&#xff08;TS中对象类型的专属约束&#xff09;&#xff08;7&#xff09;TS中的扩展类型 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&…

台式机CPU温度90℃以上-排查思路

虽然现在台式机不值钱。 但是对于穷苦老百姓来说&#xff0c;还是害怕它坏掉&#xff0c;坏掉就又需要花钱买了。 ①风扇清理所有灰尘&#xff08;风扇的散热网是可以拆下来的&#xff09;&#xff0c; 主板清理所有灰尘&#xff08;用画笔或者干燥的牙刷&#xff0c;注意是…

LeetCode - 11 盛最多水的容器

题目来源 11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最…

小型集群分析

目录 介绍步骤 介绍 etcd是CoreOS基于Raft协议开发的分布式key-value存储&#xff0c;可用于服务发现、共享配置以及一致性保障&#xff08;如数据库选主、分布式锁等&#xff09;。 在分布式系统中&#xff0c;如何管理节点间的状态一直是一个难题&#xff0c;etcd像是专门为…

从关键新闻和最新技术看AI行业发展(第三十期2024.8.12-8.25) |【WeThinkIn老实人报】

写在前面 【WeThinkIn老实人报】旨在整理&挖掘AI行业的关键新闻和最新技术&#xff0c;同时Rocky会对这些关键信息进行解读&#xff0c;力求让读者们能从容跟随AI科技潮流。也欢迎大家提出宝贵的优化建议&#xff0c;一起交流学习&#x1f4aa; 欢迎大家关注Rocky的公众号&…

java利用JXL操作excel

通过JXL操作Excel JXL是韩国人所著,目前停止更新,只支持xls格式,即2007之前的版本 import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java…

【论文解读】SAM模型超级进化:面向移动端的轻量级SAM,比FastSAM快4倍!(附论文地址)

论文地址&#xff1a;https://arxiv.org/pdf/2306.14289.pdf 这篇论文的标题是《FASTER SEGMENT ANYTHING: TOWARDS LIGHTWEIGHT SAM FOR MOBILE APPLICATIONS》&#xff0c;由Chaoning Zhang等人撰写&#xff0c;发表于2023年。 文章主要探讨了如何将Segment Anything Model&…

Docker构建镜像时本地NuGet不存在的解决方式

在打包镜像时&#xff0c;由于程序中使用了本地的NuGet包&#xff0c;发现怎么打包都是失败,错误如下 我的dockerfile 文件如下 FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base WORKDIR /app EXPOSE 80# 此阶段用于生成服务项目 FROM mcr.microsoft.com/dotnet/sdk:8.0 A…

战略设计(Strategic Design)

战略设计(strategic design)——一种针对系统整体的建模和设计决策。这样的决策影响整个项目&#xff0c;而且必须由团队来制定。 随着系统的增长&#xff0c;它会变得越来越复杂&#xff0c;当我们无法通过分析对象来理解系统的时候&#xff0c;就需要掌握一些操纵和理解大的模…