基于paddleocr实现验证码识别——训练数据

news2024/11/14 15:11:43

一、项目介绍

验证码(CAPTCHA)用于区分用户是人类还是计算机程序(如机器人)。这是为了防止各种形式的自动化攻击和滥用。以下是需要验证码识别的几个主要原因:

1. 防止恶意破解密码

攻击者可能会使用自动化程序进行暴力破解尝试,即不断尝试不同的密码组合以破解用户账户。验证码可以有效阻止这种行为,因为自动化程序无法轻松地通过验证码的挑战。

2. 防止刷票和操纵投票结果

在投票或抽奖等需要用户参与的活动中,攻击者可能会编写脚本进行刷票,从而操纵结果。通过验证码,系统可以确保每次投票都是由人类用户完成的,防止刷票行为。

3. 防止论坛灌水和垃圾信息

攻击者可能会使用自动化程序在论坛或评论区发布大量广告或垃圾信息。验证码可以有效防止这些自动化程序的滥用,维护平台的内容质量。

4. 防止自动化注册

在注册过程中,攻击者可能会利用自动化程序批量创建虚假账户,用于后续的恶意活动。验证码可以确保只有人类用户才能完成注册,从而防止虚假账户的生成。

5. 防止针对特定用户的暴力登录尝试

攻击者可能会对特定用户的账户进行持续的暴力登录尝试,试图获取访问权限。验证码可以增加登录过程的难度,防止这些攻击行为的成功。

6. 防止资源滥用

一些网站提供的免费服务可能会被恶意程序批量调用,从而造成资源浪费和服务质量下降。验证码可以限制对服务的自动化访问,确保资源合理使用。

验证码的作用机制

验证码通过生成一个随机的问题或挑战,要求用户在提交请求前进行解答。这些问题通常包含扭曲的字母和数字、图像识别、拼图等,设计目的是让人类用户能够轻松解决,而自动化程序难以处理。

计算机生成与评判

  • 生成:验证码可以由计算机生成,这些挑战通常随机且唯一,以防止重复和猜测。
  • 评判:系统会评判用户的回答是否正确,以此来决定是否允许请求通过。

未来的验证码技术

随着技术的发展,传统的验证码可能会被更加先进的方法替代,例如:

  • 行为分析:通过分析用户的鼠标移动、点击速度和打字方式来判断是否为人类。
  • 生物识别:使用指纹、面部识别等生物特征进行验证。

验证码是现代网络安全中不可或缺的一部分,通过有效的验证码机制,可以保护用户和系统免受各种自动化攻击和滥用。

2. 项目实践

2.1 常见验证码类型及相关优缺点

1. 数字和字母的随机组合
  • 特点:这是最原始的验证码形式,通常为随机生成的数字和字母组合,较为简单。
  • 优点:实现简单,容易生成。
  • 缺点:验证强度较低,容易被自动化程序破解。
  • 应用实例:早期的CSDN用户登录使用的GIF格式验证码。
2. 汉字验证码
  • 特点:使用随机生成的汉字,增加了输入的难度。
  • 优点:比数字和字母验证码更难破解,尤其对于非母语用户。
  • 缺点:输入难度较高,用户体验可能不佳。
  • 应用实例:QQ申诉页面的汉字验证码。
3. 混合格式验证码
  • 特点:使用随机数字、字母(大小写),并加入随机干扰元素如像素噪声、随机位置等。
  • 优点:增加了验证码的复杂性和安全性。
  • 缺点:识别难度较高,可能影响用户体验。
  • 应用实例:MS的Hotmail申请时使用的BMP格式验证码。
4. 多语言验证码
  • 特点:使用不同语言的字符,如韩文或日文,进一步增加破解难度。
  • 优点:对非本地化用户有较大的验证强度。
  • 缺点:输入难度很大,对特定用户群体不友好。
  • 应用实例:某些国际网站注册时可能要求输入韩文或日文验证码。
