文本识别论文CRNN

article/2025/8/23 23:49:36

目录

  • 1. 解读文本识别论文CRNN
    • 1.1 CRNN文字识别整体流程
    • 1.2 理解CTC Loss
      • 1.2.1 CTC loss是如何做的
      • 1.2.2 以一个具体的例子来展现CTC loss的过程
  • 2. 总结
  • 3. 参考资料

1. 解读文本识别论文CRNN

  本文解读的是一篇来自2015年的一篇文字识别论文 [ 1 ] ^{[1]} [1]。里面的CTC Loss相关内容的理解有一定的挑战性,本文是对自己当前理解的一份记录。

1.1 CRNN文字识别整体流程

  首先,先看一下CRNN的前向推理过程,来了解其文字识别的整体流程,如下图所示。
在这里插入图片描述
   action1 : 一张 10 ∗ 40 ∗ 3 10*40*3 10403的文字图片块,经过CNN层特征提取,下采样为 1 ∗ 10 ∗ 512 1*10*512 110512的特征图。高度压缩为1,宽度下采样4倍,每一个特征是维度为512。
  action2 : 通过深度双向LSTM网络将 10 ∗ 512 10*512 10512的Feature sequence做了一个特征的进一步转换和提取变为一个 10 ∗ ( 26 + 1 ) 10*(26+1) 10(26+1)的预测分布概率矩阵。这里使用双向LSTM是期待特征序列做更加充分的贯通,例如在预测“state”
中“a”的时候既采纳了“st”的信息又采纳了"te"的信息。
  action3 : 通过转录层操作,根据分布概率矩阵可以获得最终的预测结果。例如 a r g m a x ( y , d i m = 1 ) argmax(y, dim=1) argmax(y,dim=1),可以得到预测值的初始形态:

-s-t-aatte

  然后合并成为最终的预测结果: state。合并的基本规则是:

  1. 属于占位符所割出来的同一个block中,如果有紧邻的相同元素进行合并。
  2. 消除占位符。

  前向推理过程比较明晰,然而,训练过程会遇到如下疑惑,如果按照上述例子,我们会把这一个序列作为预测概率矩阵 y y y的GT。然后就相当于并行做10个(26+1)类的分类任务学习。

-s-t-aatte

  这样的问题在于:
  抛出问题1 : 对于同一张图片可以有不同的GT方案。
  例如,下列序列作为“state”对应的的分布概率矩阵GT,也是不违背任何逻辑的。事实上,这种不违背逻辑的方案还有很多。

--st-aatte

   尝试解决问题1 :尝试列举出所有可能的方案, 在训练的过程中随机给出一个gt。
  这样做理论上是可行的。但是会有一个时间复杂度问题。采用暴力求解的方法罗列出所有可能是 ( 26 + 1 ) 10 (26+1)^{10} 26+110。即使模型的最大预测字符串长度为10,仅为26个字母这种简易场景,这种级别的时间复杂度是不可以接受的。
  但不管怎样,至此,上述整个过程是一种理论上完备的训练、推理流程,只不过训练速度会很慢(或者说慢到不可接受)。

1.2 理解CTC Loss

1.2.1 CTC loss是如何做的

   CTC Loss 或者说CTC 算法是来源于HMM(隐马尔可夫),用一句话总结:就是通过“动态规划”算法来替代“暴力求解”来解决所有方案的概率和。并将问题的loss定义为一个最大似然问题:使得学到尽可能的网络参数使得 p ( l x ) p(\frac{l}{x}) p(xl)最大,论文中将loss定义为 − l o g ( p ( l x ) ) -log(p(\frac{l}{x})) log(p(xl))。CTC的过程可以总结为以下四步骤:

  1. p ( l x ) = ∑ s = 1 s = 2 ∣ l ∣ + 1 α t ( s ) ∗ β t ( s ) y t ( s ) p(\frac{l}{x}) = \sum_{s=1}^{s=2|l|+1} \frac{\alpha_t(s)*\beta_t(s)}{y_{t}(s)} p(xl)=s=1s=2∣l+1yt(s)αt(s)βt(s)
  2. y y y概率矩阵—>计算 α 矩阵 \alpha矩阵 α矩阵, β \beta β矩阵—> 计算 p ( l x ) 计算p(\frac{l}{x}) 计算p(xl)
  3. α \alpha α矩阵的计算是通过动态规划算法由 y y y来计算的。
    在这里插入图片描述
  4. β \beta β矩阵的计算是通过动态规划由 y y y来计算的。
    在这里插入图片描述

