Python 全栈体系【四阶】(五十四)

news2024/12/28 20:58:39

第五章 深度学习

十二、光学字符识别(OCR)

3. 文字识别技术

3.1 CRNN+CTC(2015)

CRNN(Convolutional Recurrent Neural Network)即卷积递归神经网络,是DCNN和RNN的组合,专门用于识别图像中的序列式对象。与CTC loss配合使用,进行文字识别,可以直接从文本词级或行级的标注中学习,不需要详细的字符级的标注。

3.1.1 特点

(1)与大多数现有的组件需要单独训练和协调的算法相比,它是端对端训练的。

(2)它自然地处理任意长度的序列,不涉及字符分割或水平尺度归一化。

(3)它不仅限于任何预定义的词汇,并且在无词典和基于词典的场景文本识别任务中都取得了显著的表现。

(4)它产生了一个有效而小得多的模型,这对于现实世界的应用场景更为实用。

3.1.2 网络结构
  • 卷积层:从输入图像中提取特征序列;
  • 循环层:预测每一帧的标签分布;
  • 转录层:将每一帧的预测变为最终的标签序列。

在这里插入图片描述

图1。网络架构。架构包括三部分:1) 卷积层,从输入图像中提取特征序列;2) 循环层,预测每一帧的标签分布;3) 转录层,将每一帧的预测变为最终的标签序列。
3.1.3 特征提取

在CRNN模型中,通过采用标准CNN模型(去除全连接层)中的卷积层和最大池化层来构造卷积层的组件。这样的组件用于从输入图像中提取序列特征表示。在进入网络之前,所有的图像需要缩放到相同的高度。然后从卷积层组件产生的特征图中提取特征向量序列,这些特征向量序列作为循环层的输入。具体地,特征序列的每一个特征向量在特征图上按列从左到右生成。这意味着第i个特征向量是所有特征图第i列的连接。在我们的设置中每列的宽度固定为单个像素。由于卷积层,最大池化层和元素激活函数在局部区域上执行,因此它们是平移不变的。因此,特征图的每列对应于原始图像的一个矩形区域(称为感受野),并且这些矩形区域与特征图上从左到右的相应列具有相同的顺序。如图2所示,特征序列中的每个向量关联一个感受野,并且可以被认为是该区域的图像描述符。

在这里插入图片描述

图2。感受野。提取的特征序列中的每一个向量关联输入图像的一个感受野,可认为是该区域的特征向量。
3.1.4 序列标注

一个深度双向循环神经网络是建立在卷积层的顶部,作为循环层。循环层预测特征序列 x = x 1 , … , x T x = x_1,…,x_T x=x1,,xT中每一帧 x t x_t xt的标签分布 y t y_t yt。循环层的优点是三重的。首先,RNN具有很强的捕获序列内上下文信息的能力。对于基于图像的序列识别使用上下文提示比独立处理每个符号更稳定且更有帮助。以场景文本识别为例,宽字符可能需要一些连续的帧来完全描述(参见图2)。此外,一些模糊的字符在观察其上下文时更容易区分,例如,通过对比字符高度更容易识别“il”而不是分别识别它们中的每一个。其次,RNN可以将误差差值反向传播到其输入,即卷积层,从而允许我们在统一的网络中共同训练循环层和卷积层。第三,RNN能够从头到尾对任意长度的序列进行操作。

传统的RNN单元在其输入和输出层之间具有自连接的隐藏层。每次接收到序列中的帧 x t x_t xt时,它将使用非线性函数来更新其内部状态 h t h_t ht,该非线性函数同时接收当前输入 x t x_t xt和过去状态 h t − 1 h_{t−1} ht1作为其输入: h t = g ( x t , h t − 1 ) h_t = g(x_t, h_{t−1}) ht=g(xt,ht1)。那么预测 y t y_t yt是基于 h t h_t ht的。以这种方式,过去的上下文 { x t ′ } t ′ < t \lbrace x_{t\prime} \rbrace _{t \prime < t} {xt}t<t被捕获并用于预测。然而,传统的RNN单元有梯度消失的问题,这限制了其可以存储的上下文范围,并给训练过程增加了负担。长短时记忆(LSTM)是一种专门设计用于解决这个问题的RNN单元。LSTM(图3所示)由一个存储单元和三个多重门组成,即输入,输出和遗忘门。在概念上,存储单元存储过去的上下文,并且输入和输出门允许单元长时间地存储上下文。同时,单元中的存储可以被遗忘门清除。LSTM的特殊设计允许它捕获长距离依赖,这经常发生在基于图像的序列中。

