文本识别网络CRNN

article/2025/8/23 23:45:19

文本识别网络CRNN

  • 简介
  • 网络结构
    • CNN层
    • LSTM层
    • CTC Loss
  • 代码实现

简介

CRNN,全称Convolutional Recurrent Neural Network,卷积循环神经网络。
它是一种基于图像的序列识别网络,可以对不定长的文字序列进行端到端的识别。
它集成了卷积神经网络(CNN)和循环神经网络(RNN)的优点。

网络结构

CRNN网络结构由CNN + BLSTM + 转录层(CTC Loss)组成。
在这里插入图片描述

CNN层

CNN层可以采用VGG网络,如下所示特征提取过程中用了7次Convolution,4次MaxPooling层,最后两次的池化核大小由2 x 2变为1 x 2,所以图像经过最后一层MaxPooling层后特征图维度变为:
高度方向减半4次(24),变为原来的1/16
宽度方向减半2次(22),变为原来的1/4
但是,最后一层Convolution,使高宽又减半一次,所以:
高度方向变为原图的1/32
宽度方向变为原图的1/8
在这里插入图片描述

LSTM层

RNN层采用双向LSTM层。因为:
LSTM相对于RNN可以防止训练时梯度的消失;
BLSTM相对于LSTM,序列的前向信息和后向信息都可以得到照顾。
在这里插入图片描述

CTC Loss

转录层是根据每帧的预测找到具有最高概率组合的标签序列。

CTC(Connectionist Temporal Classification)损失函数代替Softmax Loss,来对 CNN 和 RNN 进行端到端的联合训练,CTC引入了blank字符,可以解决不定长的文字对齐问题。

对于LSTM,输入为x,则输出为l的概率为:
在这里插入图片描述
CTC的训练过程,其实就是通过求P (l|x) 对于LSTM的参数w的梯度,来更新LSTM的过程。

CTC通过用一种前向-后向算法(The CTC Forward-Backward Algorithm),其和HMM中的forward-backward算法类似,来计算P (l|x) 。

LSTM输入x,经过softmax,输出y的后验概率矩阵,y输入CTC,P (l|x)与Forward和Backward递推公式之间的关系为:
在这里插入图片描述
求导计算梯度,用来更新LSTM的参数:
在这里插入图片描述

代码实现

CNN层

inputs = Input(shape=(picture_height, picture_width, 1), name='pic_inputs') # H×W×1 32*128*1
x = Conv2D(64, (3,3), strides=(1,1), padding="same", kernel_initializer=initializer, use_bias=True, name='conv2d_1')(inputs) # 32*128*64 
x = BatchNormalization(name="BN_1")(x)
x = Activation("relu", name="relu_1")(x)
x = MaxPooling2D(pool_size=(2,2), strides=2, padding='valid', name='maxpl_1')(x) # 16*64*64x = Conv2D(128, (3,3), strides=(1,1), padding="same", kernel_initializer=initializer, use_bias=True, name='conv2d_2')(x) # 16*64*128
x = BatchNormalization(name="BN_2")(x)
x = Activation("relu", name="relu_2")(x)
x = MaxPooling2D(pool_size=(2,2), strides=2, padding='valid', name='maxpl_2')(x) # 8*32*128x = Conv2D(256, (3,3), strides=(1,1), padding="same", kernel_initializer=initializer, use_bias=True, name='conv2d_3')(x)  # 8*32*256
x = BatchNormalization(name="BN_3")(x)
x = Activation("relu", name="relu_3")(x)
x = Conv2D(256, (3,3), strides=(1,1), padding="same", kernel_initializer=initializer, use_bias=True, name='conv2d_4')(x) # 8*32*256
x = BatchNormalization(name="BN_4")(x)
x = Activation("relu", name="relu_4")(x)
x = MaxPooling2D(pool_size=(2,1), strides=(2,1), name='maxpl_3')(x) # 4*32*256x = Conv2D(512, (3,3), strides=(1,1), padding="same", kernel_initializer=initializer, use_bias=True, name='conv2d_5')(x) # 4*32*512
x = BatchNormalization(axis=-1, name='BN_5')(x)
x = Activation("relu", name='relu_5')(x)
x = Conv2D(512, (3,3), strides=(1,1), padding="same", kernel_initializer=initializer, use_bias=True, name='conv2d_6')(x) # 4*32*512
x = BatchNormalization(axis=-1, name='BN_6')(x)
x = Activation("relu", name='relu_6')(x)
x = MaxPooling2D(pool_size=(2,1), strides=(2,1), name='maxpl_4')(x) # 2*32*512x = Conv2D(512, (2,2), strides=(1,1), padding='same', activation='relu', kernel_initializer=initializer, use_bias=True, name='conv2d_7')(x) # 2*32*512
x = BatchNormalization(name="BN_7")(x)
x = Activation("relu", name="relu_7")(x)
conv_otput = MaxPooling2D(pool_size=(2, 1), name="conv_output")(x) # 1*32*512

Map2Sequence层

x = Permute((2, 3, 1), name='permute')(conv_otput) # 32*512*1
rnn_input = TimeDistributed(Flatten(), name='for_flatten_by_time')(x) # 32*512

RNN层

y = Bidirectional(LSTM(256, kernel_initializer=initializer, return_sequences=True), merge_mode='sum', name='LSTM_1')(rnn_input) # 32*512
y = BatchNormalization(name='BN_8')(y)

CTC Loss

y_pred = Dense(num_classes, activation='softmax', name='y_pred')(y)
y_true = Input(shape=[max_label_length], name='y_true')
y_pred_length = Input(shape=[1], name='y_pred_length')
y_true_length = Input(shape=[1], name='y_true_length')ctc_loss_output = Lambda(K.ctc_batch_cost(y_true, y_pred, pred_length, label_length), output_shape=(1,), name='ctc_loss_output')([y_true, y_pred, y_pred_length, y_true_length])
model = Model(inputs=[y_true, inputs, y_pred_length, y_true_length], outputs=ctc_loss_output)

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

相关文章

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…

Bean 生命周期详解

Spring Bean 的生命周期,面试时非常容易问,这不,前段时间就有个粉丝去字节面试,因为不会回答这个问题,一面都没有过。 如果只讲基础知识,感觉和网上大多数文章没有区别,但是我又想写得稍微深入…