文字識別網絡學習—seq2seq+attention


  目前常用的文字識別網絡主要有兩種,一種是通過CRNN+CTC的方法(參見CRNN),一種是seq2seq+attention的方法。有說CTC方法優於seq2seq+attention的,但隨着attention機制的發展(self-attention, transformer),也許seq2seq+attention更有潛力,這里不做評價, 只是學習下seq2seq用於文字識別的思想。

1. seq2seq+attention模型介紹

  seq2seq+attention來源於NLP領域,簡要介紹下,詳細信息參考下面鏈接:

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

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

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

  seq2seq模型主要用於機器翻譯中,主要包括Encoder和Decoder兩部分,兩者都由循環神經網絡RNN, LSTM或者GRU構成,如下圖所示:序列[x1, x2, x3, x4]通過Encoder編碼成特征向量C, C再經過Decoder解碼成序列[y1, y2, y3], 這樣就完成了序列[x1, x2, x3, x4到序列[y1, y2, y3]的映射

  seq2seq的Attention機制如下, 對於Encoder輸出的特征向量C,經過attention模塊,得到C1, C2, C3, 然后分別送入Decoder模塊,其中Attention模塊為一個權重矩陣,目的是使C1, C2, C3關注原始序列中的不同特征,如C1更加關注[x1, x2], C2更加關注[x2, x3], C3更加關注[x3, x4]。(Attention權重矩陣的實現有很多方式,不詳細展開)

 2. seq2seq+attention用於文字識別

  下面兩篇華科的論文闡述了seq2seq用於文字識別的流程和方法,2018年ASTER是2016年RARE的改進版本,github上有兩個pytorch實現代碼可以參考學習下。

    ASTER:An Attentional Scene Text Recognizer with Flexible Rectification(2018, ASTER) (參考實現代碼:https://github.com/bgshih/aster,https://github.com/ayumiymk/aster.pytorch)

    Robust Scene Text Recognition with Automatic Rectification(2016, RARE) (參考實現代碼:https://github.com/bai-shang/crnn_seq2seq_ocr_pytorch)

  這里主要介紹下ASTER文章中的網絡結構,網絡主要包括兩部分:TPS文本矯正網絡,seq2seq+attention文本識別網絡。一張圖片先通過TPS對文本形變進行矯正,然后將矯正后的圖片送入seq2seq+attention進行文字識別,如下入所示:

 2.1 TPS文本矯正

  由於自然界中的文本並不一定是水平排列的,存在各種各樣的形變,如彎曲,旋轉,透視等變化,如下圖所示,所以需要一種變換來將其轉換為接近水平的文本,方便后續的識別。2015年的論文Spatial Transformer Network(STN)提出了一種空間變換網絡,可以通過模型學習到這種變換。這種變換中可以分為三大類:Aff仿射變換(affine transformation), Proj投影變換(project transformation), TPS薄板樣條變換(thin plate spline transormation), 這里論文中采用了TPS變換

   關於STN網絡參考:

    https://www.bilibili.com/video/BV1Ct411T7Ur?from=search&seid=9657204082977415895 (這個視頻講的很清楚)

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

    https://www.cnblogs.com/liaohuiqiang/p/9226335.html 

          Spatial Transformer Networks Tutorial (https://pytorch.org/tutorials/intermediate/spatial_transformer_tutorial.html)

  

  回到這篇論文里面,下圖是其整體的STN結構示意圖,包括Localisation net, Grid generator和Sampler三塊。

  Localisation net

    下面是論文中localisation net的卷積結構,可以發現其對輸入圖片先進行resize,然后進行卷積,最后得到20*2的矩陣,這20個坐標就是我們希望網絡能學習到的20個定位點(control points)。

  

   Grid generator

    如下圖左邊是輸入STN網絡的圖片,圖片上綠色十字點就表示我們希望localisation net網絡能學習到的20個定位點,得到這個20個定位點后,就該Grid generator發揮作用了。如圖右邊所示,Grid generator新建一個32*100的空白圖片,然后設置20個坐標點,和localisation net學出來的20個坐標點相對應,假設Input Image上學到的20個坐標點矩陣為A(20*2), Rectified Image上設置的20個坐標點為矩陣B(20*2),Rectified Image上所有點的坐標點為矩陣C(3200*2),由B和A之間的映射關系可以計算一種由B到A的變換函數F,通過變換函數F,可以計算出矩陣C中所有坐標點在Input Image上對應的坐標點,假設變換后的矩陣為D(3200*2),將其resize成32*100*2, 其中每一個值,表示該點對應的Input Image中的坐標點

  Sampler

  通過Grid generator可以得到一個32*100*2的矩陣坐標,如下圖所示,假設Recified Image為32*100*2的矩陣,a22的值為(1.6, 2.4),表示Recified Image上(2, 2)像素點對應着Input Image上(1.6, 2.4),由於是小數,因此在Input Image上取(1.6,2.4)最近的四個像素點(1,2), (1,3),(2,2),(2,3),采用雙線性插值法計算出(1.6, 2.4)的像素值,將Recified Image上(2, 2)處填充該像素值,依次處理整個Rectified Image,得到最終的圖片(32*100*3)

  2.2 seq2seq + attention文字識別網絡

  seq2seq+attention的網絡包括:encoder編碼網絡和decoder解碼網絡,其整體結構如下圖所示(左邊是流程示意圖,右邊是具體的網絡結構)。通過左邊流程圖,可以看到encoder網絡通過cnn提取圖片特征,BLSTM得到橫向序列, decoder利用LSTM和attention機制對序列進行解碼。右邊網絡結構可以看到encoder包括resnet+兩層BiLSTM,類似於CRNN的特征提取模塊,其中resnet模塊包括5個block(對Resnet50進行了修改)。

  seq2seq+attention的網絡的整體細節如下圖所示。在訓練階段,輸入圖片嗎3*32*100經過encoder得到編碼后的特征序列x (25*512),序列進入decoder會進行循環解碼。每一次循環中,序列x和上一次的隱藏層輸出state_prev進入attention模塊得到注意力權重alpha,alpha和序列x相乘得到context,context和上一次的output_prev進行concatenate后送入GRU得到新的state和output。在測試階段循環解碼是會有些不同,一般會用到beam search。

關於seq2seq的beam search,參考:

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

  https://zhuanlan.zhihu.com/p/36029811?group_id=972420376412762112

 

參考文章:

  https://www.cnblogs.com/Allen-rg/p/10072162.html (ASTER)

  https://zhuanlan.zhihu.com/p/183182208 (公式識別)

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM