某集团GIF动态验证码识别

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路
如有侵犯,请联系作者下架

本文识别已同步上线至OCR识别网站: http://yxlocr.nat300.top/ocr/other/16

最近某集团更新了验证码,采用gif验证码,部分数据集展示如下
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
该验证码由固定的五位数字字母或者10以内的计算题组成,gif验证码分很多种形式,有的是通过滑动帧来展示,该验证码则是采用帧隐藏部分验证码,这种验证码虽然每一帧都包含了不同的验证码,但其实处理起来也是非常简单,直接采用帧叠加的方式即可,首先来看下成品展示,使用本文所提供的方法,准确率可以达到98%
在这里插入图片描述
在这里插入图片描述
不管使用pillow还是opencv都可以实现帧叠加的效果,下面我将采用base64编码转成cv2来实现帧叠加的效果

import imageio
import cv2
import numpy as npgif_file = "output_image.gif"
reader = imageio.get_reader(gif_file)
frames = [frame for frame in reader]# 将 RGB 转换为 BGR
frames_bgr = [cv2.cvtColor(frame, cv2.COLOR_RGB2BGR) for frame in frames]# 获取第一帧的尺寸
frame_height, frame_width, _ = frames_bgr[0].shape# 创建空白画布,初始化为黑色
merged_image = np.zeros((frame_height, frame_width, 3), dtype=np.uint8)# 遍历所有帧,逐帧叠加
for frame in frames_bgr:# 将当前帧叠加到画布上# 使用 cv2.addWeighted 来实现透明叠加效果merged_image = cv2.addWeighted(merged_image, 0.8, frame, 0.2, 0)# 保存合并后的图像
cv2.imwrite(f"1.png", merged_image)

我们批量叠加来看下效果
在这里插入图片描述
可以看到,依然还是很难分辨的,因为我们的帧叠加是不做任何图像增强的操作,当然也可能跟我的透明阈值有关,但其实做到这个程度就够了,只是人眼在标注上很难区分,但模型只要通过训练,对于这些验证码还是小case的,这种验证码放在业界其实也就是入门级别的训练了,这里我们也不造轮子,直接使用paddleocr进行训练,这里我使用paddleocrv4进行训练,v4是当前PaddleOCR最新版本,首先我们需要标注数据,标注完之后编写paddleocr需要的标签文件如下:
在这里插入图片描述
上述图片中,我将带框的验证码,也就是错误的验证码(这部分实际上是脏数据)标记为-来处理,总共大概准备几千张即可(你也可以增量训练)
在这里插入图片描述
随后只用en_PP-OCRv4_rec.yml配置文件来进行模型的训练,模型参数配置默认即可,epoch稍微增加些
在这里插入图片描述
我这里采用双卡进行训练学习

python3 -m paddle.distributed.launch --gpus '0,,1' tools/train.py -c configs/rec/PP-OCRv4/en_PP-OCRv4_rec.yml -o Global.pretrained_model=./pretrain_models/en_PP-OCRv4_rec_train/best_accuracy

在这里插入图片描述
训练结束后,可以将其导出为inference模型

python3 tools/export_model.py -c configs/rec/PP-OCRv4/en_PP-OCRv4_rec.yml -o Global.pretrained_model=./output/rec_ppocr_gif/best_accuracy Global.save_inference_dir=./inference/en_PP-OCRv4_rec/

生成后模型目录如下:
在这里插入图片描述

在该目录下生成inference模型后,如果想脱离paddle环境,还可以再导出为onnx模型,安装paddle2onnx后即可讲inference模型转换为onnx

paddle2onnx --model_dir ./inference/en_PP-OCRv4_rec  --model_filename inference.pdmodel  --params_filename inference.pdiparams  --save_file ./inference/en_PP-OCRv4_rec/model.onnx --opset_version 11  --enable_onnx_checker True

转换后,可以看到在同级目录有个model.onnx
在这里插入图片描述
随后,我们可以使用onnx模型进行,由于脱离了paddle环境,图像的预处理是需要我们手动完成的

def ocr_predict(img_reg):chars = '0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~!"#$%&\'()*+,-./ 'img_size = (48, 320, 3)imgH, imgW, imgC = img_size[:3]max_wh_ratio = imgW / imgHimgW = int((imgH * max_wh_ratio))h, w = img_reg.shape[:2]ratio = w / float(h)if math.ceil(imgH * ratio) > imgW:resized_w = imgWelse:resized_w = int(math.ceil(imgH * ratio))# recg_scr = cv2.resize(img_reg, (img_size[1],img_size[0]))resized_image = cv2.resize(img_reg, (resized_w, imgH))resized_image = resized_image.astype("float32")resized_image = resized_image.transpose((2, 0, 1)) / 255resized_image -= 0.5resized_image /= 0.5padding_im = np.zeros((3, 48, 320), dtype=np.float32)padding_im[:, :, 0:resized_w] = resized_imagepadding_im = np.expand_dims(padding_im, axis=0)recg_scr = np.asarray(padding_im, dtype=np.float32)# image = Image.open(dir_name + file)# image = valid_transform(image)# image = image.unsqueeze(0)# ort_inputs = {ort_session.get_inputs()[0].name}# output = ort_session.run(None, ort_inputs)inname_session = [input.name for input in ort_session.get_inputs()]outname_session = [output.name for output in ort_session.get_outputs()]out_put = ort_session.run(outname_session, {inname_session[0]: recg_scr})preds = np.argmax(out_put[0], axis=2)# preds_idx = preds.argmax(axis=2)preds_prob = np.max(out_put[0], axis=2)# print(preds)preds = preds[0]plate = ""last_babel = -1idx = []for i in range(len(preds)):if preds[i] != 0 and preds[i] != last_babel:plate += chars[int(preds[i]) - 1]idx.append(i)last_babel = preds[i]plate_conf = []for i in range(len(idx)):plate_conf.append(preds_prob[0][idx[i]])return plate

我们批量测试一下验证码的,准确率很高!
在这里插入图片描述

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

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

相关文章

数据库系统原理:数据恢复与备份策略

3.1可行性分析 开发者在进行开发系统之前&#xff0c;都需要进行可行性分析&#xff0c;保证该系统能够被成功开发出来。 3.1.1技术可行性 开发该《数据库系统原理》课程平台所采用的技术是vue和MYSQL数据库。计算机专业的学生在学校期间已经比较系统的学习了很多编程方面的知识…

CPU算法分析LiteAIServer裸土检测算法如何应用在农田科学管理中?

农田是农业生产的基础&#xff0c;是保障国家粮食安全和农业可持续发展的关键。随着人口增长和城市化进程的加快&#xff0c;农田保护和治理面临着前所未有的挑战。如今农田土壤依旧面临着巨大挑战&#xff1a; 1、‌土壤侵蚀‌&#xff1a;长期的风蚀、水蚀等自然因素&#x…

Marscode AI辅助编程

直接使用Marscode的云服务来开发&#xff0c;也是很方便的&#xff0c;不用担心配置环境的问题&#xff0c;很适合初步学习&#xff0c;在任何设备都能开发。 番茄钟 请你基于html、tailwind css和javascript&#xff0c;帮我设计一个“番茄时钟”。要求UI简洁美观大方&#x…

Debian 12 安装配置 fail2ban 保护 SSH 访问

背景介绍 双十一的时候薅羊毛租了台腾讯云的虚机, 是真便宜, 只是没想到才跑了一个月, 系统里面就收集到了巨多的 SSH 恶意登录失败记录. 只能说, 互联网真的是太不安全了. 之前有用过 fail2ban 在 CentOS 7 上面做过防护, 不过那已经是好久好久之前的故事了, 好多方法已经不…

idea2024创建JavaWeb项目以及配置Tomcat详解

今天呢&#xff0c;博主的学习进度也是步入了JavaWeb&#xff0c;目前正在逐步杨帆旗航&#xff0c;迎接全新的狂潮海浪。 那么接下来就给大家出一期有关JavaWeb的配置教学&#xff0c;希望能对大家有所帮助&#xff0c;也特别欢迎大家指点不足之处&#xff0c;小生很乐意接受正…

Canoe E2E校验自定义Checksum算法

文章目录 一、添加 DBC文件二、导入要仿真的ECU节点三、编写 CAPL脚本1. 创建 .can 文件2. 设置counter递增3. 设置 CRC 算法&#xff0c;以profile01 8-bit SAE J1850 CRC校验为例 四、开始仿真五、运行结果CRC在线校验 当E2E的 CRC算法非常规算法&#xff0c;则需要自己编写代…

PyTorch 神经网络回归(Regression)任务:关系拟合与优化过程

PyTorch 神经网络回归&#xff08;Regression&#xff09;任务&#xff1a;关系拟合与优化过程 本教程介绍了如何使用 PyTorch 构建一个简单的神经网络来实现关系拟合&#xff0c;具体演示了从数据准备到模型训练和可视化的完整过程。首先&#xff0c;利用一维线性空间生成带噪…

【uni-app】2025最新uni-app一键登录保姆级教程(包含前后端获取手机号方法)(超强避坑指南)

前言&#xff1a; 最近在配置uni-app一键登录时遇到了不少坑&#xff0c;uni-app的配套文档较为混乱&#xff0c;并且有部分更新的内容也没有及时更改在文档上&#xff0c;导致部分开发者跟着uni-app配套文档踩坑&#xff01;而目前市面上的文章质量也层次不齐&#xff0c;有的…

干货分享:ISO 20000认证的适用范围、认证资料清单、认证流程等问题详解

