论文阅读 - CRNN

article/2025/8/23 23:44:46

文章目录

    • 1 概述
    • 2 模型介绍
      • 2.1 输入
      • 2.2 Feature extraction
      • 2.3 Sequence modeling
      • 2.4 Transcription
        • 2.4.1 训练部分
        • 2.4.2 预测部分
    • 3 模型效果
    • 参考资料

1 概述

CRNN(Convolutional Recurrent Neural Network)是2015年华科的白翔老师团队提出的,直至今日,仍旧是文本识别领域最常用也最好用的方法。CRNN主要由三部分组成,分别是feature extraction,sequence modeling和transcription,如下图1-1所示。
CRNN总体结构图

图1-1 CRNN总体结构图

feature extraction用于按宽度抽取图像特征,sequence modeling用于融合这些特征并输出label的预测分布,transcription用于将这个特征序列转化为文本。

CRNN强大的地方就是它只是一个框架,其中的feature extraction和sequence modeling部分都是可以替换成不同的模型的,比如feature extraction部分,可以换成任意的抽取图像特征的模型,想要追求性能就换成小模型,想要追求效果就换成大模型,非常灵活。

2 模型介绍

2.1 输入

输入是一般是文本检测的输出,一个长条形的图片,是横向长条的,因为我们的文字都是横着写的。而且这一长条里只能有一行文字,不能多行。多行就得要切成多个单行的长条分别输入。

文本有一些倾斜问题不大,但最好是在文本检测部分调整,即在文本检测部分检测多边形,再仿射变换成长条形,使得文本部分不倾斜。也有论文提出在CRNN的前面前置一个STN。STN要真的有效,需要有好的训练数据。就算有好的数据,也降低了模型的总体性能,增大了模型的训练难度。STN可以看成一个极简版的物体检测模块。

输入的尺寸一般为 h × w × c = 32 × 280 × 3 h \times w \times c = 32 \times 280 \times 3 h×w×c=32×280×3,不是这个尺寸的就resize and pad成这个尺寸,尽量不要只resize,这会使得文字变形。输入尺寸 w w w会根据需求做调整,如果文本都是短文本,则可以考虑 w = 100 w=100 w=100

2.2 Feature extraction

Feature extraction就是对 32 × 280 × 3 32 \times 280 \times 3 32×280×3的输入进行特征抽取的一个deep convolutional neural networks,输出 1 × w / 4 × d = 1 × 70 × 512 1 \times w/4 \times d=1 \times 70 \times 512 1×w/4×d=1×70×512的向量。 w / 4 w/4 w/4表示对 32 × 4 32 \times 4 32×4的一小块图片区域抽取一个512维的特征。这一小块区域被称为receptive field(感受野),或是帧。
特征抽取示意图

图2-1 特征抽取示意图

帧的尺寸是可以变的,输出的特征维度也是可以变的,这些都是超参数。也正是因为CRNN这种抽取特征的方式,使得它没法办法处理竖向的文本,所有高度上的像素都被压到一个特征里了,分不开了。帧的尺寸决定了模型的精度,比如有两个文字完全都在同一帧内,那模型就没法把这两个文字分开了,识别就有问题了。

要处理竖向的文本,需要训练一个识别文本方向的分类网络,然后根据文本的方向对竖向的文本进行旋转或者切片拼接等不同的操作。目的就是变成CRNN可以处理的输入。

2.3 Sequence modeling

我们令feature extraction部分的输出为 x = x 1 , x 2 , . . . , x T \bold{x}=x_1, x_2, ..., x_T x=x1,x2,...,xT T = 70 T=70 T=70 x t x_t xt表示第 t t t帧的特征,为一个512维的向量。假设字典的长度为 N N N,Sequence modeling就是一个双向的LSTM,输出 y = y 1 , . . , y T \bold{y} = y_1, .., y_T y=y1,..,yT y t y_t yt表示第 i i i帧为每个字典中字符的概率,是一个 N + 1 N+1 N+1维的向量。

