OCR文字識別—基于CTC/Attention/ACE的三大解碼算法
共 3900字,需瀏覽 8分鐘
·
2022-02-09 17:36
歡迎關(guān)注Smarter,構(gòu)建CV世界觀
本文全面梳理一下OCR文字識別三種解碼算法,先介紹一下什么是OCR文字識別,然后介紹一下常用的特征提取方法CRNN,最后介紹3種常用的解碼算法CTC/Attention/ACE。
什么是OCR文字識別?
一般來說,文字識別之前需要先對文字進行定位(文字檢測主要有基于物體檢測和基于分割兩種方法),文字識別就是通過輸入文字圖片,然后解碼成文字的方法。本文主要講文字識別部分,文字識別主要分成三種類型:單字分類、整詞分類和整詞識別。當能夠定位出單字時,可以用圖像分類的方法直接對單字進行分類;當需要預(yù)測整詞數(shù)量較少時,可以對整詞進行分類;當有大量整詞需要預(yù)測并且沒有單字定位時,就需要用解碼序列的方法進行識別了。因此,文字識別中最常用的是文字序列識別,適用場景更為廣泛。本文將主要介紹文字序列識別的解碼算法。
OCR解碼是文字識別中最為核心的問題。本文主要對OCR的序列方法CTC、Attention、ACE進行介紹,微信OCR算法就是參考這三種解碼算法的。
不同的解碼算法的特征提取器可以共用,后面接上不同的解碼算法就可以實現(xiàn)文字識別了,以下用CRNN作為特征提取器。
CRNN
CRNN的特征抽取器由一個CNN和一個BiLSTM組成,其中BiLSTM使用的是stack形深層雙向LSTM結(jié)構(gòu)。
CRNN特征提取器流程如下:
1.假設(shè)輸入圖像尺寸為32x100x3(HxWxC),經(jīng)過CNN轉(zhuǎn)換成1x25x512(HxWxC)。
2.將CNN的輸出維度轉(zhuǎn)換為25個1x512的序列,送入深層雙向LSTM中,得到CRNN的輸出特征,維度轉(zhuǎn)換成為25xn(n是字符集合總數(shù))。
OCR文字識別的難點
OCR文字識別的解碼主要難點在于如何進行輸入輸出的對齊。如上圖所示,如果每個1xn預(yù)測一個字符,那么可能會出現(xiàn)多個1xn預(yù)測同一個字符,這樣子得到的最終結(jié)果會產(chǎn)生重復字符。所以需要設(shè)計針對文字識別的解碼算法來解決輸入輸出的對齊問題。
目前我了解到的主要有三種解碼方法,可以解決OCR解碼的一對多問題,分別為CTC、Attention和ACE三種。
CTC
CTC是最為經(jīng)典的OCR解碼算法,假設(shè)CRNN特征抽取器的輸出維度Txn,其中T=8,n包含blank(記作 - )字符(blank字符是間隔符,意思是前后字符不連續(xù))。對每一列1xn進行softmax得到概率最大的字符,得到的最終序列需要去除連續(xù)的重復字符,比如最終得到的序列為-stt-ate,那么去重合并后就得到state序列。
那么state的序列概率就變成了所有去重合并后為state的字符序列概率之和,只要最大化字符序列概率,就可以優(yōu)化CRNN+CTC的文字識別算法。由于每個字符前后都可以插入blank,所以可以將所有可能狀態(tài)如下圖展開。
為了方便起見,對于所有state序列的合法路徑做一些限制,規(guī)則如下:
1.轉(zhuǎn)換只能往右下方向,其它方向不允許
2.相同的字符之間起碼要有一個空字符
3.非空字符不能被跳過
4.起點必須從前兩個字符開始
5.終點必須落在結(jié)尾兩個字符
根據(jù)上述約束規(guī)則,遍歷所有"state"序列的合法路徑,“state”的所有合法路徑如下圖所示:
其中綠色框部分為起點和終點,藍色箭頭為"state"序列的合法路徑。當然可以通過枚舉所有路徑,然后求所有路徑的概率之和即為"state"序列的概率。但是枚舉所有路徑計算復雜度太高了,于是CTC引入了HMM的前向-后向算法來減少計算復雜度(可以參考一下我之前的回答,增加隱馬爾可夫模型(HMM)的理解如何用簡單易懂的例子解釋隱馬爾可夫模型?)。
以前向算法為例(后向算法可以認為是狀態(tài)序列的反轉(zhuǎn),計算方法相同),簡單來說,就是利用分治和動態(tài)規(guī)劃的思想,把8個時間點拆分成7個重復單元,然后先計算出第一個重復單元紅色虛線框中每個狀態(tài)的觀測概率,并且保存下來當作下一個重復單元的初始狀態(tài),循環(huán)計算7次就得了最終的觀測概率。比起暴力求解觀測概率,復雜度大大降低。
Attention
基于Attention的OCR解碼算法,把OCR文字識別當成文字翻譯任務(wù),即通過Attention Decoder出文字序列。
RNN -> Seq2Seq
左圖是經(jīng)典的RNN結(jié)構(gòu),右圖是Seq2Seq結(jié)構(gòu)。RNN的輸入序列和輸出序列必須有相同的時間長度,而機器翻譯以及文字識別任務(wù)都是輸入輸出不對齊的,不能直接使用RNN結(jié)構(gòu)進行解碼。于是在Seq2Seq結(jié)構(gòu)中,將輸入序列進行Encoder編碼成一個統(tǒng)一的語義向量Context,然后送入Decoder中一個一個解碼出輸出序列。在Decoder解碼過程中,第一個輸入字符為
Seq2Seq -> Attention Decoder
Seq2Seq把所有的輸入序列都編碼成一個統(tǒng)一的語義向量Context,然后再由Decoder解碼。由于context包含原始序列中的所有信息,它的長度就成了限制模型性能的瓶頸。如機器翻譯問題,當要翻譯的句子較長時,一個Context可能存不下那么多信息,就會造成精度的下降。除此之外,如果按照上述方式實現(xiàn),只用到了編碼器的最后一個隱藏層狀態(tài),信息利用率低下。
所以如果要改進Seq2Seq結(jié)構(gòu),最好的切入角度就是:利用Encoder所有隱藏層狀態(tài)解決Context長度限制問題。于是Attention Decoder在Seq2Seq的基礎(chǔ)上,增加了一個Attention Layer,如上圖所示。
在Decoder時,每個時刻的解碼狀態(tài)跟Encoder的所有隱藏層狀態(tài)進行cross-attention計算,cross-attention將當前解碼的隱藏層狀態(tài)和encoder的所有隱藏層狀態(tài)做相關(guān)性計算,然后對encoder的所有隱藏層加權(quán)求和,最后和當前解碼的隱藏層狀態(tài)concat得到最終的狀態(tài)。這里的cross-attention計算方式也為后來的Transformer框架打下了基礎(chǔ)(詳細看我之前寫的文章計算機視覺"新"范式: Transformer)。
另外,從形式上看,Attention Decoder很自然的可以替換成最近非常流行的Transformer,事實上,最近也有幾篇基于Vision Transformer的文本識別算法。
ACE
基于ACE的解碼方法不同于CTC和Attention,ACE的監(jiān)督信號實際上是一種弱監(jiān)督(輸入輸出沒有做形式上的對齊,沒有先后順序信息,傾向于學習表征),并且可以用于多行文字識別。
對于單行文字,假設(shè)輸出維度為Txn(T是序列長度,n是字符集合總數(shù)),那么第k個字符出現(xiàn)的總數(shù)為,然后除以T,就能得到第k個字符出現(xiàn)的概率分布(記作),做相同計算,可以求出所有字符的概率分布,最后和label字符的概率分布計算交叉熵優(yōu)化網(wǎng)絡(luò)。同理,對于多行文字,只需要將HxW壓縮成T=HW,然后計算所有字符的概率分布即可。
CTC/Attention/ACE三種解碼算法比較
從模型設(shè)計上來看,可以采用結(jié)合上面3種方法的多任務(wù)文本識別模型。在訓練時,以CTC為主,Attention Decoder和ACE輔助訓練。在預(yù)測時,考慮到速度和性能,只采用CTC進行解碼預(yù)測。多任務(wù)可以提高模型的泛化性,同時如果對預(yù)測時間要求不高,多結(jié)果也可以提供更多的選擇和對比。
上圖來源于微信OCR技術(shù)的比較:
1.CTC和ACE方法不需要額外的計算參數(shù),Attention需要額外的計算參數(shù)
2.推理內(nèi)存,ACE < CTC < Attention;推理速度,ACE > CTC > Attention
3.CTC效果更好一些,適合長文本;Attention可以得到語言模型;ACE可以用于計數(shù)和2D預(yù)測
由于Attention依賴于上一個預(yù)測結(jié)果,導致只能串行解碼,推理速度影響較大,但是可以得到語言模型做pretrain遷移使用;而CTC可以通過引入blank字符做形式上對齊,并且通過HMM前向-后向算法加速;ACE則直接不依賴順序信息,直接估計整體分布。三者各有利弊,實際使用時,需要結(jié)合具體任務(wù)按需使用。
Reference
[1] An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition
[2] Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neural Networks
[3] Robust Scene Text Recognition with Automatic Rectification
[4] Aggregation Cross-Entropy for Sequence Recognition
[5] https://mp.weixin.qq.com/s/6IGXof3KWVnN8z1i2YOqJA
強烈推薦以下三篇blog
完全解析RNN, Seq2Seq, Attention注意力機制
https://xiaodu.io/ctc-explained/
歡迎關(guān)注Smarter,構(gòu)建CV世界觀
歡迎加入Smarter交流群,添加微信「cjy094617」,備注「學校-方向」即可