编辑&#xff1a;石芸姗 审核&#xff1a;贺兆普 在当今这个数字化时代&#xff0c;信息技术&#xff08;IT&#xff09;已成为企业运营与发展的核心驱动力。随着技术的不断进步和业务需求的日益复杂&#xff0c;企业对IT服务的质量、效率及安全性提出了更高要求。 信息技术服…

Element-plus表格使用总结

这里我使用的是Vue工程进行开发学习&#xff0c;安装需要通过包管理器进行下载 npm install element-plus --save 然后在main.js中配置文件即可使用&#xff0c;如果在引入index.css时没有提示&#xff0c;无需担心&#xff0c;直接写index.css即可导入样式。 Table表格 表格…

CNN和Transfomer介绍

文章目录 CNN和Transfomer介绍CNN和Transfomer的区别1. **基本概念**2. **数据处理方式**3. **模型结构差异**4. **应用场景区别** 自注意力机制1. **自注意力机制的概念**2. **自注意力机制的实现步骤**3. **自注意力机制的优势** Transformer结构组成1. **多头注意力层&#…

如何解决 ‘adb‘ 不是内部或外部命令,也不是可运行的程序或批处理文件的问题

在cmd中输入 adb &#xff0c;显示 ‘adc‘ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件的问题 解决办法&#xff1a;在环境变量中添加adb所在的路径 1、找到 adb.exe 的所在的文件路径&#xff0c;一般在 Android 安装目录下 \sdk\platform-tools\adb.exe…

数据结构---------二叉树前序遍历中序遍历后序遍历

以下是用C语言实现二叉树的前序遍历、中序遍历和后序遍历的代码示例&#xff0c;包括递归和非递归&#xff08;借助栈实现&#xff09;两种方式&#xff1a; 1. 二叉树节点结构体定义 #include <stdio.h> #include <stdlib.h>// 二叉树节点结构体 typedef struct…

网络架构与IP技术:4K/IP演播室制作的关键支撑

随着科技的不断发展&#xff0c;广播电视行业也在不断迭代更新&#xff0c;其中4K/IP演播室技术的应用成了一个引人注目的焦点。4K超高清技术和IP网络技术的结合&#xff0c;不仅提升了节目制作的画质和效果&#xff0c;还为节目制作带来了更高的效率和灵活性。那么4K超高清技术…

MySQL 8.0:explain analyze 分析 SQL 执行过程

介绍 MySQL 8.0.16 引入一个实验特性&#xff1a;explain formattree &#xff0c;树状的输出执行过程&#xff0c;以及预估成本和预估返 回行数。在 MySQL 8.0.18 又引入了 EXPLAIN ANALYZE&#xff0c;在 formattree 基础上&#xff0c;使用时&#xff0c;会执行 SQL &#…

观察者模式(sigslot in C++)

大家&#xff0c;我是东风&#xff0c;今天抽点时间整理一下我很久前关注的一个不错的库&#xff0c;可以支持我们在使用标准C的时候使用信号槽机制进行观察者模式设计&#xff0c;sigslot 官网&#xff1a; http://sigslot.sourceforge.net/ 本文较为详尽探讨了一种观察者模…

【已解决】黑马点评项目Redis版本替换过程中误删数据库后前端显示出现的问题

为了实现基于Redis的Stream结构作为消息队列&#xff0c;实现异步秒杀下单的功能&#xff0c;换Redis版本 Redis版本太旧了&#xff0c;所以从3.2.1换成了5.0.14 此时犯了一个大忌&#xff0c;因为新的Redis打开后&#xff0c;没有缓存&#xff0c;不知道出了什么问题&#xf…

基于Spring Boot的九州美食城商户一体化系统

一、系统背景与目标 随着美食城行业的快速发展&#xff0c;传统的管理方式已经难以满足日益增长的管理需求和用户体验要求。因此&#xff0c;九州美食城商户一体化系统应运而生&#xff0c;旨在通过信息化、智能化的管理方式&#xff0c;实现美食城的商户管理、菜品管理、订单…

springboot vue 会员营销系统

springboot vue 会员营销系统介绍 演示地址&#xff1a; 开源版本&#xff1a;http://8.146.211.120:8083/ 完整版本&#xff1a;http://8.146.211.120:8086/ 移动端 http://8.146.211.120:8087/ 简介 欢迎使用springboot vue会员营销系统。本项目包含会员储值卡、套餐卡、计…

HarmonyOS NEXT 技术实践-基于意图框架服务实现智能分发

在智能设备的交互中&#xff0c;如何准确理解并及时响应用户需求&#xff0c;成为提升用户体验的关键。HarmonyOS Next 的意图框架服务&#xff08;Intents Kit&#xff09;为这一目标提供了强大的技术支持。本文将通过一个项目实现的示例&#xff0c;展示如何使用意图框架服务…