decoder【深度学习】OCR⽂字识别—基于CTCAttentionACE的三⼤
解码算法
本⽂全⾯梳理⼀下OCR⽂字识别三种解码算法,先介绍⼀下什么是OCR⽂字识别,然后介绍⼀下常⽤的特征提取⽅法CRNN,最后介绍3种常⽤的解码算法CTC/Attention/ACE。
什么是OCR⽂字识别?
⼀般来说,⽂字识别之前需要先对⽂字进⾏定位(⽂字检测主要有基于物体检测和基于分割两种⽅法),
⽂字识别就是通过输⼊⽂字图⽚,然后解码成⽂字的⽅法。本⽂主要讲⽂字识别部分,⽂字识别主要分成三种类型:单字分类、整词分类和整词识别。当能够定位出单字时,可以⽤图像分类的⽅法直接对单字进⾏分类;当需要预测整词数量较少时,可以对整词进⾏分类;当有⼤量整词需要预测并且没有单字定位时,就需要⽤解码序列的⽅法进⾏识别了。因此,⽂字识别中最常⽤的是⽂字序列识别,适⽤场景更为⼴泛。本⽂将主要介绍⽂字序列识别的解码算法。
OCR解码是⽂字识别中最为核⼼的问题。本⽂主要对OCR的序列⽅法CTC、Attention、ACE进⾏介绍,OCR算法就是参考这三种解码算法的。
不同的解码算法的特征提取器可以共⽤,后⾯接上不同的解码算法就可以实现⽂字识别了,以下⽤CRNN作为特征提取器。
CRNN
CRNN的特征抽取器由⼀个CNN和⼀个BiLSTM组成,其中BiLSTM使⽤的是stack形深层双向LSTM结构。
CRNN特征提取器流程如下:
1.假设输⼊图像尺⼨为32x100x3(HxWxC),经过CNN转换成1x25x512(HxWxC)。
2.将CNN的输出维度转换为25个1x512的序列,送⼊深层双向LSTM中,得到CRNN的输出特征,维度转换成为25xn(n是字符集合总数)。
OCR⽂字识别的难点
OCR⽂字识别的解码主要难点在于如何进⾏输⼊输出的对齐。如上图所⽰,如果每个1xn预测⼀个字符,那么可能会出现多个1xn预测同⼀个字符,这样⼦得到的最终结果会产⽣重复字符。所以需要设计针对⽂字识别的解码算法来解决输⼊输出的对齐问题。
⽬前我了解到的主要有三种解码⽅法,可以解决OCR解码的⼀对多问题,分别为CTC、Attention和ACE三种。
CTC
CTC是最为经典的OCR解码算法,假设CRNN特征抽取器的输出维度Txn,其中T=8,n包含blank(记作 - )字符(blank字符是间隔符,意思是前后字符不连续)。对每⼀列1xn进⾏softmax得到概率最⼤的字符,得到的最终序列需要去除连续的重复字符,⽐如最终得到的序列为-stt-ate,那么去重合并后就得到state序列。
那么state的序列概率就变成了所有去重合并后为state的字符序列概率之和,只要最⼤化字符序列概率,
就可以优化CRNN+CTC的⽂字识别算法。由于每个字符前后都可以插⼊blank,所以可以将所有可能状态如下图展开。
为了⽅便起见,对于所有state序列的合法路径做⼀些限制,规则如下:
1.转换只能往右下⽅向,其它⽅向不允许
2.相同的字符之间起码要有⼀个空字符
3.⾮空字符不能被跳过
4.起点必须从前两个字符开始
5.终点必须落在结尾两个字符
根据上述约束规则,遍历所有"state"序列的合法路径,“state”的所有合法路径如下图所⽰:
其中绿⾊框部分为起点和终点,蓝⾊箭头为"state"序列的合法路径。当然可以通过枚举所有路径,然后求所有路径的概率之和即为"state"序列的概率。但是枚举所有路径计算复杂度太⾼了,于是CTC引⼊了HMM的前向-后向算法来减少计算复杂度(可以参考⼀下我之前的回答,增加隐马尔可夫模型(HMM)的理解)。
以前向算法为例(后向算法可以认为是状态序列的反转,计算⽅法相同),简单来说,就是利⽤分治和动态规划的思想,把8个时间点拆分成7个重复单元,然后先计算出第⼀个重复单元红⾊虚线框中每个状态的观测概率,并且保存下来当作下⼀个重复单元的初始状态,循环计算7次就得了最终的观测概率。⽐起暴⼒求解观测概率,复杂度⼤⼤降低。
Attention
基于Attention的OCR解码算法,把OCR⽂字识别当成⽂字翻译任务,即通过Attention Decoder出⽂字序列。
RNN -> Seq2Seq

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。