Sequence modeling部分的总输出是一个 T × ( N + 1 ) T \times (N+1) T×(N+1)的概率图。
序列模型

图2-2 序列模型

使用双向LSTM的好处是:
(1)文本是一个序列,抽取特征的CNN模型只能看到附近几帧的图片特征,而双向LSTM可以融合更远的特征,使得模型看到完整的整个字;
(2)LSTM可以和CNN使用Back-Propagation Through Time (BPTT)的方法拼接起来一起训练;
(3)LSTM可以处理任意长度的输入。

2.4 Transcription

这部分是使用CTC来做的,它在训练和预测时有着不同的处理方法。2.3中的 y \bold{y} y之所以维度为 N + 1 N+1 N+1就是因为CTC需要一个空白符" ϕ \phi ϕ"。CTC的对齐基于两个规则:

(1)先合并所有的重复字符;
(2)再删除所有的空白符。

比如,下面两个序列 s \bold{s} s经过对齐之后,都是"Hello"。

H ϕ e e e ϕ l l l ϕ ϕ ϕ l l l ϕ o o H e e ϕ ϕ l l l ϕ ϕ l l l l ϕ o o o H \phi eee \phi lll \phi\phi\phi lll \phi oo \\ H ee \phi\phi lll \phi\phi llll \phi ooo HϕeeeϕlllϕϕϕlllϕooHeeϕϕlllϕϕllllϕooo

2.4.1 训练部分

训练时,我们是知道文本标签的。

假设我们的训练数据为 { I i , l i } \{\bold{I}_i, \bold{l}_i\} {Ii,li} I i \bold{I}_i Ii为第 i i i张训练图片, l i \bold{l}_i li为第 i i i张图片的文本标签, y i \bold{y}_i yi为第 i i i张图片的预测概率图(序列都用粗体进行了表示)。我们的目标就是

a r g min ⁡ − ∑ i l o g p ( l i ∣ y i ) (2-1) arg\min -\sum_{i} log p(\bold{l}_i|\bold{y}_i) \tag{2-1} argminilogp(liyi)(2-1)

其中, p ( l i ∣ y i ) p(\bold{l}_i|\bold{y}_i) p(liyi)表示用概率图 y i \bold{y}_i yi得到文本序列 l i \bold{l}_i li的概率。

p ( l i ∣ y i ) = ∑ s : B ( s ) = l i p ( s ∣ y i ) (2-2) p(\bold{l}_i|\bold{y}_i) = \sum_{\bold{s} : \Beta(\bold{s})=\bold{l}_i} p(\bold{s}|\bold{y}_i) \tag{2-2} p(liyi)=s:B(s)=lip(syi)(2-2)

s \bold{s} s表示可以变成文本 l \bold{l} l的一条路径, B ( s ) \Beta(\bold{s}) B(s)表示对 s \bold{s} s进行CTC对齐操作。 p ( l i ∣ y i ) p(\bold{l}_i|\bold{y}_i) p(liyi)也就是所有可以从 s \bold{s} s变为 l i \bold{l}_i li的路径概率和。

p ( s ∣ y i ) = ∏ t = 1 T y s t t (2-3) p(\bold{s}|\bold{y}_i) = \prod_{t=1}^T y_{s_t}^t \tag{2-3} p(syi)=t=1Tystt(2-3)

要找到所有可以从 s \bold{s} s变为 l i \bold{l}_i li的路径,用枚举法是不行的,这里一般会用HMM中的前向后向算法,也就是动态规划。

2.4.2 预测部分

预测时,我们是不知道文本标签的。

这个时候要去计算所有可能的文本序列的概率,再找到最大的,简直无法想象。所以预测时,我们只能寄希望于模型训练的足够好,每一帧都预测得很准。然后用greedy search或者beam search的方法来找到最有路径。

greedy search是实际最常用的方法,就是取每帧概率最大的标签。

beam search是在每帧去概率最大的前n条路径,一直保留n条概率最大的路径,直到最后一帧,当n取1时,beam search就退化为greedy search。

