PyTorch识别验证码

## 一、生成测试集数据

pip install captcha

common.py

import random
import time
captcha_array = list("0123456789abcdefghijklmnopqrstuvwxyz")
captcha_size = 4from captcha.image import ImageCaptchaif __name__ == '__main__':for i in range(10):image = ImageCaptcha()image_text = "".join(random.sample(captcha_array, captcha_size))image_path = "./datasets/train/{}_{}.png".format(image_text, int(time.time()))image.write(image_text, image_path)

生成验证码
在这里插入图片描述

二、one-hot编码将类别变量转换为机器学习算法易于利用的一种形式的过程。

one_hot.py

import common
import torch
import torch.nn.functional as Fdef text2vec(text):# 将文本转换为变量vectors = torch.zeros((common.captcha_size, common.captcha_array.__len__()))# vectors[0,0] = 1# vectors[1,3] = 1# vectors[2,4] = 1# vectors[3, 1] = 1for i in range(len(text)):vectors[i, common.captcha_array.index(text[i])] = 1return vectorsdef vectotext(vec):vec=torch.argmax(vec, dim=1)text_label=""for v in vec:text_label+=common.captcha_array[v]return  text_labelif __name__ == '__main__':vec=text2vec("aab1")print(vec, vec.shape)print(vectotext(vec))

在这里插入图片描述

三、 然后继续添加

my_datasets.py

import osfrom PIL import Image
from torch.utils.data import Dataset
from torchvision import transforms
from torch.utils.tensorboard import SummaryWriter
import one_hotclass mydatasets(Dataset):def __init__(self,root_dir):super(mydatasets, self).__init__()self.list_image_path=[ os.path.join(root_dir,image_name) for image_name in os.listdir(root_dir)]self.transforms=transforms.Compose([transforms.Resize((60,160)),transforms.ToTensor(),transforms.Grayscale()])def __getitem__(self, index):image_path = self.list_image_path[index]img_ = Image.open(image_path)image_name=image_path.split("\\")[-1]img_tesor=self.transforms(img_)img_lable=image_name.split("_")[0]img_lable=one_hot.text2vec(img_lable)img_lable=img_lable.view(1,-1)[0]return img_tesor,img_labledef __len__(self):return self.list_image_path.__len__()if __name__ == '__main__':d=mydatasets("datasets/train")img,label=d[0]writer=SummaryWriter("logs")writer.add_image("img",img,1)print(img.shape)writer.close()

dataLoader 加载dataset
就是数据加载器,结合了数据集和取样器,并且可以提供多个线程处理数据集。在训练模型时使用到此函数,用来把训练数据分成多个小组,此函数每次抛出一组数据。直至把所有的数据都抛出,就是做一个数据的初始化。

四、训练

五、CNN卷积神经网络
在这里插入图片描述
model.py