1.2.2 以一个具体的例子来展现CTC loss的过程

  以下例子来自于torch官网。为了便于描述,将参数的规模进行了缩小。

>>> import torch
>>> import torch.nn as nn
>>> # Target are to be padded
>>> T = 5  # torch 官网为50      # Input sequence length
>>> C = 7  # torch 官网为20      # Number of classes (including blank, 0 class)
>>> N = 1  # torch 官网为16      # Batch size
>>> S = 3 #  30      # Target sequence length of longest target in batch (padding length)
>>> S_min = 2  # 10  # Minimum target length, for demonstration purposes
>>>
>>> # Initialize random batch of input vectors, for *size = (T,N,C)
>>> input = torch.randn(T, N, C).log_softmax(2).detach().requires_grad_()
>>>
>>> # Initialize random batch of targets (0 = blank, 1:C = classes)
>>> target = torch.randint(low=1, high=C, size=(N, S), dtype=torch.long)
>>>
>>> input_lengths = torch.full(size=(N,), fill_value=T, dtype=torch.long)
>>> target_lengths = torch.randint(low=S_min, high=S, size=(N,), dtype=torch.long)
>>> ctc_loss = nn.CTCLoss()
>>> loss = ctc_loss(input, target, input_lengths, target_lengths)
>>> loss.backward()

   其中,input表示的是预测概率的 l o g log log矩阵:
在这里插入图片描述
  预测概率矩阵 y = e i n p u t y=e^{input} y=einput,如下所示:
在这里插入图片描述
  举一个简单的例子target为 f e fe fe: 根据1.2.1节中步骤3可以根据 y y y矩阵动态递归算得 α s ( t ) α_s(t) αs(t)矩阵:
在这里插入图片描述
  根据1.2.2节,步骤4可以根据 y y y矩阵动态递归算得 β s ( t ) β_s(t) βs(t)矩阵:
在这里插入图片描述
  根据1.2.1节中步骤1可以根据α矩阵和β矩阵计算得到两者的联合概率:
在这里插入图片描述
   l o s s = − l o g ( 0.001247115 / 3 ) = 3.38 loss = -log(0.001247115/3)=3.38 loss=log(0.001247115/3)=3.38, 与pytorch的输出一致。
在这里插入图片描述

2. 总结

  本文主要以CTC是如何做的角度来写,并通过pytorch和自己手算结果的对比来验证自己理解的正确性。后续如果有新的理解,应该会补充上一些更多的细节。

3. 参考资料

[1] 原始论文:An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition
[2]Pytorch ctc demo example
[3]公式


http://chatgpt.dhexx.cn/article/EqXnflcq.shtml

相关文章

opencv pytorch CRNN验证码识别

文章目录 前言:效果预览:搭建CRNN模型:验证码数据集制作:模型训练:项目结构与源码下载: 前言: 本文使用crnn网络识别验证码,使用的验证码数据集有三种,准确率都很高。 …

CRNN笔记

参考链接: 一文读懂CRNNCTC文字识别 - 知乎 CTC loss - 知乎 1、背景 文字识别主流的两种算法 1.1 基于CRNNCTC 1.2 基于CNNSeq2SeqAttention 2、CRNNCTC原理解析 CRNNCTC结构图 以下是根据paddleocr中以mobilenetv3为backbone的网络结构图 model …

ocr小白入门CRNN

什么是CRNN CRNN的整体框架图: CRNNCNNRNNCTC 1)CNN主要是为RNN提取特征; 2)RNN主要是将CNN输出的特征序列转换为输出; 3)CTC为翻译层,得到最终的预测结果,由于CTC适合不知道输入…

CRNN代码笔记

CRNN代码笔记 主要由五个模块组成: 数据集的加载与切分CRNN代码复现训练过程预测过程训练过程中对的评估 文章目录 CRNN代码笔记数据集的加载与切分RCNN模型构建训练部分训练辅助函数注意超参数设置判断cuda是否可用,是则基于GPU训练,否则用…

基于CRNN的文本识别

文章目录 0. 前言1. 数据集准备2.构建网络3.数据读取4.训练模型 0. 前言 至于CRNN网络的细节这里就不再多言了,网上有很多关于crnn的介绍,这里直接讲一下代码的实现流程 1. 数据集准备 CRNN是识别文本的网络,所以我们首先需要构建数据集&a…

CRNN论文翻译——中文版

文章作者:Tyan 博客:noahsnail.com | CSDN | 简书 翻译论文汇总:https://github.com/SnailTyan/deep-learning-papers-translation An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Applicatio…

CRNN论文笔记

