06. OCR學習路徑之CRNN文本識別(上)

  • 2019 年 12 月 13 日
  • 筆記

前言

在了解了如何檢測到文本之後,我們需要識別出檢測文本內的文字資訊。在文本識別完成之後,整個OCR光學字元識別的過程才算基本完成。那麼,本次課程主要講述識別文本的演算法。

一.演算法簡介

檢測出的文本片段一般是一行文字,具有sequence-like屬性,因此此類文本識別歸屬為image-based sequence recognition的問題。這就與常規的物體識別不同,它有一系列的標籤,識別出的結果是序列化的字元,而不是單個標籤,類序列對象的另一個特點是其長度不統一,標籤也是長度變化的。因此,解決此類問題,就不能採用固定輸入和輸出的傳統CNN模型了。

對於此類識別問題,目前比較流行的演算法就是CRNN+CTC的方式,我們將展開來說。

一篇比較經典的文章: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

優點:不需要預處理(二值化、切割等)、可以直接從sequence的target上學習(label為語句)、不受序列長度約束。

CRNN+CTC網路架構

架構包括三部分:

1) 卷積層,從輸入影像中提取特徵序列;

2) LSTM層,預測每一幀的標籤分布,從卷積層獲取的特徵序列的標籤(真實值)分布

3) 轉譯層,將每一幀的預測變為最終的標籤序列。

CRNN藉助了語音識別中解決不定長語音序列的思路。對於序列問題的解決,通常使用循環網路RNN,為了消除RNN網路常見的梯度爆炸問題,引出LSTM,這些演算法在語音識別領域都已相當成熟,有很好的表現,現在就是設計特徵,讓影像特徵可以有近似於語音的特徵表達。

語音識別中的時間對應著影像的橫向尺度W。

如何獲取上述特徵呢?

現在輸入有個影像,為了將特徵輸入到Recurrent Layers,做如下處理:

l 首先會將影像縮放到 32×W×1 大小

l 然後經過CNN後變為 1×(W/4)× 512

l 接著針對LSTM,設置 T=(W/4) , D=512 ,即可將特徵輸入LSTM。

l LSTM有256個隱藏節點,經過LSTM後變為長度為T × nclass的向量,再經過softmax處理,列向量每個元素代表對應的字元預測概率,最後再將這個T的預測結果去冗餘合併成一個完整識別結果即可。

網路配置如下圖,

CRNN網路配置

其中,『k』, 『s』 和『p』 代表 kernel size, stride 和padding size

以上都比較好理解,但是最後一步,經過LSTM後變為長度為T × nclass的向量,再經過softmax處理,列向量每個元素代表對應的字元預測概率,最後再將這個T的預測結果去冗餘合併成一個完整識別結果即可。如何去冗餘呢?這可是個技術活了。

當然,語音識別也早就做好了,文字識別在這裡所做的一切都是為了吧影像特徵與語音特徵近似化,其他的工作都交給語音識別演算法了。

二.CTC

詳細的CTC推導過程網上已經有很多,說一下我的理解就是。由於輸出的T=W/4是一個不定長的結果,而我們需要做的就是將該序列結果翻譯成最終的識別結果。但是LSTM進行時序分類時的輸出有一個特點,就是同一個字元被連續識別兩次,因此需要一個去冗餘機制,但是簡單粗暴地去處冗餘也不行,比如「–hh-e-l-ll-oo–」,直接去冗餘就變成helo了,那就識別錯誤了。

因此CTC為了解決這種二義性,提出了插入blank機制,比如下圖的以符號「-」代表blank。若標籤為「aaa-aaaabb」則將被映射為「aab」,而「aaaaaaabb」將被映射為「ab」。引入blank機制,就可以很好地處理了重複字元的問題了。

-s-t-aatte轉譯成state

但是通常一個正確的輸出序列可以有多條路徑達成,比如直接貼一張其他部落客的圖吧,下面醬紫的:

可以看出,這4條路線都能達到正確的結果輸出,那麼如何找出最優的路徑呢?就引出下一個公式,

其中

Β 的作用就是maps π onto l by firstly removing the repeated labels。

y^t_πt是時刻t在能輸出正確值πt的情況下,所輸出某一個字元的概率。

每一個字元的輸出都對應著一個softmax計算出的概率ytπt ,再把每一個字元輸出對應的概率相乘,得出這條路徑的概率為p(π|y),那所有路徑的概率總和就是p(l|y),也就是以上公式想表達的意思了。

三.Loss設計

由以上分析,知道了最佳路徑的概率值,那麼現在就可以設計一個訓練的Loss函數來尋找一個最大概率的輸出序列,

Ii是訓練圖片,I_i是真實標籤。

通過對概率的計算,就可以對之前的神經網路進行反向傳播更新。類似普通的分類,CTC的損失函數O定義為負的最大似然,為了計算方便,對似然取對數。我們的訓練目標就是使得損失函數O優化得最小即可。

四.訓練階段

訓練的時候,為了加速訓練,所有的圖片都scale到100*32

測試的圖片固定高度為32的比例,寬度按對應比例縮放。

總結

該演算法在識別樂譜上也有良好的表現,這顯然證實了它的泛化性。

可以實現端到端的訓練。

1) 不依賴字元切分;

2) 不限定語料範圍;

3) 模型參數相對較少;

4) 可充分學習到上下文的關係,等等。

缺點:

1) CTC每次都要計算概率,採用前綴搜索演算法解碼或者約束解碼演算法;

2) 受CTC演算法對速度的要求,輸出長度因此收到限制。