目前常用的文字識別網絡主要有兩種,一種是通過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