在这里插入图片描述

图3。(a) 基本的LSTM单元的结构。LSTM包括单元模块和三个门,即输入门,输出门和遗忘门。(b)我们论文中使用的深度双向LSTM结构。合并前向(从左到右)和后向(从右到左)LSTM的结果到双向LSTM中。在深度双向LSTM中堆叠多个双向LSTM结果。

LSTM是定向的,它只使用过去的上下文。然而,在基于图像的序列中,两个方向的上下文是相互有用且互补的。因此,将两个LSTM,一个向前和一个向后组合到一个双向LSTM中。此外,可以堆叠多个双向LSTM,得到如图3.b所示的深双向LSTM。深层结构允许比浅层抽象更高层次的抽象,并且在语音识别任务中取得了显著的性能改进。

3.1.5 转录

转录是将RNN所做的每帧预测转换成标签序列的过程。数学上,转录是根据每帧预测找到具有最高概率的标签序列。在实践中,存在两种转录模式,即无词典转录和基于词典的转录。词典是一组标签序列,预测受拼写检查字典约束。在无词典模式中,预测时没有任何词典。在基于词典的模式中,通过选择具有最高概率的标签序列进行预测。

3.1.5.1 标签序列的概率

采用”联接时间分类“(CTC)层中定义的条件概率。按照每帧预测 y = y 1 , … , y T y=y_1,…,y_T y=y1,,yT对标签序列 l l l定义概率,并忽略 l l l中每个标签所在的位置。因此,当我们使用这种概率的负对数似然作为训练网络的目标函数时,我们只需要图像及其相应的标签序列,避免了标注单个字符位置的劳动。

条件概率的公式简要描述如下:输入是序列 y = y 1 , … , y T y = y_1,…,y_T y=y1,,yT,其中 T T T是序列长度。这里,每个 y t ∈ ℜ ∣ L ’ ∣ y_t \in\Re^{|{\cal L}’|} ytL’∣是在集合 L ’ = L ∪ {\cal L}’ = {\cal L} \cup L=L上的概率分布,其中 L {\cal L} L包含了任务中的所有标签(例如,所有英文字符),以及由-表示的“空白”标签。序列到序列的映射函数 B {\cal B} B定义在序列 π ∈ L ’ T \boldsymbol{\pi}\in{\cal L}’^{T} πLT上,其中 T T T是长度。 B {\cal B} B π \boldsymbol{\pi} π映射到 l \mathbf{l} l上,首先删除重复的标签,然后删除blank。例如, B {\cal B} B将“–hh-e-l-ll-oo–”(-表示blank)映射到“hello”。然后,条件概率被定义为由 B {\cal B} B映射到 l \mathbf{l} l上的所有 π \boldsymbol{\pi} π的概率之和:

p ( l ∣ y ) = ∑ π : B ( π ) = l p ( π ∣ y ) , \begin{equation} p(\mathbf{l}|\mathbf{y})=\sum_{\boldsymbol{\pi}:{\cal B}(\boldsymbol{\pi})=\mathbf{l}}p(\boldsymbol{\pi}|\mathbf{y}),\tag{1} \end{equation} p(ly)=π:B(π)=lp(πy),(1)

π \boldsymbol{\pi} π的概率定义为 p ( π ∣ y ) = ∏ t = 1 T y π t t p(\boldsymbol{\pi}|\mathbf{y})=\prod_{t=1}^{T}y_{\pi_{t}}^{t} p(πy)=t=1Tyπtt y π t t y_{\pi_{t}}^{t} yπtt是时刻 t t t时有标签 π t \pi_{t} πt的概率。由于存在指数级数量的求和项,直接计算方程1在计算上是不可行的。然而,使用CTC中描述的前向算法可以有效计算方程。

3.1.5.2 无字典转录

