本文全面梳理一下OCR文字識(shí)別三種解碼算法,先介紹一下什么是OCR文字識(shí)別,然后介紹一下常用的特征提取方法CRNN,最后介紹3種常用的解碼算法CTC/Attention/ACE。 一般來(lái)說(shuō),文字識(shí)別之前需要先對(duì)文字進(jìn)行定位(文字檢測(cè)主要有基于物體檢測(cè)和基于分割兩種方法),文字識(shí)別就是通過(guò)輸入文字圖片,然后解碼成文字的方法。本文主要講文字識(shí)別部分,文字識(shí)別主要分成三種類型:?jiǎn)巫址诸?、整詞分類和整詞識(shí)別。當(dāng)能夠定位出單字時(shí),可以用圖像分類的方法直接對(duì)單字進(jìn)行分類;當(dāng)需要預(yù)測(cè)整詞數(shù)量較少時(shí),可以對(duì)整詞進(jìn)行分類;當(dāng)有大量整詞需要預(yù)測(cè)并且沒(méi)有單字定位時(shí),就需要用解碼序列的方法進(jìn)行識(shí)別了。因此,文字識(shí)別中最常用的是文字序列識(shí)別,適用場(chǎng)景更為廣泛。本文將主要介紹文字序列識(shí)別的解碼算法。 OCR解碼是文字識(shí)別中最為核心的問(wèn)題。本文主要對(duì)OCR的序列方法CTC、Attention、ACE進(jìn)行介紹,微信OCR算法就是參考這三種解碼算法的。不同的解碼算法的特征提取器可以共用,后面接上不同的解碼算法就可以實(shí)現(xiàn)文字識(shí)別了,以下用CRNN作為特征提取器。CRNN的特征抽取器由一個(gè)CNN和一個(gè)BiLSTM組成,其中BiLSTM使用的是stack形深層雙向LSTM結(jié)構(gòu)。1.假設(shè)輸入圖像尺寸為32x100x3(HxWxC),經(jīng)過(guò)CNN轉(zhuǎn)換成1x25x512(HxWxC)。2.將CNN的輸出維度轉(zhuǎn)換為25個(gè)1x512的序列,送入深層雙向LSTM中,得到CRNN的輸出特征,維度轉(zhuǎn)換成為25xn(n是字符集合總數(shù))。OCR文字識(shí)別的解碼主要難點(diǎn)在于如何進(jìn)行輸入輸出的對(duì)齊。如上圖所示,如果每個(gè)1xn預(yù)測(cè)一個(gè)字符,那么可能會(huì)出現(xiàn)多個(gè)1xn預(yù)測(cè)同一個(gè)字符,這樣子得到的最終結(jié)果會(huì)產(chǎn)生重復(fù)字符。所以需要設(shè)計(jì)針對(duì)文字識(shí)別的解碼算法來(lái)解決輸入輸出的對(duì)齊問(wèn)題。 目前我了解到的主要有三種解碼方法,可以解決OCR解碼的一對(duì)多問(wèn)題,分別為CTC、Attention和ACE三種。CTC是最為經(jīng)典的OCR解碼算法,假設(shè)CRNN特征抽取器的輸出維度Txn,其中T=8,n包含blank(記作 - )字符(blank字符是間隔符,意思是前后字符不連續(xù))。對(duì)每一列1xn進(jìn)行softmax得到概率最大的字符,得到的最終序列需要去除連續(xù)的重復(fù)字符,比如最終得到的序列為-stt-ate,那么去重合并后就得到state序列。 那么state的序列概率就變成了所有去重合并后為state的字符序列概率之和,只要最大化字符序列概率,就可以優(yōu)化CRNN+CTC的文字識(shí)別算法。由于每個(gè)字符前后都可以插入blank,所以可以將所有可能狀態(tài)如下圖展開(kāi)。為了方便起見(jiàn),對(duì)于所有state序列的合法路徑做一些限制,規(guī)則如下: 1.轉(zhuǎn)換只能往右下方向,其它方向不允許4.起點(diǎn)必須從前兩個(gè)字符開(kāi)始5.終點(diǎn)必須落在結(jié)尾兩個(gè)字符根據(jù)上述約束規(guī)則,遍歷所有'state'序列的合法路徑,“state”的所有合法路徑如下圖所示:其中綠色框部分為起點(diǎn)和終點(diǎn),藍(lán)色箭頭為'state'序列的合法路徑。當(dāng)然可以通過(guò)枚舉所有路徑,然后求所有路徑的概率之和即為'state'序列的概率。但是枚舉所有路徑計(jì)算復(fù)雜度太高了,于是CTC引入了HMM的前向-后向算法來(lái)減少計(jì)算復(fù)雜度(可以參考一下我之前的回答,增加隱馬爾可夫模型(HMM)的理解)。 以前向算法為例(后向算法可以認(rèn)為是狀態(tài)序列的反轉(zhuǎn),計(jì)算方法相同),簡(jiǎn)單來(lái)說(shuō),就是利用分治和動(dòng)態(tài)規(guī)劃的思想,把8個(gè)時(shí)間點(diǎn)拆分成7個(gè)重復(fù)單元,然后先計(jì)算出第一個(gè)重復(fù)單元紅色虛線框中每個(gè)狀態(tài)的觀測(cè)概率,并且保存下來(lái)當(dāng)作下一個(gè)重復(fù)單元的初始狀態(tài),循環(huán)計(jì)算7次就得了最終的觀測(cè)概率。比起暴力求解觀測(cè)概率,復(fù)雜度大大降低。基于Attention的OCR解碼算法,把OCR文字識(shí)別當(dāng)成文字翻譯任務(wù),即通過(guò)Attention Decoder出文字序列。左圖是經(jīng)典的RNN結(jié)構(gòu),右圖是Seq2Seq結(jié)構(gòu)。RNN的輸入序列和輸出序列必須有相同的時(shí)間長(zhǎng)度,而機(jī)器翻譯以及文字識(shí)別任務(wù)都是輸入輸出不對(duì)齊的,不能直接使用RNN結(jié)構(gòu)進(jìn)行解碼。于是在Seq2Seq結(jié)構(gòu)中,將輸入序列進(jìn)行Encoder編碼成一個(gè)統(tǒng)一的語(yǔ)義向量Context,然后送入Decoder中一個(gè)一個(gè)解碼出輸出序列。在Decoder解碼過(guò)程中,第一個(gè)輸入字符為<start>,然后不斷將前一個(gè)時(shí)刻的輸出作為下一個(gè)時(shí)刻的輸入,循環(huán)解碼,直到輸出<stop>字符為止。 Seq2Seq -> Attention DecoderSeq2Seq把所有的輸入序列都編碼成一個(gè)統(tǒng)一的語(yǔ)義向量Context,然后再由Decoder解碼。由于context包含原始序列中的所有信息,它的長(zhǎng)度就成了限制模型性能的瓶頸。如機(jī)器翻譯問(wèn)題,當(dāng)要翻譯的句子較長(zhǎng)時(shí),一個(gè)Context可能存不下那么多信息,就會(huì)造成精度的下降。除此之外,如果按照上述方式實(shí)現(xiàn),只用到了編碼器的最后一個(gè)隱藏層狀態(tài),信息利用率低下。所以如果要改進(jìn)Seq2Seq結(jié)構(gòu),最好的切入角度就是:利用Encoder所有隱藏層狀態(tài)解決Context長(zhǎng)度限制問(wèn)題。于是Attention Decoder在Seq2Seq的基礎(chǔ)上,增加了一個(gè)Attention Layer,如上圖所示。 在Decoder時(shí),每個(gè)時(shí)刻的解碼狀態(tài)跟Encoder的所有隱藏層狀態(tài)進(jìn)行cross-attention計(jì)算,cross-attention將當(dāng)前解碼的隱藏層狀態(tài)和encoder的所有隱藏層狀態(tài)做相關(guān)性計(jì)算,然后對(duì)encoder的所有隱藏層加權(quán)求和,最后和當(dāng)前解碼的隱藏層狀態(tài)concat得到最終的狀態(tài)。這里的cross-attention計(jì)算方式也為后來(lái)的Transformer框架打下了基礎(chǔ)(詳細(xì)看我之前寫的文章計(jì)算機(jī)視覺(jué)'新'范式: Transformer)。 另外,從形式上看,Attention Decoder很自然的可以替換成最近非常流行的Transformer,事實(shí)上,最近也有幾篇基于Vision Transformer的文本識(shí)別算法。基于ACE的解碼方法不同于CTC和Attention,ACE的監(jiān)督信號(hào)實(shí)際上是一種弱監(jiān)督(輸入輸出沒(méi)有做形式上的對(duì)齊,沒(méi)有先后順序信息,傾向于學(xué)習(xí)表征),并且可以用于多行文字識(shí)別。 對(duì)于單行文字,假設(shè)輸出維度為Txn(T是序列長(zhǎng)度,n是字符集合總數(shù)),那么第k個(gè)字符出現(xiàn)的總數(shù)為 ,然后除以T,就能得到第k個(gè)字符出現(xiàn)的概率分布(記作 ),做相同計(jì)算,可以求出所有字符的概率分布,最后和label字符的概率分布計(jì)算交叉熵優(yōu)化網(wǎng)絡(luò)。同理,對(duì)于多行文字,只需要將HxW壓縮成T=HW,然后計(jì)算所有字符的概率分布即可。CTC/Attention/ACE三種解碼算法比較從模型設(shè)計(jì)上來(lái)看,可以采用結(jié)合上面3種方法的多任務(wù)文本識(shí)別模型。在訓(xùn)練時(shí),以CTC為主,Attention Decoder和ACE輔助訓(xùn)練。在預(yù)測(cè)時(shí),考慮到速度和性能,只采用CTC進(jìn)行解碼預(yù)測(cè)。多任務(wù)可以提高模型的泛化性,同時(shí)如果對(duì)預(yù)測(cè)時(shí)間要求不高,多結(jié)果也可以提供更多的選擇和對(duì)比。 上圖來(lái)源于微信OCR技術(shù)的比較: 1.CTC和ACE方法不需要額外的計(jì)算參數(shù),Attention需要額外的計(jì)算參數(shù)2.推理內(nèi)存,ACE < CTC < Attention;推理速度,ACE > CTC > Attention3.CTC效果更好一些,適合長(zhǎng)文本;Attention可以得到語(yǔ)言模型;ACE可以用于計(jì)數(shù)和2D預(yù)測(cè)由于Attention依賴于上一個(gè)預(yù)測(cè)結(jié)果,導(dǎo)致只能串行解碼,推理速度影響較大,但是可以得到語(yǔ)言模型做pretrain遷移使用;而CTC可以通過(guò)引入blank字符做形式上對(duì)齊,并且通過(guò)HMM前向-后向算法加速;ACE則直接不依賴順序信息,直接估計(jì)整體分布。三者各有利弊,實(shí)際使用時(shí),需要結(jié)合具體任務(wù)按需使用。[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 Recognitionhttps://zhuanlan.zhihu.com/p/43534801https://zhuanlan.zhihu.com/p/51383402覺(jué)得還不錯(cuò)就給我一個(gè)小小的鼓勵(lì)吧!
|