5. 复杂验证码(如Google Gmail使用的)
  • 特点:随机英文字母搭配随机颜色、位置、长度等多种变化组合。
  • 优点:大大提升了防破解能力。
  • 缺点:较高的复杂度,可能降低用户输入的准确性。
  • 应用实例:Google Gmail注册时使用的JPG格式验证码。
6. XBM格式验证码
  • 特点:内容随机,并且采用XBM格式(黑白二值图像)。
  • 优点:黑白二值图像相对简单,但可以通过内容的随机性提升安全性。
  • 缺点:安全性和复杂性较低,已不常用。
  • 应用实例:一些较老的论坛可能会使用。
7. 广告验证码
  • 特点:通过输入广告中的部分内容来完成验证。
  • 优点:可以为网站带来额外收入,同时为用户提供新鲜感。
  • 缺点:可能会影响用户体验,广告内容不稳定。
  • 应用实例:部分网站采用此类验证码。
8. 问题验证码
  • 特点:以问答形式进行验证,如简单的数学问题或常识性问题。
  • 优点:容易辨别和输入,且具有高度的可定制性。
  • 缺点:问题库如果不够多样,容易被机器学习算法破解。
  • 应用实例:系统生成诸如“1+2=?”的问题,或类似“中国的全称是什么?”。

本次使用的验证码类型为数字和大小写字母的随机组合,并加入了随机干扰像素随机位置,以增加识别难度。
数据样式:
在这里插入图片描述

2.2 数据集整合格式

数据集名字命名,label

#2.生成总的标签文件
import os
train_path = "./home/chenweifeng/Desktop/Verification_code"
SUM = []
for root,dirs,files in os.walk(train_path): # 分别代表根目录、文件夹、文件
    for file in files:              
        imgpath = os.path.join(root,file)
        SUM.append(imgpath+"\t"+file.split(".")[0]+"\n")   
    # 生成总标签文件
    allstr = ''.join(SUM)
    f = open('work/total_list.txt','w',encoding='utf-8')
    f.write(allstr)
    f.close
print("数据集数量:{}".format(len(SUM)))

在这里插入图片描述

2.3 识别字典制作

文字识别模型的训练使用的字典需要包含所有希望被正确识别的字,字典需要写成如下格式,一行一个字符,并以 utf-8 编码格式保存。该项目一共使用了10个数字(0-9),26个大写字母(A-Z),26个小写字母(a-z),共62个字符,在这里我们使用集合对总的数据集中的标签内容生成字典,这方法适用于绝大多数情况下的字典生成,尤其是无法知道数据集识别文字的内容时比较好用。这里生成的数据集是SimpleDataSet格式的,也就是每行是文件名和对应的标签,中间隔着分隔符’\t’

import codecs
class_set = set()
lines = []
file = open("total_list.txt","r",encoding="utf-8")#待转换文档,这里我们使用的是数据集的标签文件
for i in file:
    a=i.strip('\n').split('\t')[-1]
    lines.append(a)
file.close
for line in lines:
    for e in line:
        class_set.add(e)
class_list = list(class_set)
class_list.sort()
print("class num: {0}".format(len(class_list)))
with codecs.open("new_dict.txt", "w", encoding='utf-8') as label_list:
    for id, c in enumerate(class_list):
        
        label_list.write("{0}\n".format(c))

在这里插入图片描述

2.4环境安装

git clone https://gitee.com/paddlepaddle/PaddleOCR.git

在这里插入图片描述
安装相关依赖环境,用于安装PaddleOCR项目所需的所有依赖库

pip install -r PaddleOCR/requirements.txt

在这里插入图片描述

2.4.1 训练脚本

在这里插入图片描述

  1. 训练脚本