0. 前言 在这篇论文《An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition》所讲述的内容便是大名鼎鼎的CRNN网络,中实现了端到端的文本识别。 论文地址 Github地址 该网络具有如下的特点: 1)该模…

CRNN详解

一.概述 常用文字识别算法主要有两个框架: CNNRNNCTC(CRNNCTC)CNNSeq2SeqAttention 本文介绍第一种方法。 CRNN是一种卷积循环神经网络结构,用于解决基于图像的序列识别问题,特别是场景文字识别问题。 文章认为文字识别是对序列的预测方法…

CRNN模型

介绍: 是目前较为流行的图文识别模型,可识别较长的文本序列, 它利用BLSTM和CTC部件学习字符图像中的上下文关系, 从而有效提升文本识别准确率,使得模型更加鲁棒。 CRNN是一种卷积循环神经网络结构,用于解决…

CRNN

CRNN详解:https://blog.csdn.net/bestrivern/article/details/91050960 https://www.cnblogs.com/skyfsm/p/10335717.html 1 概述 传统的OCR识别过程分为两步:单字切割和分类任务。现在更流行的是基于深度学习的端到端的文字识别,即我们不需…

论文阅读 - CRNN

文章目录 1 概述2 模型介绍2.1 输入2.2 Feature extraction2.3 Sequence modeling2.4 Transcription2.4.1 训练部分2.4.2 预测部分 3 模型效果参考资料 1 概述 CRNN(Convolutional Recurrent Neural Network)是2015年华科的白翔老师团队提出的,直至今日&#xff0c…

文本识别网络CRNN

文本识别网络CRNN 简介网络结构CNN层LSTM层CTC Loss 代码实现 简介 CRNN,全称Convolutional Recurrent Neural Network,卷积循环神经网络。 它是一种基于图像的序列识别网络,可以对不定长的文字序列进行端到端的识别。 它集成了卷积神经网络…

CRNN——文本识别算法

常用文字识别算法主要有两个框架: CNNRNNCTC(CRNNCTC)CNNSeq2SeqAttention 文章认为文字识别是对序列的预测方法,所以采用了对序列预测的RNN网络。通过CNN将图片的特征提取出来后采用RNN对序列进行预测,最后通过一个CTC的翻译层得到最终结果…

OCR论文笔记系列(一): CRNN文字识别

👨‍💻作者简介:大数据专业硕士在读,CSDN人工智能领域博客专家,阿里云专家博主,专注大数据与人工智能知识分享,公众号:GoAI的学习小屋,免费分享书籍、简历、导图等资料,更有交流群分享AI和大数据,加群方式公众号回复“加群”或➡️点击链接。 🎉专栏推荐:➡️点…

CRNN——卷积循环神经网络结构

CRNN——卷积循环神经网络结构 简介构成CNNMap-to-Sequence 图解RNNctcloss序列合并机制推理过程编解码过程 代码实现 简介 CRNN 全称为 Convolutional Recurrent Neural Network,是一种卷积循环神经网络结构,主要用于端到端地对不定长的文本序列进行识…

java bean的生命周期

文章转载来自博客园:https://www.cnblogs.com/kenshinobiy/p/4652008.html Spring 中bean 的生命周期短暂吗? 在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一个实例&#xf…

Spring创建Bean的生命周期

1.Bean 的创建生命周期 UserService.class —> 无参构造方法(推断构造方法) —> 普通对象 —> 依赖注入(为带有Autowired的属性赋值) —> 初始化前(执行带有PostConstruct的方法) —> 初始…

Bean的生命周期(不要背了记思想)

文章内容引用自 咕泡科技 咕泡出品,必属精品 文章目录 1. 应付面试2 可以跟着看源码的图3 学习Bean 的生命周期之前你应该知道什么4 Bean 的完整生命周期 1. 应付面试 你若是真的为面试而来,请把下面这段背下来,应付面试足矣 spring的bean的…

简述 Spring Bean的生命周期

“请你描述下 Spring Bean 的生命周期?”,这是面试官考察 Spring 的常用问题,可见是 Spring 中很重要的知识点。 其实要记忆该过程,还是需要我们先去理解,本文将从以下两方面去帮助理解 Bean 的生命周期: 生…

【Spring源码】讲讲Bean的生命周期

1、前言 面试官:“看过Spring源码吧,简单说说Spring中Bean的生命周期” 大神仙:“基本生命周期会经历实例化 -> 属性赋值 -> 初始化 -> 销毁”。 面试官:“......” 2、Bean的生命周期 如果是普通Bean的生命周期&am…