在这种模式下,将具有方程1中定义的最高概率的序列 l ∗ \mathbf{l}^{*} l作为预测。由于不存在用于精确找到解的可行方法,我们采用CTC中的策略。序列 l ∗ \mathbf{l}^{*} l通过 l ∗ ≈ B ( arg ⁡ max ⁡ π p ( π ∣ y ) ) \mathbf{l}^{*}\approx{\cal B}(\arg\max_{\boldsymbol{\pi}}p(\boldsymbol{\pi}|\mathbf{y})) lB(argmaxπp(πy))近似发现,即在每个时间戳 t t t采用最大概率的标签 π t \pi_{t} πt,并将结果序列映射到 l ∗ \mathbf{l}^{*} l

3.1.5.3 基于词典的转录

在基于字典的模式中,每个测试采样与词典 D {\cal D} D相关联。基本上,通过选择词典中具有方程1中定义的最高条件概率的序列来识别标签序列,即 l ∗ = arg ⁡ max ⁡ l ∈ D p ( l ∣ y ) \mathbf{l}^{*}=\arg\max_{\mathbf{l}\in{\cal D}}p(\mathbf{l}|\mathbf{y}) l=argmaxlDp(ly)。然而,对于大型词典,例如5万个词的Hunspell拼写检查词典,对词典进行详尽的搜索是非常耗时的,即对词典中的所有序列计算方程1,并选择概率最高的一个。为了解决这个问题,我们观察到,通过无词典转录预测的标签序列通常在编辑距离度量下接近于实际结果。这表示我们可以将搜索限制在最近邻候选目标 N δ ( l ’ ) {\cal N}_{\delta}(\mathbf{l}’) Nδ(l),其中 δ \delta δ是最大编辑距离, l ’ \mathbf{l}’ l是在无词典模式下从 y \mathbf{y} y转录的序列:

l ∗ = arg ⁡ max ⁡ l ∈ N δ ( l ’ ) p ( l ∣ y ) . \begin{equation} \mathbf{l}^{*}=\arg\max_{\mathbf{l}\in{\cal N}_{\delta}(\mathbf{l}’)}p(\mathbf{l}|\mathbf{y}).\tag{2} \end{equation} l=arglNδ(l)maxp(ly).(2)

可以使用BK树数据结构有效地找到候选目标 N δ ( l ’ ) {\cal N}_{\delta}(\mathbf{l}’) Nδ(l),这是一种专门适用于离散度量空间的度量树。BK树的搜索时间复杂度为 O ( log ⁡ ∣ D ∣ ) O(\log|{\cal D}|) O(logD),其中 ∣ D ∣ |{\cal D}| D是词典大小。因此,这个方案很容易扩展到非常大的词典。在我们的方法中,一个词典离线构造一个BK树。然后,我们使用树执行快速在线搜索,通过查找具有小于或等于 δ \delta δ编辑距离来查询序列。

3.1.6 网络训练

X = { I i , l i } i {\cal X}= \lbrace I_i,\mathbf{l}_i \rbrace _i X={Ii,li}i表示训练集, I i I_{i} Ii是训练图像, l i \mathbf{l}_{i} li是真实的标签序列。目标是最小化真实条件概率的负对数似然:

O = − ∑ I i , l i ∈ X log ⁡ p ( l i ∣ y i ) , \begin{equation} {\cal O}=-\sum_{I_{i},\mathbf{l}_{i}\in{\cal X}}\log p(\mathbf{l}_{i}|\mathbf{y}_{i}),\tag{3} \end{equation} O=Ii,liXlogp(liyi),(3)

y i \mathbf{y}_{i} yi是循环层和卷积层从 I i I_{i} Ii生成的序列。目标函数直接从图像和它的真实标签序列计算代价值。因此,网络可以在成对的图像和序列上进行端对端训练,去除了在训练图像中手动标记所有单独组件的过程。

网络使用随机梯度下降(SGD)进行训练。梯度由反向传播算法计算。特别地,在转录层中,误差使用前向算法进行反向传播。在循环层中,应用随时间反向传播(BPTT)来计算误差。

为了优化,使用ADADELTA自动计算每维的学习率。与传统的动量方法相比,ADADELTA不需要手动设置学习率。更重要的是,我们发现使用ADADELTA的优化收敛速度比动量方法快。

