【全网首发】双字重叠语序验证码识别

在这里插入图片描述

【省流:打算直接测试效果的可以访问这个网址】

http://decaptcha.ai?project_name=netease_zh_overlap

【实现方案】

如图所示,我们能看到,比起以往的“单个字”语序点选,这个验证码的难点在于“重叠汉字“,我们知道,一般的深度学习训练单个汉字的图像分类,我们假设一般的汉字常用字有3500个汉字。我们的输出层维度一般是(1, 3500)

而对于重叠汉字的问题,我们有两种建模形态,一种是两个重叠的字作为一个整体,另一种是把两个重叠的汉字分开,作为两个独立的分类任务。

我当前选择的方案是前者,作为一个整体,为什么我不选择后者呢?因为后者的重叠目标虽然区分开来,但是遮挡部分的特征太过随机了,对于下层汉字被遮挡缺失的特征,很难识别出来具体的内容,而如果我们把它作为一个整体看待,我们特征既提取了上层汉字的特征,也能利用上层的特征推测下层汉字被遮挡部分的特征的可能性,能够帮助网络更加精准的推测出来具体的内容。

那么我们把大致的方向确立好了之后,就可以开始进一步的方案设计了,我们已经确立了把两个重叠的汉字作为一个整体之后,我们就需要开始考虑如何对两个汉字的识别建模了,首先我们有以下几种方案的选择:

  1. 作为多标签分类,建模就是(1, 3500)一样的输出,只不过值是0-1范围,作为概率,那么两个重叠的汉字概率可以设置为0.5,0.5,或者1, 1。其余的分类都是0,如果我们使用这种方式建模,那么我们会遇到一个问题,因为绝大多数分类都是0,模型很容易收敛,即使忽略我们1的部分,损失一样可以很小,在数学层面上,使用BCE损失很难达到预测出来我们需要的两个重叠汉字的目的,所以我们需要对损失函数进行改进,设计一种能够针对极端的正负样本不平衡情况的损失函数。需要标注每张图中的两个汉字的内容,标注成本一般。
  2. 第二种就是我们把它作为两个独立的分类情况,区分上下层,建模就是(1, 2, 3500)这样的话,我们可以把它作为两个独立的多分类任务,只不过这种方案对于标注的要求很高,需要区分上下层,人工外包单独标注单个样本的时候如果没有其他组图进行范围参照的话,错误率挺高。
  3. 我们可以端到端的把四组图作为一个批次的输入(batch_size, 4, 224, 224, 3),这样能够加强每一组图彼此之间的约束,我们的输出可以有多个,结合上面两种方案,顺序输出:(batch_size, 4,2,4),分类输出(batch_size, 4,2, 3500)/(batch_size, 4,3500)。对于端到端的顺序输出,如果我们加入一个小型语言模型的多模态,或者直接单独训练这个语言模型再嵌入端到端模型中,都可以达到比较好的端到端效果,因为现实中我们挺难直接从样本中获取到尽可能多的成语的可能,我们单独训练语料库的难度更低一些。网上有很多开源的语料库可以下载作为训练样本。如果我们只保留顺序输出的话,样本的成本最低,只需要对接人工标注平台打码的同时,采集验证通过的图,我们就能通过得到的顺序坐标,结合一点点(500-1000张左右)目标检测的成本,推理出四组图的顺序,自动化产生样本标注。

有了以上的思路,我们尝试实现它:

    def forward(self, inputs):batch_size, num_images, height, width, channel = inputs.size()predictions = self.core_net(inputs.view(batch_size, num_images, height, width, channel))predictions = predictions.view(batch_size, num_images, self.core_num_classes)embedded = self.embedding(predictions)batch_size, num_groups, embedding_dim = embedded.size()suit_gru, _ = self.pair_gru(embedded)global_gru, hidden_gru = self.global_gru(suit_gru)hidden_gru = hidden_gru.permute(1, 0, 2).contiguous()hidden_gru = hidden_gru.view(batch_size, self.hidden_dim)ranks = self.rank_dense(hidden_gru)ranks = ranks.view(batch_size, 2, num_groups).sigmoid()return ranks

再根据我们选择的建模方案,来设计它对应的损失函数,可以根据我们已知的信息增加多维度的约束,比如我们得到的排序结果的因果关系,结果本身的取值范围的数学规律,场景中存在的某些隐性规则,我们都可以把它作为损失中的加权的影响因子。如果是使用多标签分类我们甚至可以设计一个专用的topk2损失。

除此之外,我们可以使用增强手段,比如把标注的样本相同标注的可以随机配对组合成语,作为一组新的样本等等,损失计算也可以设计阶梯式,引导网络先学习某个容易学习的特征,学习好了再学习另一个特征,加速模型收敛。

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

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

相关文章

【Python机器学习】模型评估与改进——简单的网格搜索

为了提升模型的泛化性能,我们可以通过调参来实现。 在尝试调参之前,重要的是理解参数的含义,找到一个模型的重要参数(提供最佳泛化性能的参数)的取值是一项棘手的任务,但对于几乎所有模型和数据集来说都是…

API-Window对象

学习目标: 掌握Window对象 学习内容: BOM(浏览器对象模型)定时器-延时函数JS执行机制location对象navigation对象history对象 BOM(浏览器对象模型): BOM是浏览器对象模型。 window对象是一个全…

Windows 11的市场份额越来越大了,推荐你升级!

7月1日,系统之家发布最新数据,显示Windows 11操作系统的市场份额正在稳步上升。自2021年10月Windows 11发布以来,Windows 10一直占据着市场主导地位,当时其市场份额高达81.44%。然而,随着时间的推移,Window…

鸿蒙学习1:ArkTS基础入门

1 变量和常量 1.1 变量 常见的基础数据类型: string 字符串、number 数字、boolean布尔 判断。 变量:专门用来存储数据的容器。 语法:let 变量名: 数据类型 值。例如:let name: 张三;let price:number 12.4; let isSuccess …

昂科烧录器支持BPS晶丰明源半导体的多相Buck控制器BPD93004E

芯片烧录行业领导者-昂科技术近日发布最新的烧录软件更新及新增支持的芯片型号列表,其中BPS晶丰明源半导体的多相Buck控制器BPD93004E已经被昂科的通用烧录平台AP8000所支持。 BPD93004E是一款多相Buck控制器,支持原生1~4相,数字方式控制&am…

科普文:一文搞懂jvm原理(二)类加载器

概叙 科普文:一文搞懂jvm(一)jvm概叙-CSDN博客 前面我们介绍了jvm,jvm主要包括两个子系统和两个组件: Class loader(类装载器) 子系统,Execution engine(执行引擎) 子系统;Runtime data area (运行时数据区域)组件&am…

学习笔记(linux高级编程)9

void pthread_cleanup_push(void (*routine)(void *), void *arg); 功能:注册一个线程清理函数 参数,routine,线程清理函数的入口 arg,清理函数的参数。 返回值,无 void pthread_cleanup_pop(int execute)…

Perl语言入门指南

一、绪论 1.1 Perl语言概述 1.2 Perl的特色 1.3 Perl面临的问题 1.4 Perl语言的应用领域 二、Perl语言基础 2.1 Perl语言的历史发展 2.2 Perl语言的基本语法 2.3 Perl语言的数据类型 三、Perl语言控制结构 3.1 条件语句 3.2 循环结构 3.3 函数和子程序 四、Perl语…

OpenStack开源虚拟化平台(一)

目录 一、OpenStack背景介绍(一)OpenStack是什么(二)OpenStack的主要服务 二、计算服务Nova(一)Nova组件介绍(二)Libvirt简介(三)Nova中的RabbitMQ解析 OpenS…

MySQL-数据操作类型的角度理解 S锁 X锁

文章目录 1、S锁和S锁互相兼容2、S锁和X锁互斥3、X锁和X锁也互斥4、X锁和S锁也互斥5、select * from account for update;6、select * from account for update nowait;7、select * from account for update skip locked; 1、S锁和S锁互相兼容 2、S锁和X锁互斥 3、X锁和X锁也互…

20240702 每日AI必读资讯

🔍GPTPdf:使用类似GPT-4o的多模态LLM分析PDF文件 - 使用类似 GPT-4o 多模态模型解析 PDF 文件,转换为 Markdown 格式。 - 代码简洁高效,仅293行。 - 解析结果几乎完美包括排版、数学公式、表格、图片、图表等内容。 &#x1…

【记录】IDEA2023的激活与安装

前言: 记录IDEA2023的激活与安装 第一步:官网下载安装包: 下载地址:https://www.jetbrains.com/idea/download/other.html 这个最好选择2023版本,用着很nice。 安装步骤就不详解了,无脑下一步就可以了…

VLAN原理与配置

AUTHOR :闫小雨 DATE:2024-04-28 目录 VLAN的三种端口类型 VLAN原理 什么是VLAN 为什么使用VLAN VLAN的基本原理 VLAN标签 VLAN标签各字段含义如下: VLAN的划分方式 VLAN的划分包括如下5种方法: VLAN的接口链路类型 创建V…

便签 Pro(Mac 智能便签工具)专业版怎么样,值得购买吗?

使用 Mac 的小伙伴平时都是怎么记录工作生活中的碎片信息?用聊天软件,还是系统备忘录呢? 实际体验下来,其实都难以称得上好用。 赶紧来了解一下 Mac 多彩思维速记工具便签 Pro!拥有智能边框大小、iCloud 同步、历史记…

矩阵置零解题

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2: 输入&…

VUE3解决跨域问题

本文基于vue3 vite element-plus pnpm 报错:**** has been blocked by CORS policy: No Access-Control-Allow-Origin header is present on the requested resource. 原因:前端不能直接访问其他IP,需要用vite.config.ts &#xff0…

API-本地存储

学习目标: 掌握本地存储 学习内容: 本地存储介绍本地存储分类存储复杂数据类型 本地存储介绍: 以前我们页面写的数据一刷新页面就没有了,是不是? 随着互联网的快速发展,基于网页的应用越来越普遍,同时也…

算法基础入门 - 2.栈、队列、链表

文章目录 算法基础入门第二章 栈、队列、链表2.1 队列2.2 栈2.3 纸牌游戏2.4 链表如何建立链表?1.我们需要一个头指针(head)指向链表的初始。链表还没建立时头指针head为空2.建立第一个结点3.设置刚创建的这个结点的数据域(左半)和指针域(右半)4.设置头指针,头指针可方便…

问题-小技巧-专业版Win11怎么启动电脑的休眠模式?

专业版Win11怎么启动电脑的休眠模式? powercfg -a powercfg -hibernate on 启用管理员面板依次输入上述命令就可以了。

宠物医院管理系统-计算机毕业设计源码07221

目 录 1 绪论 1.1 选题背景和意义 1.2国内外研究现状 1.3论文结构与章节安排 2 宠物医院管理系统系统分析 2.1 可行性分析 2.1.1技术可行性分析 2.1.2 操作可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非功能性分析 2.3 系统用例分…