首页 > 编程语言 >使用 Vyper 编写验证码识别程序

使用 Vyper 编写验证码识别程序

时间:2024-12-11 13:31:27浏览次数:7  
标签:Vyper onnx 模型 torch cv2 验证码 编写 model 图片

准备工作
首先,我们需要收集并下载验证码图片,并保存到本地。为了便于后续处理,我们会对这些图片计算 MD5 值并进行保存。这个步骤不仅有助于后期验证数据的完整性,也确保了每次处理的数据是一致的。

由于验证码图片的复杂性相对较低,目标检测不需要大量的图片数据,大约200到400张图像即可满足训练需求。

神经网络架构选择更多内容访问ttocr.com或联系1436423940
在验证码识别中,主流的两种方法是:

YOLO目标检测 + Siamese 网络进行相似度判断
YOLO目标检测 + CRNN进行文字识别
对于本项目,我们建议使用YOLO + Siamese网络,特别是在图标和文字的识别方面,这种方法效果较好。相比之下,CRNN虽然效果好,但需要大量的数据支持和长时间的训练,因此我们选择第一种方法。

注意事项
某些验证码的参考图片包含透明背景,这可能会影响相似度模型的训练效果。为避免这种情况,可以将这些图像的透明背景转换为白色,这样可以确保模型的训练和预测结果更为准确。

数据集构建
图片标注
图片标注的目标是识别图像中的文字部分。其他信息如图标标注、背景等不必考虑。标注时,我们只需要关注文字区域的标定,并确保数据的准确性。

具体标注方法可以参考我之前的文章。

注意事项
在某些情况下,参考文字与目标文字可能会位于同一张图片内,这时需要分别标注它们为不同类型。如果图片中包含图标,它们的位置是固定的,可以直接裁剪出来。极少会出现包含多种图标的情况。

YOLOv5目标检测
训练模型
YOLO训练的具体步骤已经在我之前的文章中介绍过,如果感兴趣可以查看链接。

构建相似度模型

我们将使用VGG16作为骨干网络,结合Siamese神经网络结构,构建一个相似度模型。该模型的目标是接收两张经过处理的图片,并输出它们的相似度值。该相似度值将会在0到1之间,代表两张图片的相似程度。

数据集
将所有经过目标检测并裁剪的图片按类别存储。需要注意的是,由于相似度模型无法直接处理文字,因此文字部分需要转换为图片形式。

以下是将文字转为图片的代码示例:

python

from PIL import Image, ImageDraw, ImageFont
from io import BytesIO

def text_to_image(text, text_color='black', bg_color='white'):
"""将文字转换为图片"""
img = Image.new('RGB', (100, 100), color=bg_color)
img_draw = ImageDraw.Draw(img)
width, height = img.size
font = ImageFont.truetype('msyh.ttc', size=75)
w = font.getlength(text)
img_draw.text(((width - w) / 2, 0), text, fill=text_color, font=font)
buf = BytesIO()
img.save(buf, format="JPEG")
return buf.getvalue()
我还使用了一个简单的PyQt5界面来进行人工分类。

最终,整理好的数据集可以按照如下目录结构进行存储:

kotlin

train

丁_672.png
丁_673.png
.....

七_7408.png
七_7409.png
.....
val

丁_672.png
丁_673.png
.....

七_7408.png
训练集和验证集的比例可以根据实际需求进行调整,常见的设置是90%的数据用于训练,10%用于验证。

训练模型
相关的存储库代码可以从以下链接获得:

Siamese-pytorch
dianxuan
Siamese-pytorch存储库是比较常用的,但它可能需要对代码进行一些修改以适应我们的数据集。为了避免出错,我们可以使用第二个存储库,它虽然代码不如前者简洁,但能满足我们的需求。

在开始训练之前,模型会下载一个预训练的VGG16模型文件。由于下载速度较慢,我们可以手动从以下链接下载模型文件:

下载VGG16模型

下载后,将模型文件放入%USERPROFILE%.cache\torch\hub\checkpoints目录中。

训练命令

python train.py
等待训练完成后,可以查看模型的损失(loss)和准确率(accuracy)。

导出ONNX模型
将训练好的模型导出为ONNX格式,以便在其他平台上使用。创建export.py文件,内容如下:

import torch
from text import Siamese

out_onnx = 'model.onnx'
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
dummy = (torch.randn(1, 3, 105, 105).to(device), torch.randn(1, 3, 105, 105).to(device))
model = torch.load('你的模型路径')
model.eval()

model = model.to(device)
torch_out = torch.onnx.export(model, dummy, out_onnx, input_names=["x1", "x2"])
print("finish!")
模型评估
创建predict.py用于评估模型:

python

import cv2
import onnx
import onnxruntime
import numpy as np

加载ONNX模型

onnx_model_path = 'model.onnx'
onnx_model = onnx.load(onnx_model_path)

创建ONNX推理会话

ort_session = onnxruntime.InferenceSession(onnx_model_path)

image1 = cv2.imread(r'1.jpg')
image2 = cv2.imread(r'2.jpg')