!python3 ./tools/train.py -c en_PP-OCRv3_rec.yml -o Global.pretrained_model=./output/best_accuracy Global.infer_img=./test
  1. ./tools/train.py

    • 这是PaddleOCR项目中的训练脚本的路径。运行该脚本来启动模型训练。
  2. en_PP-OCRv3_rec.yml

    • -c 选项用于指定配置文件。
    • en_PP-OCRv3_rec.yml 是配置文件的路径。该文件包含了训练过程中所需的各种配置信息,如模型架构、训练数据路径、超参数设置等。
  3. -o

    • -o 选项用于在命令行中覆盖配置文件中的某些配置参数。后面跟着的是一系列键值对,格式为参数名=值
  4. Global.pretrained_model=./output/best_accuracy

    • 这是一个通过-o选项指定的覆盖参数。
    • Global.pretrained_model 用于指定预训练模型的路径。在这里,路径是 ./output/best_accuracy
    • 预训练模型可以帮助模型在已有知识的基础上进行进一步训练,加快收敛速度,提高精度。
  5. Global.infer_img=./test

    • 这是另一个通过-o选项指定的覆盖参数。
    • Global.infer_img 用于指定用于推理的图像或图像目录。在这里,路径是 test
    • 这个参数在训练过程中可能用于评估或验证模型的性能。

3. 相关配置文件

Global 部分

  • debug: 是否启用调试模式,false 表示不启用。
  • use_gpu: 是否使用GPU进行训练,true 表示使用GPU。
  • epoch_num: 训练的总轮数,这里设置为500。
  • log_smooth_window: 日志平滑窗口大小,即对日志信息进行平滑处理的窗口大小。
  • print_batch_step: 每100个批次打印一次日志。
  • save_model_dir: 模型保存目录,这里设置为./output/v3_en_mobile
  • save_epoch_step: 每隔50个轮次保存一次模型。
  • eval_batch_step: 每2000个批次进行一次评估。
  • cal_metric_during_train: 在训练过程中计算指标,true 表示计算。
  • pretrained_model: 预训练模型的路径,这里为空,表示不使用预训练模型。
  • checkpoints: 检查点路径,这里为空,表示不使用检查点。
  • save_inference_dir: 推理模型保存路径,这里为空。
  • use_visualdl: 是否使用VisualDL进行可视化,true 表示使用。
  • infer_img: 用于推理的图像路径,这里设置为doc/imgs_words/ch/word_1.jpg
  • character_dict_path: 字符字典文件路径,这里设置为/work/new_dict.txt
  • max_text_length: 最大文本长度,这里设置为6。
  • infer_mode: 是否启用推理模式,false 表示不启用。
  • use_space_char: 是否使用空格字符,false 表示不使用。
  • distributed: 是否使用分布式训练,true 表示使用。
  • save_res_path: 结果保存路径,这里设置为./output/rec/predicts_ppocrv3_en.txt

Optimizer 部分

  • name: 优化器名称,这里使用Adam
  • beta1: Adam优化器的β1参数,设置为0.9。
  • beta2: Adam优化器的β2参数,设置为0.999。
  • lr: 学习率相关设置。
    • name: 学习率调整策略,这里使用Cosine
    • learning_rate: 初始学习率,设置为0.001。
    • warmup_epoch: 预热轮次,设置为5轮。
  • regularizer: 正则化器相关设置。
    • name: 正则化器名称,这里使用L2
    • factor: L2正则化因子,设置为3.0e-05。

Architecture 部分

  • model_type: 模型类型,这里是rec(识别模型)。
  • algorithm: 算法名称,这里使用SVTR
  • Transform: 变换模块,未具体定义。
  • Backbone: 主干网络相关设置。
    • name: 主干网络名称,这里使用MobileNetV1Enhance
    • scale: 缩放因子,设置为0.5。
    • last_conv_stride: 最后一层卷积的步幅,设置为[1, 2]。
    • last_pool_type: 最后一层池化类型,设置为avg
  • Head: 头部网络相关设置。
    • name: 头部网络名称,这里使用MultiHead
    • head_list: 多头部网络配置列表。
      • CTCHead: CTC头部网络配置。
        • Neck: 颈部网络配置。
          • name: 颈部网络名称,这里使用svtr
          • dims: 维度,设置为64。
          • depth: 深度,设置为2。
          • hidden_dims: 隐藏层维度,设置为120。
          • use_guide: 是否使用指导,true 表示使用。
        • Head: 头部配置。
          • fc_decay: 全连接层的衰减因子,设置为0.00001。
      • SARHead: SAR头部网络配置。
        • enc_dim: 编码维度,设置为512。
        • max_text_length: 最大文本长度,引用全局的max_text_length

