CRNN论文笔记

CRNN是《An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition》中提出的模型,解决图像中文字识别问题。
论文地址:https://arxiv.org/abs/1507.05717
github地址:https://github.com/bgshih/crnn

1、应用环境

应用于图像中序列物体的识别。比如说一段文字、一段乐谱。简单而言,就是前后文有联系的。

2、特点

1、可以直接从序列标签学习,不必给每一个字符打标签。例如图片中是“abc123”,标签即是“abc123”,不用给每个字符单独打标签。
2、有CNN的优点,直接从输入图像学习,不必做二值化、分割、定位等,这些预处理操作。
3、有RNN的优点,输出的是一个序列标签。
4、对要识别的序列对象没有长度限制。只是在训练和测试中,高度要归一化。
5、比其他模型参数更少。
6、虽然结合了CNN和RNN,但最后用一个loss函数,可以端到端的训练。

3、模型架构

这里写图片描述
模型有三部分构成:
(1)convolution layer 直接从图像中提取特征,生成的特征序列
(2)recurrent layer 把特征序列变成特征分布
(3) transcription layer 则把特征分布转化成标签序列

4、特征序列提取

首先输入图像都必须统一成同样高度,其次CNN由convolution layer和max-pooling layer组成。
因为卷积和池化具有平移不变性,所以在从左往右提取特征的时候,生成的特征向量跟原图的位置也是对应的。因此生成的特征序列可以看做是对原图像的描述。
这里写图片描述

5、序列标签

The recurrent layers 输入的是特征序列,输出的是特征分布。
对特征序列 x=x1,x2,..,xTxtyt
使用RNN有3个好处:
(1)RNN有很强的联系上下文能力,所以适合处理这种序列任务。
(2)RNN可以将误差反向传播回去,这样就可以跟CNN联合训练
(3)RNN能输入任意序列长度
这里写图片描述
本文采用了双向LSTM,其原理和作用不再赘述。
最后,作者写了一个“Map-to-Sequence”layer,作为联系CNN和RNN的桥梁。

6、transcription

transcription就是把特征分布转化成标签序列,本质上就是找特征分布中对应标签概率最大的。
采用CTC的方法。未完待续。。

7、训练

训练使用了一个loss函数,可以跟CNN,RNN 联系起来,所以实现了端到端的训练。
采用SGD训练,ADADELTA优化效果更好。

### CRNN模型概述 CRNN(Convolutional Recurrent Neural Network)是一个深度学习模型,它结合了卷积神经网络(CNN)和循环神经网络(RNN)。该模型设计用于高效地识别图像中的序列数据,例如手写字体或印刷字体[^1]。具体来说,CRNN特别适用于基于图像的序列识别任务,如场景文字识别。 #### 模型架构 CRNN模型由三个主要部分组成: - **CNN部分**:负责从输入图像中提取特征。这部分通常使用标准的卷积层来捕捉图像的空间特征。在某些实现中,可能会采用更复杂的骨干网络,比如ResNet18的前四层来进行特征提取[^3]。 - **RNN部分**:主要用于处理经过CNN提取后的特征图谱所形成的序列信息。这一环节常选用LSTM单元构成的双向RNN结构,以便更好地捕捉字符间的上下文关联性。 - **CTC Loss**:作为损失函数的一部分,在不需要精确对齐的情况下帮助优化整个系统的性能。这使得即使当预测结果与真实标签之间存在一定的位移偏差时也能得到合理的评价分数[^5]。 ```python import torch.nn as nn class CRNN(nn.Module): def __init__(self, num_classes=37): # 假设共有37类字符 super(CRNN, self).__init__() # 定义CNN模块 cnn_out_size = ... self.cnn = ResNetFeatureExtractor(cnn_out_size) # 定义RNN模块 rnn_hidden_size = ... self.rnn = BidirectionalLSTM(input_size=cnn_out_size, hidden_size=rnn_hidden_size, output_size=num_classes) def forward(self, x): conv = self.cnn(x) b, c, h, w = conv.size() t_rec = conv.view(b, c * h, w).transpose(1, 2) # [b, w, c*h] seq_len = t_rec.shape[0] output = self.rnn(t_rec.contiguous()) return output.log_softmax(dim=-1), seq_len ``` ### 应用实例 CRNN广泛应用于各种涉及光学字符识别的任务当中,尤其是在自然场景下的文本检测与识别领域表现出色。除了基本的手写或打印文档扫描件外,还可以扩展到车牌号码、身份证号等特定格式的数据解析工作之中[^4]。此外,通过适当调整参数配置并引入额外训练样本的方式可以进一步提升对于复杂背景条件下低质量图片的支持能力。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值