以上说的都是只有字典的情况,当我们有词表lexicon时,我们可以根据结果,取编辑距离小于 δ \delta δ的所有词,然后再看取这些词时,概率最大的是哪个词,以此确定最终的输出。

3 模型效果

作者还对比了不同数据集下,CRNN对比其他模型的效果,不过这都是2015年的时候的了,看看即可。
CRNN和其他模型对比结果
不如看下百度开源的paddle-ocr里的对比结果。CRNN虽然不是准确率最高的,但是是paddle-ocr最推荐的算法。它的效果和性能的综合优势是最高的。
paddle-ocr对比结果

参考资料

[1] An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition
[2] 一文读懂CRNN+CTC文字识别
[3] PaddleOCR


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

相关文章

文本识别网络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…

Spring中bean的生命周期(易懂版)

bean的生命周期 写在前面的话bean的生命周期代码演示 bean的更完整的生命周期添加后置处理器的代码演示 写在前面的话 关于bean的生命周期有很多的文章,但是大多数都是长篇的理论,说来说去也不是很好理解,再次我就整理了一篇比较好理解的bea…

面试官:讲一下Spring Bean的生命周期?

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

Spring Bean的生命周期(非常详细)

生命周期图 文章目录 前言一、生命周期流程图:二、各种接口方法分类三、演示 前言 Spring作为当前Java最流行、最强大的轻量级框架,受到了程序员的热烈欢迎。准确的了解Spring Bean的生命周期是非常必要的。我们通常使用ApplicationContext作为Spring容…

Spring 中Bean的生命周期

目录 Bean的生命周期 五个阶段 下面是一个bean对象创建到销毁经历过的方法。 图示​ 问答 普通Java类是在哪一步变成beanDefinition的 推荐视频: 阿里专家耗时一年,终于把Spring源码AOP、IOC、Ben生命周期、事物、设计模式以及循环依赖讲全了_哔哩…

Spring之Bean的生命周期详解

通过前面多个接口的介绍了解了Bean对象生命周期相关的方法,本文就将这些接口的方法串起来,来了解Bean的完整的生命周期。而介绍Bean的生命周期也是面试过程中经常会碰到的一个问题,如果不注意就跳坑里啦~~ Spring之Bean对象的初始化和销毁方法…

Bean的生命周期及演示

文章目录 一、介绍概念Bean生命周期组成: 二、实例演示 一、介绍 概念 Bean的生命周期是指一个Bean对象从创建到销毁的整个存在过程。 Bean生命周期组成: 1.实例化Bean(为Bean分配内存空间) 2.属性注入 (Bean注入和装配) 3.Bean…

面试题:Spring Bean的生命周期

最近在复习Spring的面试题,关于Spring Bean的生命周期一直没有很深入的理解,自己结合源码参考了网上的几篇文章,写了一点东西,方便理解。 Spring 启动,查找并加载需要被 Spring 管理的 Bean,进行 Bean 的…

Bean的生命周期和作用域

Bean的生命周期 Bean的执行流程: Bean 执行流程:启动Spring 容器 -> 实例化 Bean(分配内存空间,从无到有)-> Bean 注册到 Spring 中(存操作) -> 将 Bean 装配到需要的类中(…

关于Spring Bean的生命周期

一、简介 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一个实例,而不是每次都产生一个新的对象使用Singleton模式产生单一实…

7、Bean的生命周期

Spring其实就是一个管理Bean对象的工厂。它负责对象的创建,对象的销毁等。 所谓的生命周期就是:对象从创建开始到最终销毁的整个过程。 什么时候创建Bean对象? 创建Bean对象的前后会调用什么方法? Bean对象什么时候销毁&#…

【一篇搞懂】 bean的生命周期详解

概述 Spring中的一个Bean从生到灭要经历很多过程,总体分为Bean定义、实例化、属性赋值(依赖注入)、初始化、生存期、销毁几个阶段: ​​​​​​​​ 下面是一个细化的Bean生命周期图: 过程比较复杂,重点关注Bean的定义、初始化、销毁过程,可以抓住重点: BeanPostPro…