<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          OCR文字識(shí)別-基于CTC/Attention/ACE的三大解碼算法

          共 4695字,需瀏覽 10分鐘

           ·

          2021-09-19 10:20

          本文全面梳理一下OCR文字識(shí)別三種解碼算法,先介紹一下什么是OCR文字識(shí)別,然后介紹一下常用的特征提取方法CRNN,最后介紹3種常用的解碼算法CTC/Attention/ACE。

          什么是OCR文字識(shí)別?

          一般來說,文字識(shí)別之前需要先對(duì)文字進(jìn)行定位(文字檢測(cè)主要有基于物體檢測(cè)和基于分割兩種方法),文字識(shí)別就是通過輸入文字圖片,然后解碼成文字的方法。本文主要講文字識(shí)別部分,文字識(shí)別主要分成三種類型:單字分類、整詞分類和整詞識(shí)別。當(dāng)能夠定位出單字時(shí),可以用圖像分類的方法直接對(duì)單字進(jìn)行分類;當(dāng)需要預(yù)測(cè)整詞數(shù)量較少時(shí),可以對(duì)整詞進(jìn)行分類;當(dāng)有大量整詞需要預(yù)測(cè)并且沒有單字定位時(shí),就需要用解碼序列的方法進(jìn)行識(shí)別了。因此,文字識(shí)別中最常用的是文字序列識(shí)別,適用場(chǎng)景更為廣泛。本文將主要介紹文字序列識(shí)別的解碼算法。

          OCR解碼是文字識(shí)別中最為核心的問題。本文主要對(duì)OCR的序列方法CTC、Attention、ACE進(jìn)行介紹,微信OCR算法就是參考這三種解碼算法的。

          不同的解碼算法的特征提取器可以共用,后面接上不同的解碼算法就可以實(shí)現(xiàn)文字識(shí)別了,以下用CRNN作為特征提取器。

          CRNN

          CRNN的特征抽取器由一個(gè)CNN和一個(gè)BiLSTM組成,其中BiLSTM使用的是stack形深層雙向LSTM結(jié)構(gòu)。

          CRNN特征提取器流程如下:

          1.假設(shè)輸入圖像尺寸為32x100x3(HxWxC),經(jīng)過CNN轉(zhuǎn)換成1x25x512(HxWxC)。

          2.將CNN的輸出維度轉(zhuǎn)換為25個(gè)1x512的序列,送入深層雙向LSTM中,得到CRNN的輸出特征,維度轉(zhuǎn)換成為25xn(n是字符集合總數(shù))。


          OCR文字識(shí)別的難點(diǎn)

          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í)別的解碼算法來解決輸入輸出的對(duì)齊問題。

          目前我了解到的主要有三種解碼方法,可以解決OCR解碼的一對(duì)多問題,分別為CTC、Attention和ACE三種。

          CTC

          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)如下圖展開。

          為了方便起見,對(duì)于所有state序列的合法路徑做一些限制,規(guī)則如下:

          1.轉(zhuǎn)換只能往右下方向,其它方向不允許

          2.相同的字符之間起碼要有一個(gè)空字符

          3.非空字符不能被跳過

          4.起點(diǎn)必須從前兩個(gè)字符開始

          5.終點(diǎn)必須落在結(jié)尾兩個(gè)字符

          根據(jù)上述約束規(guī)則,遍歷所有"state"序列的合法路徑,“state”的所有合法路徑如下圖所示:

          其中綠色框部分為起點(diǎn)和終點(diǎn),藍(lán)色箭頭為"state"序列的合法路徑。當(dāng)然可以通過枚舉所有路徑,然后求所有路徑的概率之和即為"state"序列的概率。但是枚舉所有路徑計(jì)算復(fù)雜度太高了,于是CTC引入了HMM的前向-后向算法來減少計(jì)算復(fù)雜度(可以參考一下我之前的回答,增加隱馬爾可夫模型(HMM)的理解)。

          以前向算法為例(后向算法可以認(rèn)為是狀態(tài)序列的反轉(zhuǎn),計(jì)算方法相同),簡單來說,就是利用分治和動(dòng)態(tài)規(guī)劃的思想,把8個(gè)時(shí)間點(diǎn)拆分成7個(gè)重復(fù)單元,然后先計(jì)算出第一個(gè)重復(fù)單元紅色虛線框中每個(gè)狀態(tài)的觀測(cè)概率,并且保存下來當(dāng)作下一個(gè)重復(fù)單元的初始狀態(tài),循環(huán)計(jì)算7次就得了最終的觀測(cè)概率。比起暴力求解觀測(cè)概率,復(fù)雜度大大降低。

          Attention

          基于Attention的OCR解碼算法,把OCR文字識(shí)別當(dāng)成文字翻譯任務(wù),即通過Attention Decoder出文字序列。

          RNN -> Seq2Seq

          左圖是經(jīng)典的RNN結(jié)構(gòu),右圖是Seq2Seq結(jié)構(gòu)。RNN的輸入序列和輸出序列必須有相同的時(shí)間長度,而機(jī)器翻譯以及文字識(shí)別任務(wù)都是輸入輸出不對(duì)齊的,不能直接使用RNN結(jié)構(gòu)進(jìn)行解碼。于是在Seq2Seq結(jié)構(gòu)中,將輸入序列進(jìn)行Encoder編碼成一個(gè)統(tǒng)一的語義向量Context,然后送入Decoder中一個(gè)一個(gè)解碼出輸出序列。在Decoder解碼過程中,第一個(gè)輸入字符為<start>,然后不斷將前一個(gè)時(shí)刻的輸出作為下一個(gè)時(shí)刻的輸入,循環(huán)解碼,直到輸出<stop>字符為止。

          Seq2Seq -> Attention Decoder

          Seq2Seq把所有的輸入序列都編碼成一個(gè)統(tǒng)一的語義向量Context,然后再由Decoder解碼。由于context包含原始序列中的所有信息,它的長度就成了限制模型性能的瓶頸。如機(jī)器翻譯問題,當(dāng)要翻譯的句子較長時(shí),一個(gè)Context可能存不下那么多信息,就會(huì)造成精度的下降。除此之外,如果按照上述方式實(shí)現(xiàn),只用到了編碼器的最后一個(gè)隱藏層狀態(tài),信息利用率低下。

          所以如果要改進(jìn)Seq2Seq結(jié)構(gòu),最好的切入角度就是:利用Encoder所有隱藏層狀態(tài)解決Context長度限制問題。于是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ì)算方式也為后來的Transformer框架打下了基礎(chǔ)(詳細(xì)看我之前寫的文章計(jì)算機(jī)視覺"新"范式: Transformer)。

          另外,從形式上看,Attention Decoder很自然的可以替換成最近非常流行的Transformer,事實(shí)上,最近也有幾篇基于Vision Transformer的文本識(shí)別算法。

          ACE

          基于ACE的解碼方法不同于CTC和Attention,ACE的監(jiān)督信號(hào)實(shí)際上是一種弱監(jiān)督(輸入輸出沒有做形式上的對(duì)齊,沒有先后順序信息,傾向于學(xué)習(xí)表征),并且可以用于多行文字識(shí)別。

          對(duì)于單行文字,假設(shè)輸出維度為Txn(T是序列長度,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ì)上來看,可以采用結(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ì)比。

          上圖來源于微信OCR技術(shù)的比較:

          1.CTC和ACE方法不需要額外的計(jì)算參數(shù),Attention需要額外的計(jì)算參數(shù)

          2.推理內(nèi)存,ACE < CTC < Attention;推理速度,ACE > CTC > Attention

          3.CTC效果更好一些,適合長文本;Attention可以得到語言模型;ACE可以用于計(jì)數(shù)和2D預(yù)測(cè)

          由于Attention依賴于上一個(gè)預(yù)測(cè)結(jié)果,導(dǎo)致只能串行解碼,推理速度影響較大,但是可以得到語言模型做pretrain遷移使用;而CTC可以通過引入blank字符做形式上對(duì)齊,并且通過HMM前向-后向算法加速;ACE則直接不依賴順序信息,直接估計(jì)整體分布。三者各有利弊,實(shí)際使用時(shí),需要結(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


          強(qiáng)烈推薦以下三篇blog

          https://zhuanlan.zhihu.com/p/43534801

          https://zhuanlan.zhihu.com/p/51383402

          https://xiaodu.io/ctc-explained/

          ···  END  ···
          一、Number(數(shù)字)
          全面掌握Python基礎(chǔ),這一篇就夠了,建議收藏
          Python基礎(chǔ)之?dāng)?shù)字(Number)超級(jí)詳解
          Python隨機(jī)模塊22個(gè)函數(shù)詳解
          Python數(shù)學(xué)math模塊55個(gè)函數(shù)詳解
          二、String(字符串)
          Python字符串的45個(gè)方法詳解
          Pandas向量化字符串操作
          三、List(列表)
          超級(jí)詳解系列-Python列表全面解析
          Python輕量級(jí)循環(huán)-列表推導(dǎo)式
          四、Tuple(元組)
          Python的元組,沒想象的那么簡單
          五、Set(集合)
          全面理解Python集合,17個(gè)方法全解,看完就夠了
          六、Dictionary(字典)
          Python字典詳解-超級(jí)完整版
          七、內(nèi)置函數(shù)
          Python初學(xué)者必須吃透這69個(gè)內(nèi)置函數(shù)!
          八、正則模塊
          Python正則表達(dá)式入門到入魔
          筆記 | 史上最全的正則表達(dá)式
          八、系統(tǒng)操作
          Python之shutil模塊11個(gè)常用函數(shù)詳解
          Python之OS模塊39個(gè)常用函數(shù)詳解
          九、進(jìn)階模塊
          【萬字長文詳解】Python庫collections,讓你擊敗99%的Pythoner
          高手如何在Python中使用collections模塊
          掃描關(guān)注本號(hào)↓


                                                      覺得有用給個(gè)在看吧 

          瀏覽 188
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  肏屄免费 | 亚洲一区二区三 | 男女啪啪18秘 免费网站 | 亚洲午夜无码久久 | 黄色成人视频 |