在这里插入图片描述

网络详细结构
3.1.7 结论

该模型在4个公共测试数据集上取得了较好的成绩,跟其它基于深度学习模型相比,具有明显提升。如下表所示:

在这里插入图片描述

  • IIIT5k,SVT,IC03,IC13表示4个数据集
  • 50,1k,50k和Full表示使用的字典,None表示识别没有字典

识别图像中的乐谱被称为光学音乐识别(OMR)问题。在乐谱识别方面,CRNN大大优于两个商业系统。Capella Scan和PhotoScore系统在干净的数据集上表现相当不错,但是它们的性能在合成和现实世界数据方面显著下降。主要原因是它们依赖于强大的二值化来检五线谱和音符,但是由于光线不良,噪音破坏和杂乱的背景,二值化步骤经常会在合成数据和现实数据上失败。另一方面,CRNN使用对噪声和扭曲具有鲁棒性的卷积特征。此外,CRNN中的循环层可以利用乐谱中的上下文信息。每个音符不仅自身被识别,而且被附近的音符识别。因此,通过将一些音符与附近的音符进行比较可以识别它们,例如对比他们的垂直位置。

在这里插入图片描述

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

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

相关文章

计算机组成原理易混淆知识点总结(持续更新)

目录 1.机器字长&#xff0c;存储字长与指令字长 2.指令周期,机器周期,时钟周期 3.CPI,IPS,MIPS 4.翻译程序和汇编程序 5.计算机体系结构和计算机组成的区别和联系 6.基准程序执行得越快说明机器的性能越好吗? 1.机器字长&#xff0c;存储字长与指令字长 不同的机器三者…

VMware ESXi 兼容性查询

官网兼容性查询地址&#xff1a;https://www.vmware.com/resources/compatibility/search.php

Android Studio自带Profiler工具进行CPU资源及线程问题分析步骤

1、运行需要检测CPU资源问题与线程问题的程序 这里以“com.example.opengltest”程序为例。 2、点击Profiler按钮 3、点击SESIONS ""号按钮选择设备&#xff0c;选择对应设备下的应用或进程 4、双击CPU区块 5、选择Trace config选项&#xff0c;选择“Java/Kotli…

Reader类的使用方法和技巧,你掌握了吗?

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

raft 协议和etcd实战

文章目录 leader选举日志复制安全性preVote 阶段preVote 投票阶段preVote阶段的作用 集群成员变更etcd raft实践etcd raft写流程时序图问题如何保障消息的幂等性&#xff0c;不能重复提交如何保障消息的原子性&#xff0c;不能提交一半raft wal日志的作用是MVCC方式的作用etcd …

瑞吉外卖项目学习笔记(一)

项目展示&#xff1a; 一、软件开发整体介绍 1.1 软件开发流程 作为软件开发人员&#xff0c;我们的主要工作是在 编码阶段 1.2 角色分工 1.3 软件环境 二、瑞吉外面项目介绍 2.1 项目介绍 系统管理后台页面&#xff1a; 移动端页面&#xff1a; 2.2 产品原型展示 产品原型是…

2024 年科技裁员综合清单

推荐阅读&#xff1a; 独立国家的共同财富 美国千禧一代的收入低于父辈 创造大量就业机会却毁掉了财富 这四件事是创造国家财富的关键 全球财富报告证实联盟自始至终无能 美国人已陷入无休止债务循环中&#xff0c;这正在耗尽他们的财务生命 2024 年&#xff0c;科技行业…

二分例题(D.负重越野,I.路径规划)

这两天的训练赛都有一道二分的题&#xff0c;但是都没往二分上面想&#xff0c;同样不知道怎么二分。 D. Fast and Fat 思路 二分的关键也就是check函数怎么写了&#xff0c;求队伍最大速度&#xff0c;可以分为速度>mid和<mid两部分&#xff0c;再判断&#xff0c;能不…

课时138:变量进阶_变量实践_综合案例

2.1.3 综合案例 学习目标 这一节&#xff0c;我们从 免密认证、脚本实践、小结 三个方面来学习 免密认证 案例需求 A 以主机免密码认证 连接到 远程主机B我们要做主机间免密码认证需要做三个动作1、本机生成密钥对2、对端机器使用公钥文件认证3、验证手工演示 本地主机生成…