image1 = cv2.cvtColor(image1, cv2.COLOR_BGR2RGB)
image2 = cv2.cvtColor(image2, cv2.COLOR_BGR2RGB)

将图片转换为numpy数组

input1 = cv2.resize(image1, (105, 105)).astype(np.float32) / 255
input2 = cv2.resize(image2, (105, 105)).astype(np.float32) / 255

转换形状为 (C, H, W)

input1 = np.transpose(input1, (2, 0, 1))
input2 = np.transpose(input2, (2, 0, 1))

添加batch维度

input1 = np.expand_dims(input1, axis=0)
input2 = np.expand_dims(input2, axis=0)

outputs = ort_session.run(None, {'x1': input1, 'x2': input2})

输出相似度

print(outputs[0][0][0])
输出的数值即为图片之间的相似度。

图片识别与验证
结合目标检测和相似度模型,可以通过裁剪图片、转换文字为图像、然后计算每对图片之间的相似度,生成一个相似度矩阵。处理后,我们可以根据相似度最大值的索引来优化结果,直到矩阵中的所有值都为0。****

标签:Vyper,onnx,模型,torch,cv2,验证码,编写,model,图片
From: https://www.cnblogs.com/ocr12/p/18599302

相关文章

  • 初识Linux · 编写生产消费模型(2)
    目录前言:RingQueue编写生产消费模型认识接口开始编写前言:前文我们介绍了基于阻塞队列实现生产消费模型,使用阻塞队列实现生产消费模型中,我们学习到了pthread_cond_wait的第二个参数的重要性,不仅会解锁,此时锁被其他人持有,当条件满足的时候,就重新竞争锁,所以在pthread_cond_......
  • 初识Linux · 编写生产消费模型(1)
    目录前言:阻塞队列前言:前文我们花了大量篇幅介绍了线程同步的概念,同时引出了条件变量,认识了相应的接口,并且快速编写了一个简单的测试用例见识了一下条件变量的使用,并且有意思的是,在Ubuntu环境下,man不了条件变量对应的接口,所以想要查询对应的接口可以使用对应的centos系统。......
  • 使用 Hutool 在 Java 中生成验证码
    文章目录详细步骤1.安装JDK和IDE2.创建Maven项目3.添加Hutool依赖4.编写验证码生成代码5.运行代码6.查看结果详细步骤1.安装JDK和IDE安装JDK访问OracleJDK或OpenJDK网站下载适合你操作系统的JDK版本。按照安装向导完成安装,并配置环境......
  • 某滑块验证码识别思路(附完整代码)
    思路验证码类型如下:大概搜索了下,有两种主流思路:yolo目标检测算法和opencv模版匹配。很明显第二种成本远小于第一种,也不需要训练。而且这种验证码有干扰(两个目标点),yolo一次还不能直接到位,还得进一步处理。我在搜索的时候还有用轮廓匹配做识别的,但是实测下来准确率很低,这里就......
  • PbootCMS如何取消留言、自定义表单的验证码?
    在PbootCMS中,验证码可以增加系统的安全性,但在某些情况下,你可能希望取消留言表单和自定义表单中的验证码,以简化用户操作。以下是如何在PbootCMS中取消这些验证码的详细步骤和注意事项。登录PbootCMS后台:打开浏览器,访问你的PbootCMS后台登录页面(通常是 你的域名/admin)。输入......
  • Burp(8)-验证码爆破插件
    声明:学习视频来自b站up主泷羽sec,如涉及侵权马上删除文章 感谢泷羽sec团队的教学视频地址:burp(6)暴力破解与验证码识别绕过_哔哩哔哩_bilibili本文详细介绍验证码爆破插件captcha-killer-modified的使用。一、环境配置安装ddddocr和aiohttp模块安装命令:pipinstall......
  • 使用 Vyper 编写简易文字识别程序
    Vyper是一种Python风格的智能合约编程语言,主要用于Ethereum区块链的智能合约开发。尽管Vyper主要应用于智能合约领域,我们依然可以用它来实现一些基础的程序逻辑。这篇文章将展示如何用Vyper编写一个基本的文字识别程序,通过处理用户输入的简单特征字符串来“识别”对应的......
  • 随机生成一个指定长度的验证码
    functiongenerateCaptcha(length){letresult='';constcharacters='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';//可以根据需要修改字符集constcharactersLength=characters.length;for(leti=0;i<length;......
  • burp抓取app数据包&burp验证码识别——真保姆级教程,成功率惊人的高,百试百灵
    免责声明学习视频来自B站up主泷羽sec,如涉及侵权马上删除文章。笔记的只是方便各位师傅学习知识,以下代码、网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。B站地址:https://space.bilibili.com/350329294(注:全文实验环境为,雷电模拟器9.0.63版本,bu......
  • MarkDown文档的编写
    MarkDown的基本语法MarkDown的标题语法 通过#进行创建标题,#的数量控制标题的级别MarkDown的段落语法 通过空白行将一行或者多行文本进行分隔MarkDown的强调语法粗体 使用两个*或者两个_包裹斜体 使用一个*或者一个_包裹粗体和斜体 使用三个*或者三个_包裹MarkDo......