5.OCR文本识别CRNN算法

news2024/12/29 13:33:45

文章目录

    • 1.基础介绍
    • 2.CRNN模型结构
      • 2.1 特征提取
      • 2.2 双向循环神经网络层
      • 2.3 转录层(Transcription Layers)
    • 参考资料


欢迎访问个人网络日志🌹🌹知行空间🌹🌹



title: 2.OCR文本识别Convolution Recurrent Neural Network
toc: true
category: OCR
date: 2023-02-20 12:39:20
tags:

  • OCR
    categories:
  • OCR

1.基础介绍

论文:An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition

Code: https://github.com/bgshih/crnn

这篇论文是201507月份华中科技大学的Baoguang Shi/Xiang Bai等提交的。

文本识别是OCR任务中关键的一步,经过文本检测后可以获取文本区域的图像,文本识别可以将文本的图像patch转成字符序列。

这篇文章中提出的模型架构,将图像的特征提取/序列学习模型/文本转录做了整和,实现了模型的端到端训练。通过模型的整和,模型能够处理任意长度的序列,且对于有字典和无字典(lexicon)的任务都取得了比较好的效果。

论文中提出的四种方法的优势:

  • 可端到端训练
  • 可处理任意长度的文本序列
  • 不需要限定字典
  • 生成的模型更小

提出模型的组成主要包括:

Input
CNN
BiLSTM
CTC

2.CRNN模型结构

在这里插入图片描述

从上图中可以看到模型主要包括三部分,卷积层提取特征,双向循环神经网络学习标签序列中的上下文信息,转录层将输出的冗余字符串通过 B \mathcal{B} B

2.1 特征提取

特征提取使用的是标准的卷积层+最大值池化的方法。图像在输入到CNN之前需要先将其高度resize到一个固定的数值,然后CNN的输出是高度为1的不定长特征序列向量,从左到右是相同维度的序列,作为BiLSTM的输入。特征序列向量的每一列对应原图像中的一个矩形区域:

在这里插入图片描述

例如输入为(32,100,3)的图像,经过CNN特征提取后输出的序列特征的shape ( 1 , 25 , 512 ) (1,25,512) (1,25,512)

2.2 双向循环神经网络层

在这里插入图片描述

循环神经网络(Recurrent Neural Network,RNN)从其定义,中间使用了隐含层的信息传递,使得其具有了序列预测的能力。

在这里插入图片描述

但是当序列的长度比较长的时候,一个位置的预测依赖更远的先前语义信息时,RNN的表现就有些弱了,例如,使用RNN的语言模型在处理I grew up in France… I speak fluent French.,从French比较近的上下文可以知道speak fluent后面应该时语言,但借助更久远的信息in France能进一步推断应该是French

在这里插入图片描述

长短期记忆网络(Long Short Term Memory,LSTM)的提出正是
RNN的改进,为了解决RNN不能处理的长期依赖问题,LSTM中上部的C_t那条线使得信息能够从较远的过去传递到当前的位置, σ \sigma σ函数的使用又让 L S T M LSTM LSTM能够选择性的记忆或遗忘传递过来的信息,因此LSTM能更好的处理远期依赖的问题。

从前面图中可以看到LSTM和传统的RNN模型只能从左侧向右侧传递依赖信息,但实际上在处理序列数据时可以同时利用序列当前位置左侧和右侧的信息来共同处理,Bilateral Direction LSTM使用两条路径,实现了利用左右侧上下文信息来做推理。

在这里插入图片描述

Pytorch.nn模块中实现的LSTM层,通过参数可以直接控制LSTM的层数和是否是双向LSTM

class RNNBase(torch.nn.Module)
    def __init__(self, mode: str, input_size: int, hidden_size: int,
                 num_layers: int = 1, bias: bool = True, batch_first: bool = False,
                 dropout: float = 0., bidirectional: bool)
     ...

class LSTM(RNNBase):
     ...

2.3 转录层(Transcription Layers)

BiLSTM的输出Shape为(N,T,C),NBatch Size,T是序列长度,C是序列每个位置可能的取值类别数(字典中字符的个数),对输出在维度2上做softmax得到的就是序列每个位置字符取值的概率。

在这里插入图片描述

在模型训练时,因为CNN提取的特征长度是不固定的,和图像对应的字符串之间也没有对应关系,因此直接从这种未切分的数据中直接学习字符串序列需要使用特殊的方法,文章作者使用的是2006年一篇文章中提出的Connectionist Temporal Classification(CTC)算法,这一部分是CRNN模型能之间从字符串图像中直接学习的关键,具体可以参考另一篇文章的详细介绍

参考资料

  • 1.https://zhuanlan.zhihu.com/p/43534801

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

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

相关文章

记一次冲突的产生与解决

冲突的概念 git在使用中,如果遵循了它的使用的步骤,比如,在上班之前先去拉取,下班的时候,先提交,如果遵循这个步骤,一般在用的时候没有错误会产生的,但是,因为在开发的时…

Unity 之 实现读取代码写进Word文档功能实现 -- 软著脚本生成工具

Unity 之 实现读取代码写进Word文档功能前言一,实现步骤1.1 逻辑梳理1.2 用到工具二,实现读写文件2.1 读取目录相关2.2 读写文件三,编辑器拓展3.1 编辑器拓展介绍3.2 实现界面可视化四,源码分享4.1 工具目录4.2 完整代码前言 之所…

【SPSS】两独立样本T检验分析详细操作教程(附案例实战)

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

消除“马路黑洞”,计讯物联智能井盖综合管理系统平台有绝招

窨井盖作为市政公用设施的重要组成部分,一旦出现松动、损坏等问题时,不仅会影响市容市貌,还会给道路上的车辆、行人带来安全隐患,对社会安定与安全造成极大负面影响。 痛点分析 01 由于地下管线错综复杂、窨井盖分布广泛,加之信…

Linux 进程:父子进程

目录一、了解子进程二、创建子进程1.创建子进程2.区分父子进程三、理解子进程四、创建子进程的意义进程就是运行中的应用程序,如果一个程序较为庞大,我们可以给这个程序创建多个进程,每个进程负责一部分代码的运行。 A进程如果创建了B进程&am…

【华为OD机试模拟题】用 C++ 实现 - GPU 调度(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明GPU 调度题目输入输出示例一输入输出说明示例二输入输出说明Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。

动态规划:完全背包基础、518.零钱兑换II、377.组合总和IV

leetcode 518.零钱兑换IIleetcode 377.组合总和IV完全背包基础有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品都有无限个(也就是可以放入背包多次),求解将哪些物品装入背包里…

CleanMyMac4.20最新版新增功能及电脑清理垃圾使用教程

CleanMyMac4.20作为知名的Mac清理工具,仅需一键即可快速而安全地清理系统垃圾,释放磁盘空间,因此一直深受Mac用户的喜爱。在不断更新的版本中,CleanMyMac已经不仅仅满足于只做简单的Mac清理工具,而是为Mac用户提供更多…

借助Intune无感知开启Bitlocker

希望使用 Intune 部署 BitLocker,但不知道从哪里开始?这是人们最开始使用 Intune 时最常见的问题之一。在本博客中,你将了解有关使用 Intune 管理 BitLocker 的所有信息,包括建议的设置、BitLocker CSP 在客户端上的工作方式&…

彻底搞懂React-hook链表构建原理

写在前面的小结 每一个 hook 函数都有对应的 hook 对象保存状态信息useContext是唯一一个不需要添加到 hook 链表的 hook 函数只有 useEffect、useLayoutEffect 以及 useImperativeHandle 这三个 hook 具有副作用,在 render 阶段需要给函数组件 fiber 添加对应的副…

Spring Boot系列04--静态资源处理

目录1. 静态资源映射规则2. 欢迎页1. 静态资源映射规则 在项目中双击shift或ctrlN搜索WebMvcAutoConfiguration.class文件,文件中的addResourceHandlers方法如下: public void addResourceHandlers(ResourceHandlerRegistry registry) {if (!this.reso…

运维排查篇 | Redis占用内存过高怎么办

我们知道,Redis是一个key-value数据库,它的数据是运行在内存中的其读写效率比将数据存储到磁盘上的数据库要快很多虽然性能强大,但是如果我们不了解Redis的内存回收策略,就有可能导致Redis消耗内存过高甚至导致内存溢出&#xff0…

[优化]上下游交互策略

书接上文:https://blog.csdn.net/weixin_43303530/article/details/127227147?spm1001.2014.3001.5502,为满足产品提的在24小时内能重试尽量去重试,不计较重试的次数的要求,在第三方电子卡系统无法提升接口并发数量的情况下&…

电脑C盘空间不足?这样做就行了!

一般来说,电脑C盘都是系统盘,它的稳定关系到系统能否正常运行,但是很多朋友的C盘却总是红色的,这也就意味着C盘储存空间不足了,那么我们就需要进行以下操作,来让C盘重新拥有储存空间。方案一:运…

BLE Mesh蓝牙协议学习记录

BLE Mesh蓝牙协议学习 文章目录BLE Mesh蓝牙协议学习前言概述一、蓝牙技术整体框架二、经典蓝牙和低功耗蓝牙mesh协议架构图承载层(Bearer Layer)网络层(Network Layer)底层传输层(Lower Transport Layer)上…

JAVA连接数据库——JDBC的简单使用

JDBC即Java数据库连接.用来实现Java程序对数据库增删查改。 为了对接Java程序和数据库,java.sql提供了很多api包含在java.sql和javax.sql里面 结构: DriverManager接口: 每一个数据库的驱动程序都必须去到DriverManager注册,生成一个Connection Conn…

电商平台的促销活动如何抵御大流量的ddos攻击

每一次活动大促带来的迅猛流量,对技术人而言都是一次严峻考验。如果在活动期间遭受黑产恶意 DDoS 攻击,无疑是雪上加霜。电商的特性是业务常态下通常不会遭受大流量 DDoS 攻击,且对延迟敏感,因此只需要在活动期间按需使用 DDoS 防…

【第五章 AOP概述,底层原理,AOP术语,切入点表达式,AOP操作(基于注解方式,基于xml配置文件)】

第五章 AOP概述,底层原理,AOP术语,切入点表达式,AOP操作(基于注解方式,基于xml配置文件) 1.AOP概述: (1)什么是AOP: ①面向切面编程(…

11-KMP算法

KMP算法是一个字符串匹配算法,总的意义是在给定的字符串A中利用优化的方法快速地找出字符串B的位置,相比于传统匹配算法,它能有效减少匹配时间,提高效率。 前缀和后缀 在我们看KMP算法前我们先考虑一个问题:假如我们…

基于框架的平台总线式开发

一、总线、设备、驱动 硬编码式的驱动开发带来的问题: 1. 垃圾代码太多 2. 结构不清晰 3. 一些统一设备功能难以支持 4. 开发效率低下 1.1 初期解决思路:设备和驱动分离 struct device来表示一个具体设备,主要提供具体设备相关的资源&am…