Text Recognition 常用方法

Text Recognition

Step 0x00

Preprocessing images

  1. 二值化/灰度处理
  2. crop or resize (固定高度/宽度可固定也可以不固定,Width决定序列长度)
  3. 处理Labels, 不同框架操作不同,主要是给label pad zero 保证一个batch序列长度一致
  4. 对于seq2seq模型需要添加EOS和GO,来标示序列的开始与结束

Step 0x01

Feature Extracting/Encoding

  1. Using deep convolutional networks

Step 0x10

Sequence Labeling or Decoding

  1. CTC

    广泛应用于 语音识别

Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neural Networks

  • Motive: 一般情况下分类,需要对序列的每一帧进行分类,在语音识别中,可能某些时刻并没有意义。
  • Solution: 添加 blank / - 类别作为空白,对于真实场景中没有意义的时刻标注为空白。然后将问题还原为原来的分类问题,但类别数变为了NUM_CLASS+1 ,即增加了一个空白类。
  • Example: 一个 seq_len = 6 的序列,通过rnn输出得到一个序列 -a-bb-a 对应序列 aba

  • Decode: 得到一个序列后,如-a-bb-aa-c-bad

    1. 去除blank和重复字符(相邻的相同字符被指为重复字符) (-a-b--a--c-bad) - > (abacbad)
    2. 组成新的序列,即输出序列

      也可以通过beam search来decode (TensorFlow)

一个有动画的网站

  • 应用到Text Recognition中

将0x01中得到的feature map map称一个sequqnce (一般情况下考虑下图像的height和pool的关系,最好map时,高度变为1)。

然后通过RNN(推荐bidirectional LSTM/GRU)可以得到前后的相关性,在语义角度有提升。 Softmax输出 NUM_CLASS+1 概率,结合target和ctc计算loss。

关于ctc原理可以看下论文,并结合Baidu的warp_ctc实现深入学习下。

  1. Seq2Seq

    广泛应用于机器翻译、QA
    Sequence to Sequence Learning with Neural Networks

  • 修改taget,增加一个GO和EOS,以及PADDING

    • EOS: 结束符

    • GO: 开始符

    • PADDING: 填充

  • Model: Encoder-Decoder

    • Encoder: 将序列通过RNN,得到RNN的隐藏状态 H_t 向量

    • Decoder: 将Encoder的隐藏状态作为自己的初始状H_0, 利用上一时刻的输出作为下一时刻的输入,预测下一时刻的输出。然后在用下一时刻的输出预测下下一时刻的输出。

  • Attention机制:作用于Decoder

    从Encoder中获取隐藏状态向量(一般为bidirectional),每次Decode一个字符时,会利用attention来获取一个状态 a_t,然后 结合上一时刻的状态更新当前时刻的状态并输出

    1
    S_t = f(S_(t-1) + a_t)

    输入序列每个时刻对decoder的各个时刻的状态的影响不一样,因此可以理解为序列的Attention。

    简化版公式

    1
    a_t = b_t1 * h_1 + b_t2 * h_2 + .... + b_tn * h_n
随着参数的不同,输入序列的不同部分影响着decoder的状态。
  • 优点:

    1. 增强语义
    2. 可引入attention和语言模型(N-grams)来辅助识别。
  • 应用于Text Recognition

  • 注意Decoder的使用:

1
2
label:[A, B, C, EOS]
input:[GO, A, B, C]

训练时,使用上一时刻的输出(从标签中获取)作为下一时刻的输入。

预测时,使用上一时刻的输出(预测输出)作为下一时刻的输入。

结合Beam Search

  1. Beam Search

确定一个beam_size, 每个时刻(Frame)选取N个候选值。

  • 路径搜索

    每一时刻,将所选候选值与已经组好的beam_size个sequence结合,即将合成 N*beam_size 个序列

  • 路径评估

    对已经合成的 N*beam_size 序列 评估,找到分值最大的 beam_size个序列,然后作为下一时刻的初始序列。

  • example

Step 0x11 Lexicon

  1. 构建Trie树搜索单词
  2. 添加语言模型(Ngrams)