import torch
from torch import nn
import common
class mymodel(nn.Module):def __init__(self):super(mymodel, self).__init__()self.layer1 = nn.Sequential(# 卷积层nn.Conv2d(in_channels=1, out_channels=64, kernel_size=3, padding=1),# 激活层nn.ReLU(),# 池化层nn.MaxPool2d(kernel_size=2)   #[6, 64, 30, 80])self.layer2 = nn.Sequential(# 卷积层nn.Conv2d(in_channels=64, out_channels=128, kernel_size=3, padding=1),# 激活层nn.ReLU(),# 池化层nn.MaxPool2d(2)     #[6, 128, 15, 40])self.layer3 = nn.Sequential(# 卷积层nn.Conv2d(in_channels=128, out_channels=256, kernel_size=3, padding=1),# 激活层nn.ReLU(),# 池化层nn.MaxPool2d(2)  # [6, 256, 7, 20])self.layer4 = nn.Sequential(# 卷积层nn.Conv2d(in_channels=256, out_channels=512, kernel_size=3, padding=1),# 激活层nn.ReLU(),# 池化层nn.MaxPool2d(2)  # [6, 512, 3, 10])# self.layer5 = nn.Sequential(#     nn.Conv2d(in_channels=512, out_channels=512, kernel_size=3, padding=1),#     nn.ReLU(),#     nn.MaxPool2d(2)  # [6, 512, 1, 5]# )self.layer6 = nn.Sequential(# 展平nn.Flatten(),    #[6, 2560] [64, 15360]# 线性层nn.Linear(in_features=15360, out_features=4096),# 防止过拟合nn.Dropout(0.2),  # drop 20% of the neuron# 激活曾nn.ReLU(),# 线性层nn.Linear(in_features=4096, out_features=common.captcha_size*common.captcha_array.__len__()))def forward(self,x):x = self.layer1(x)x = self.layer2(x)x = self.layer3(x)x = self.layer4(x)#x = x.view(1,-1)[0]#[983040]x = self.layer6(x)# x = x.view(x.size(0), -1)return x;if __name__ == '__main__':data = torch.ones(64, 1, 60, 160)model = mymodel()x = model(data)print(x.shape)

在这里插入图片描述

六、训练

train.py

import torch
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
from my_datasets import mydatasets
from model import mymodelif __name__ == '__main__':train_datas = mydatasets("datasets/train")test_data = mydatasets("datasets/test")train_dataloader = DataLoader(train_datas, batch_size=64, shuffle=True)test_dataloader = DataLoader(test_data, batch_size=64, shuffle=True)# m = mymodel().cuda()    没有GPUm = mymodel()# MultiLabelSoftMarginLoss 多标签交叉熵损失函数# 优化器 Adam 一般要求学习率比较小# 先将梯度归零 zero_grad# 反向传播计算 backward# loss_fn = nn.MultiLabelSoftMarginLoss().cuda()   没有GPUloss_fn = nn.MultiLabelSoftMarginLoss()optimizer = torch.optim.Adam(m.parameters(), lr=0.001)w = SummaryWriter("logs")total_step = 0for i in range(10):# print("外层训练次数{}".format(i))for i,(imgs, targets) in enumerate(train_dataloader):# imgs = imgs.cuda()   没有GPU# targets = targets.cuda()   没有GPUoutputs = m(imgs)loss = loss_fn(outputs, targets)optimizer.zero_grad()loss.backward()optimizer.step()if i%10 == 0:total_step += 1print("训练{}次,loss:{}".format(total_step*10, loss.item()))w.add_scalar("loss", loss, total_step)w.close()torch.save(m, "model.pth")

在这里插入图片描述
tensorboard --logdir=logs
使用tensorboard 查看损失率,接近零了。
在这里插入图片描述

七、图片预测

model.train() 和 model.eval()一般在模型训练和评价的时候会加上这两句,主要是针对由于model在训练时和评价时Batch Normalization 和Dropout方法模式不同,例如model指定t因此,在使用PyTorch进行训练和测试时一定注意要把rain/eval
predict.py

from PIL import Image
from torch.utils.data import DataLoader
import one_hot
import model
import torch
import common
import my_datasets
from torchvision import transformsdef test_pred():#  m = torch.load("model.pth").cuda()  没有GPUm = torch.load("model.pth")m.eval()test_data = my_datasets.mydatasets("datasets/test")test_dataloader = DataLoader(test_data, batch_size=1, shuffle=False)test_length = test_data.__len__()correct = 0for i, (imgs, lables) in enumerate(test_dataloader):# imgs = imgs.cuda()   没有GPU# lables = lables.cuda()  没有GPUlables = lables.view(-1, common.captcha_array.__len__())lables_text = one_hot.vectotext(lables)predict_outputs = m(imgs)predict_outputs = predict_outputs.view(-1, common.captcha_array.__len__())predict_labels = one_hot.vectotext(predict_outputs)if predict_labels == lables_text:correct += 1print("预测正确:正确值:{},预测值:{}".format(lables_text, predict_labels))else:print("预测失败:正确值:{},预测值:{}".format(lables_text, predict_labels))# m(imgs)print("正确率{}".format(correct / test_length * 100))def pred_pic(pic_path):img = Image.open(pic_path)tersor_img = transforms.Compose([transforms.Grayscale(),transforms.Resize((60, 160)),transforms.ToTensor()])# img = tersor_img(img).cuda() 没有GPUimg = tersor_img(img)print(img.shape)img = torch.reshape(img, (-1, 1, 60, 160))print(img.shape)# m = torch.load("model.pth").cuda() 没有GPUm = torch.load("model.pth")outputs = m(img)outputs = outputs.view(-1, len(common.captcha_array))outputs_lable = one_hot.vectotext(outputs)print(outputs_lable)if __name__ == '__main__':# test_pred()pred_pic("./datasets/test/5ogl_1705418909.png")

在这里插入图片描述
预测值是一样的,需要找一些真实的验证码图片
在这里插入图片描述

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

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

相关文章

为后端做准备

这里写目录标题 flask 文件上传与接收flask应答(接收请求(文件、数据)flask请求(上传文件)传递参数和文件 argparse 不从命令行调用参数1、设置default值2、"从命令行传入的参数".split()3、[--input,内容] …

肿瘤免疫分型

Elements of cancer immunity and the cancer-immune set point - PubMed (nih.gov) Daniel S Chen , Ira Mellman 人类的抗癌免疫可分为三种主要表型:免疫沙漠表型(棕色)、免疫排除表型(蓝色)和免疫炎症型&#xff0…

深刻理解树状数组--树状数组构造定义与动态维护区间和的合理性证明

文章目录 一.树状数组概览二.树状数组构造定义lowbit运算树状数组的结点值的定义树状数组结点层次的定义树状数组父子结点关系定义 三.关于树状数组结构的重要证明引理1引理2树状数组模板题 一.树状数组概览 树状数组的下标从1开始标识,其物理结构是线性表,逻辑结构是一颗多叉…

c++入门学习④——对象的初始化和清理

目录 对象的初始化和清理: why? 如何进行初始化和清理呢? 使用构造函数和析构函数​编辑 构造函数语法: 析构函数语法: 构造函数的分类: 两种分类方式: 三种调用方法: 括号法(默认构造函数调用&…

Meta开源大模型LLaMA2的部署使用

LLaMA2的部署使用 LLaMA2申请下载下载模型启动运行Llama2模型文本补全任务实现聊天任务LLaMA2编程Web UI操作 LLaMA2 申请下载 访问meta ai申请模型下载,注意有地区限制,建议选其他国家 申请后会收到邮件,内含一个下载URL地址,…

Redis -- set集合

挑战自己,每天进步一点点,成就将属于不停止脚步的你。 目录 Redis集合? 集合基本命令 sadd smembers sismember scard spop srandmember smove srem 集合间操作 sinter sinterstore sunion sdiff sdiifstore Redis集合&#…

Webpack源码浅析

webpack启动方式 webpack有两种启动方式: 通过webpack-cli脚手架来启动,即可以在Terminal终端直接运行; webpack ./debug/index.js --config ./debug/webpack.config.js通过require(webpack)引入包的方式执行;其实第一种方式最终…

vue3前端开发,element-plus前端框架探秘:scope对象

vue3前端开发,element-plus前端框架探秘:scope对象!我们经常需要对当前行的数据进行操作,比如增加,删除,编辑等,为此我们需要传递当前行所对应的唯一主键,通常情况下,当前行对应的业务主键是id属…

CTFshow web(php特性 105-108)

web105 <?php /* # -*- coding: utf-8 -*- # Author: Firebasky # Date: 2020-09-16 11:25:09 # Last Modified by: h1xa # Last Modified time: 2020-09-28 22:34:07 */ highlight_file(__FILE__); include(flag.php); error_reporting(0); $error你还想要flag嘛&…

WPF控件-ItemsControl

介绍 ItemsControl是用于展示一组项的控件。我们常见的列表&#xff08;ListBox&#xff09;、数据表格&#xff08;DataGrid&#xff09;等都是继承自ItemsControl。可用于自定义样式展示各种批量的数据集合。 常见使用示例&#xff1a; <ItemsControl ItemsSource"…

Docker进阶篇-Docker网络

一、描述 1、docker不启动&#xff0c;默认网络情况 查看网卡情况使用&#xff0c;ifconfig或者ip addr ens33&#xff1a;本机网卡 lo&#xff1a;本机回环网络网卡 virbr0:在CentoS 7的安装过程中如果有选择相关虚拟化的的服务安装系统后&#xff0c;启动网卡时会发现 …

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之QRCode组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之QRCode组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、QRCode组件 用于显示单个二维码的组件。 子组件 无。 接口 QRCode(value: st…

C#中dll引用常见错误

当你在使用C#开发程序时&#xff0c;经常会遇到需要引用外部的dll文件来扩展程序的功能或者使用一些第三方库。然而&#xff0c;在引用这些dll文件的过程中&#xff0c;有时候会遇到一些问题&#xff0c;比如上面提到的错误信息&#xff1a;“未能加载文件或程序集“System.Run…

从零开始 TensorRT(4)命令行工具篇:trtexec 基本功能

前言 学习资料&#xff1a; TensorRT 源码示例 B站视频&#xff1a;TensorRT 教程 | 基于 8.6.1 版本 视频配套代码 cookbook 参考源码&#xff1a;cookbook → 07-Tool → trtexec 官方文档&#xff1a;trtexec 在 TensorRT 的安装目录 xxx/TensorRT-8.6.1.6/bin 下有命令行…

基于微信小程序的校园水电费管理小程序的研究与实现

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

SpringBoot项目打包成jar包供第三方使用实践

文章目录 1.使用者手动配置 basePackages1.1 第三方jar项目1.2 使用者项目1.2.1 使用者配置1.2.2 项目测试 2.使用者通过注解的方式引入2.1 第三方jar项目2.2 使用者项目2.2.1 使用者配置2.2.2 项目测试 3.SpringBoot Starter 方式3.1 第三方jar项目3.2 使用者项目3.2.1 使用者…

linux、windows 安装 vue-cli

Vue CLI 是一个基于 Vue.js 进行快速开发的完整系统&#xff0c;提供&#xff1a; 通过 vue/cli 实现的交互式的项目脚手架。 通过 vue/cli vue/cli-service-global 实现的零配置原型开发。 一个运行时依赖 (vue/cli-service) 可升级&#xff1b; 基于 webpack 构建&#…

【Linux操作系统】:Linux开发工具编辑器vim

目录 Linux 软件包管理器 yum 什么是软件包 注意事项 查看软件包 如何安装软件 如何卸载软件 Linux 开发工具 Linux编辑器-vim使用 vim的基本概念 vim的基本操作 vim正常模式命令集 插入模式 插入模式切换为命令模式 移动光标 删除文字 复制 替换 撤销 跳至指…

【Redis】字符串原理--简单动态字符串SDS

一.SDS定义 free 属性值为0&#xff0c;标识SDS没有分配任何未使用空间。len 属性值为5&#xff0c;标识SDS保存了一个5字节长度的字符串。buf 属性是一个char类型数组&#xff0c;数组的前5个字节保存了&#xff0c;R e d i s 五个字符&#xff0c;最后一个保存空字符串 \0…

Cassandra 命令大全

文章目录 1. 连接与基本操作2. 数据库管理3. 表&#xff08;Column Family&#xff09;操作4. 集群管理5. 权限管理6. 其他高级功能7. 条件查询与聚合操作8. 索引管理9. 用户权限和角色管理10. 安全性相关设置11. 一致性级别控制12. 用户定义类型 (UDTs)13. 用户定义函数 (UDFs…