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為語句)、不受序列長度約束。

架構包括三部分:
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的預測結果去冗餘合併成一個完整識別結果即可。
網路配置如下圖,

其中,『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機制,就可以很好地處理了重複字元的問題了。

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

可以看出,這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演算法對速度的要求,輸出長度因此收到限制。