Loss 部分

  • name: 损失函数名称,这里使用MultiLoss
  • loss_config_list: 多损失函数配置列表。
    • CTCLoss: CTC损失函数配置。
    • SARLoss: SAR损失函数配置。

PostProcess 部分

  • name: 后处理名称,这里使用CTCLabelDecode

Metric 部分

  • name: 指标名称,这里使用RecMetric
  • main_indicator: 主要指标,这里是acc
  • ignore_space: 是否忽略空格,false 表示不忽略。

Train 部分

  • dataset: 数据集相关设置。
    • name: 数据集名称,这里使用SimpleDataSet
    • data_dir: 数据目录,这里设置为./work/Verification_code
    • ext_op_transform_idx: 外部操作变换索引,设置为1。
    • label_file_list: 标签文件列表,这里设置为/home/aistudio/work/train_list.txt
    • transforms: 数据变换列表。
      • DecodeImage: 解码图像。
        • img_mode: 图像模式,这里是BGR
        • channel_first: 通道是否优先,false 表示不优先。
      • RecConAug: 识别对比增强。
        • prob: 概率,设置为0.5。
        • ext_data_num: 扩展数据数量,设置为2。
        • image_shape: 图像形状,设置为[48, 320, 3]。
      • RecAug: 识别增强。
      • MultiLabelEncode: 多标签编码。
      • RecResizeImg: 识别调整图像大小。
        • image_shape: 图像形状,设置为[3, 48, 320]。
      • KeepKeys: 保留键。
        • keep_keys: 保留的键列表,包括imagelabel_ctclabel_sarlengthvalid_ratio
  • loader: 数据加载器相关设置。
    • shuffle: 是否打乱数据,true 表示打乱。
    • batch_size_per_card: 每张卡的批量大小,设置为64。
    • drop_last: 是否丢弃最后一个不完整的批次,true 表示丢弃。
    • num_workers: 工作线程数,设置为4。

Eval 部分

  • dataset: 数据集相关设置。
    • name: 数据集名称,这里使用SimpleDataSet
    • data_dir: 数据目录,这里设置为./work/Verification_code
    • label_file_list: 标签文件列表,这里设置为/home/aistudio/work/test_list.txt
    • transforms: 数据变换列表。
      • DecodeImage: 解码图像。
        • img_mode: 图像模式,这里是BGR
        • channel_first: 通道是否优先,false 表示不优先。
      • MultiLabelEncode: 多标签编码。
      • RecResizeImg: 识别调整图像大小。
        • image_shape: 图像形状,设置为[3, 48, 320]。
      • KeepKeys: 保留键。
        • keep_keys: 保留的键列表,包括imagelabel_ctclabel_sarlengthvalid_ratio
  • loader: 数据加载器相关设置。
    • shuffle: 是否打乱数据,false 表示不打乱。
    • drop_last: 是否丢弃最后一个不完整的批次,false 表示不丢弃。
    • batch_size_per_card: 每张卡的批量大小,设置为32。
    • num_workers: 工作线程数,设置为4。

4. 推理测试

测试脚本

# -c 后面设置训练算法的yml配置文件
# -o 配置可选参数
# Global.pretrained_model 参数设置待转换的训练模型地址,不用添加文件后缀 .pdmodel,.pdopt或.pdparams。
!python3 ./tools/infer_rec.py -c en_PP-OCRv3_rec.yml -o Global.pretrained_model=./output/best_accuracy  Global.infer_img=./test

在这里插入图片描述

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

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

相关文章

数据结构----------贪心算法

什么是贪心算法? 贪心算法(Greedy Algorithm)是一种在问题求解过程中,每一步都采取当前状态下最优(即最有利)的选择,从而希望导致最终的全局最优解的算法策略。 贪心算法的核心思想是做选择时&…