dolphinscheduler standalone安装

官方文档&#xff1a;https://dolphinscheduler.apache.org/en-us/docs/3.1.3/guide/installation/standalone 1.安装&#xff08;以放在/home为例&#xff09; 下载见&#xff1a;https://download.csdn.net/download/taotao_guiwang/89311365 tar -xvzf apache-dolphinsche…

《中国改革报》的发行范围有哪些?

《中国改革报》是国家发展和改革委员会主管的全国性综合类报纸&#xff0c;其发行范围广泛&#xff0c;涵盖了全国各地。 该报在全国范围内公开发行&#xff0c;读者群体包括政府部门、研究机构、企业界、学术界以及关注中国改革与发展的社会各界人士。 它通过订阅、零售等多…

力扣hot100学习记录(十)

21. 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 题意 将两个有序列表合并 思路 用两个指针分别指向两个链表最开始&#xff0c;每次把较小的拿出来&#xff0c;相应指针后移&#xff0c;直到一个链表…

Java 多线程(01)

运行一个 Java 程序就是跑一个 Java 进程&#xff0c;该进程至少有一个线程即主线程&#xff0c;而 main 方法就是主线程的入口&#xff1b; 一、常见多线程名词解释 并发&#xff1a;一个 CPU 核心上&#xff0c;通过快速轮转调度的方式&#xff0c;执行多个进程&#xff0c…

linux文件编程api: creat

1.基本信息 功能 创建新文件 头文件 #include<fcntl.h> 函数形式 int creat(const char *pathname, mode_t mode); 返回值 如果成功&#xff0c;则返回文件描述符号 如果失败&#xff0c;则返回-1 参数 pathname: 创建的文件名 mode: 新建文件时&#xff0c;文件权限…

Android LAME原生音频

前言 我想大家都做过录音的功能吧&#xff0c;首先想到的是不是MediaRecorder&#xff1f;今天我们不用MediaRecorder&#xff0c;而是使用LAME库自己编译音频编码模块&#xff0c;很明显&#xff0c;这个需要用到NDK。凡是涉及到音视频编解码这块的&#xff0c;都需要用到And…

BUG: VS Code C++输出中文乱码

BUG: VS Code C输出中文乱码 环境 Windows 11 VS Code 编辑器详情 在Windows 使用 cout 函数输出中文时出现乱码 问题的原因在cmd的显示编码和c程序编码的不同。cmd默认的是gbk编码&#xff0c;而VS Code 软件的CMD终端默认是utf-8编码&#xff0c;因而在输出中文文本时会出…

QQ名片满级会员展示生成HTML源码

源码介绍 QQ名片满级会员展示生成HTML源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;保存素材去选择QQ个性名片-选择大图模板-把图上传照片墙即可 源码效果 源码下载 蓝奏云&#xff1a;http…

唯众云课堂:领航智慧教育,赋能职教未来,打造高效人才培养新平台

随着《中国智慧教育发展报告 2023》的发布&#xff0c;智慧教育被正式定义为数字教育发展的高级阶段。然而&#xff0c;各职院在智慧教育的发展道路上&#xff0c;往往面临着诸多挑战&#xff0c;如缺乏一体化教学平台、优质教学资源不足等。唯众凭借深厚的产业洞察与教育实践经…

Pytorch中的torch.save()文件保存格式探索以及mmdetection加载预训练模型参数对不齐和收到意外参数报错解决方案

使用mmdetection时遇到的问题比较多&#xff0c;首先要对自己要使用的预训练模型有一定的了解&#xff0c;并且懂得使用各种分类模型时不同的模型不同任务执行阶段需要参数上的对其。&#xff08;比如mask-rcnn和它的三个头之间的参数&#xff09;。 首先&#xff0c;谈谈torc…

基于SpringBoot设计模式之结构型设计模式·适配器模式

文章目录 介绍开始使用委托的适配器&#xff08;媒体播放器&#xff09;架构图定义被适配者定义需求接口定义适配者 使用继承的适配器&#xff08;手机充电接口&#xff09;架构图定义被适配者定义需求接口定义适配者 测试样例 总结优点缺点 介绍 在程序世界中&#xff0c;经常…