当前位置:   article > 正文

OCR之CRNN模型简单理解

crnn模型

参考学习视频:CRNN整体流程_哔哩哔哩_bilibili

1 基本原理

  1. 原论文

An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition(一种端到端可训练神经网络用于图像序列的识别及其在场景文本识别中的应用)  论文地址:https://arxiv.org/pdf/1507.05717.pdf 

主要创新点:CRNN网络

目的(文本识别):输入图片,输出图片上的字符文本。

  1. 通过卷积神经网络(CNN)提取原图特征,然后将特征送入循环神经网络层(BiLSTM)得到图片中的序列输出结论,通过softmax分类层得到output。最后通过转换层将输出结论结合CTC转换为确定字符。

网络结构--->

总体网络结构如下:

    1. CNN层

CNN提取图片特征过程如下:将原图样本resize为32*100,然后通过系列卷积操作,提取特征得到1*26*512, 即为原图分为26块序列,每一块特征点512个,26个特征序列为RNN输入做准备。

    1. RNN层

RNN获取图片特征中每一帧的输出label概率分布:

从图中可以看出,将1*26*512分布的feature map, 通过deep BiLSTM网络结构的时序数据预测后,得到26*N的矩阵分布输出,其中26表示图片特征中的26个序列,N表示每一个序列预测的N个标签的概率值。 比如预测26个字母,那么这里N也为26(实际中CRNN加了空格符号’-’,所以应该是N为27)

    1. 转换层

最后将输出转换为具体字符结论的时候,用到了CTC理论(Connectionist Temporal Classification),可以不用对齐处理识别结论中的字符。比如h--ee-l-l---o  -> hello.  CTC通过增加空白符-,利用相邻中相同的合并为一个,最后一起去掉-的原则,来达到最后目的。

如下是CTC理论的一些大致推导公式,其中π是rnn的输出,B(π)是通过CTC转换后的最终label输出结论。

如下所示,p(l|y)表示预测字符y被输出得到为l这种label的概率,p(hello | y) 表示所有可能得到hello字符串的概率之和,O则表示需要优化的损失函数:是交叉熵形式。在网络输出的时候采取“所有可以形成hello的概率最大的一条路径字符值”I*

2 实现过程

可以看到,CRNN网络的3个阶段实现过程如下:

在代码中,CNN的卷积池化操作中涉及到的参数如下(W/H是特征层转换后的宽高):

部分卷积池化操作实现如下:

RNN层主要实现如下,可以看到是一个双向的LSTM层,再接入一个全连接的线性分类层。

  1. 目前OCR识别存在的问题

目前ocr识别方面,存在一些问题,主要是空格识别不准,连续相同字符的识别问题。以及某些字符在有干扰背景或者噪声干扰图片质量不佳时候识别不准。后边优化方向:

  1. 针对空格问题,寻找百度paddle ocr解决方案,对应优化自己的crnn模型,目前尝试找一种特定的字符做标签;
  2. 连续相同的字符识别问题,由于CTC loss的原理原因,可能会合并字符的风险。

a-pp--le  ctc会弄成aple.

  1. 针对不准的样本,对应制作一些数据集,继续在现在用的crnn模型上再加强训练;
  2. 同时对比paddle的效果,也加强训练paddle的模型。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/965778
推荐阅读
相关标签
  

闽ICP备14008679号