【深度学习】DeepSpeed,ZeRO 数据并行的三个阶段是什么?

文章目录 ZeRO实验实验设置DeepSpeed ZeRO Stage-2 实验性能比较进一步优化DeepSpeed ZeRO Stage-3 和 CPU 卸载结论ZeRO ZeRO(Zero Redundancy Optimizer)是一种用于分布式训练的大规模深度学习模型的优化技术。它通过分片模型状态(参数、梯度和优化器状态)来消除数据并行…

Flink异步IO 调用算法总是超时

记录一次使用Flink 异步调用IO 总是超时的bug 注&#xff1a;博主使用的版本就是&#xff1a;<flink.version>1.16.1</flink.version> 起因&#xff1a; 因公司业务需要&#xff0c;使用Flink对数据进行流式处理&#xff0c;具体处理流程就是&#xff0c;从kafka…

PageRank算法与TextRank算法

PageRank PageRank 是一种用于计算网页重要性的算法&#xff0c;其核心思想源自随机浏览模型。这个模型假设一个网络中的用户通过随机点击链接在网页之间跳转&#xff0c;并根据网页的链接结构计算每个网页的重要性。 假设三个网页按以下方式连接&#xff0c;计算每个网页的PR值…

【零基础实战】基于物联网的人工淡水湖养殖系统设计

文章目录 一、前言1.1 项目介绍1.1.1 开发背景1.1.2 项目实现的功能1.1.3 项目硬件模块组成1.1.4 ESP8266工作模式配置 1.2 系统设计方案1.2.1 关键技术与创新点1.2.2 功能需求分析1.2.3 现有技术与市场分析1.2.4 硬件架构设计1.2.5 软件架构设计1.2.6 上位机开发思路 1.3 系统…

Robot Operating System——深度解析单线程执行器(SingleThreadedExecutor)执行逻辑

大纲 创建SingleThreadedExecutor新增Nodeadd_nodetrigger_entity_recollectcollect_entities 自旋等待get_next_executablewait_for_workget_next_ready_executableTimerSubscriptionServiceClientWaitableAnyExecutable execute_any_executable 参考资料 在ROS2中&#xff0c…

ARM知识点二

一、指令 指令的生成过程 指令执行过程示例 if (a 0) {x 0; } else {x x 3; } //翻译为 cmp r0,#0 MOVEQ R1,#0 ADDGT R1,R1,#3指令获取&#xff1a;从Flash中读取 CMP R0, #0&#xff0c;控制器开始执行。 指令解码&#xff1a;解码器解析 CMP 指令&#xff0c;ALU比较R…

DAMA学习笔记(十)-数据仓库与商务智能

1.引言 数据仓库&#xff08;Data Warehouse&#xff0c;DW&#xff09;的概念始于20世纪80年代。该技术赋能组织将不同来源的数据整合到公共的数据模型中去&#xff0c;整合后的数据能为业务运营提供洞察&#xff0c;为企业决策支持和创造组织价值开辟新的可能性。与商务智能&…

浅谈线程组插件之jp@gc - Ultimate Thread Group

浅谈线程组插件之jpgc - Ultimate Thread Group jpgc - Ultimate Thread Group是JMeter的一个强大且灵活的扩展插件&#xff0c;由JMeter Plugins Project提供。它为性能测试提供了超越JMeter原生线程组的更精细的控制能力&#xff0c;允许用户根据复杂的场景设计自定义负载模…

【TFT电容屏】

TFT电容屏基础知识补课 前言一、入门知识1.1 引脚介绍1.1.1 显示部分片选指令选择写指令读操作复位并行数据接口 1.1.2 背光电源背光电源 1.1.3 触摸IIC接口外部中断接口复位NC 1.2 驱动介绍1.3 FSMC介绍 总结 前言 跟着阳桃电子的学习⇨逐个细讲触摸屏接口定义–STM32单片机…

科普文:JUC系列之ForkJoinPool源码解读ForkJoinWorkerThread

科普文&#xff1a;JUC系列之ForkJoinPool基本使用及原理解读-CSDN博客 科普文&#xff1a;JUC系列之ForkJoinPool源码解读概叙-CSDN博客 科普文&#xff1a;JUC系列之ForkJoinPool源码解读WorkQueue-CSDN博客 科普文&#xff1a;JUC系列之ForkJoinPool源码解读ForkJoinTask…

复现sql注入漏洞

Less-1 字符型注入 页面如下&#xff1a; 我们先输入“?id1”看看结果&#xff1a; 页面显示错误信息中显示提交到sql中的“1”在通过sql语句构造后形成“1" LIMIT 0, 1”&#xff0c;其中多了一个“”&#xff0c;那么&#xff0c;我们的任务就是——逃脱出单引号的控制…

petalinux安装成功后登录Linux出现密码账号不正确

安装完Linux系统后发现登陆开发板上的Linux系统登陆一直错误&#xff0c;但你输入的账号和密码确确实实是“root”&#xff0c;但仍然一直在重复登陆。 这个时候就会怀疑自己是不是把密码改了&#xff0c;导致错误&#xff0c;然后又重新创建petalinux工程。 其实这个时候不需…

2024年第二季度HDD出货量和容量分析

概述 根据Trendfocus, Inc.发布的《SDAS: HDD Information Service CQ2 24 Quarterly Update – Executive Summary》报告&#xff0c;2024年第二季度硬盘驱动器(HDD)出货量和容量均出现了显著增长。总体来看&#xff0c;HDD出货量较上一季度增长2%&#xff0c;达到3028万块&a…

MySQLDM笔记-查询库中是否存在列出的表名及查询库中列出的不存在的表名

如下表名&#xff1a; aaa,bb,cc,ccs,dds,csdf,csdfs,sdfa,werwe,csdfsd 在MySQL库中&#xff0c;查询哪些表名在数据库中 SELECT table_name FROM information_schema.tables WHERE table_schema your_database_name_here AND table_name IN (aaa, bb, cc, ccs, dds, csdf…

硬件电路学习记录(七)——全面概述MOS管

目录 1.NMOS&#xff1a; 工作原理 特性 应用 2.PMOS&#xff1a; PMOS的结构与工作原理 结构 工作原理 增强型PMOS与耗尽型PMOS 增强型PMOS&#xff08;Enhancement Mode PMOS&#xff09; 耗尽型PMOS&#xff08;Depletion Mode PMOS&#xff09; 应用 PMOS的工…

不同角色路由权限配置(六)

一、启用方式 配置开启config/config.ts。同时需要 src/access.ts 提供权限配置 export default {access: {},// access 插件依赖 initial State 所以需要同时开启initialState: {}, };这里以扩展的路由配置为例&#xff0c;配置只有admin权限才能查看的页面 1、在src/acces…

新华三H3CNE网络工程师认证—路由基础

我们的一个个网络其实是由不同的广播域构成的&#xff0c;而路由器的作用就是用来连接不同的广播域。那么不同广播域之间是如何通信的呢&#xff1f;比如有三个网段&#xff0c;1.0、2.0和3.0。网段1.0和网段2.0通信需要构造数据包&#xff0c;源是1.1&#xff0c;目标去往2.1。…

3.6 上下文菜单

上下文菜单 上下文菜单就是常见的右键菜单(弹出式菜单)。 显示上下文菜单&#xff0c;阻塞函数 BOOL TrackPopupMenu(HMENU hMenu, //菜单句柄UINT uFlags, //显示方式int x, //水平位置&#xff0c;屏幕坐标系int y, //垂直位置&#xff0c;屏幕坐标系UINT nReserved, //…

Cartopy简介和安装

Cartopy 是一个开源免费的第三方 Python 扩展包&#xff0c;由英国气象办公室的科学家们开发&#xff0c;支持 Python 2.7 和 Python 3&#xff0c;致力于使用最简单直观的方式生成地图&#xff0c;并提供对 matplotlib 友好的协作接口。初学Cartopy&#xff0c;欢迎指正&#…