论文阅读 - CRNN
文章目錄
- 1 概述
- 2 模型介紹
- 2.1 輸入
- 2.2 Feature extraction
- 2.3 Sequence modeling
- 2.4 Transcription
- 2.4.1 訓(xùn)練部分
- 2.4.2 預(yù)測部分
- 3 模型效果
- 參考資料
1 概述
CRNN(Convolutional Recurrent Neural Network)是2015年華科的白翔老師團(tuán)隊提出的,直至今日,仍舊是文本識別領(lǐng)域最常用也最好用的方法。CRNN主要由三部分組成,分別是feature extraction,sequence modeling和transcription,如下圖1-1所示。
feature extraction用于按寬度抽取圖像特征,sequence modeling用于融合這些特征并輸出label的預(yù)測分布,transcription用于將這個特征序列轉(zhuǎn)化為文本。
CRNN強(qiáng)大的地方就是它只是一個框架,其中的feature extraction和sequence modeling部分都是可以替換成不同的模型的,比如feature extraction部分,可以換成任意的抽取圖像特征的模型,想要追求性能就換成小模型,想要追求效果就換成大模型,非常靈活。
2 模型介紹
2.1 輸入
輸入是一般是文本檢測的輸出,一個長條形的圖片,是橫向長條的,因為我們的文字都是橫著寫的。而且這一長條里只能有一行文字,不能多行。多行就得要切成多個單行的長條分別輸入。
文本有一些傾斜問題不大,但最好是在文本檢測部分調(diào)整,即在文本檢測部分檢測多邊形,再仿射變換成長條形,使得文本部分不傾斜。也有論文提出在CRNN的前面前置一個STN。STN要真的有效,需要有好的訓(xùn)練數(shù)據(jù)。就算有好的數(shù)據(jù),也降低了模型的總體性能,增大了模型的訓(xùn)練難度。STN可以看成一個極簡版的物體檢測模塊。
輸入的尺寸一般為h×w×c=32×280×3h \times w \times c = 32 \times 280 \times 3h×w×c=32×280×3,不是這個尺寸的就resize and pad成這個尺寸,盡量不要只resize,這會使得文字變形。輸入尺寸www會根據(jù)需求做調(diào)整,如果文本都是短文本,則可以考慮w=100w=100w=100。
2.2 Feature extraction
Feature extraction就是對32×280×332 \times 280 \times 332×280×3的輸入進(jìn)行特征抽取的一個deep convolutional neural networks,輸出1×w/4×d=1×70×5121 \times w/4 \times d=1 \times 70 \times 5121×w/4×d=1×70×512的向量。w/4w/4w/4表示對32×432 \times 432×4的一小塊圖片區(qū)域抽取一個512維的特征。這一小塊區(qū)域被稱為receptive field(感受野),或是幀。
幀的尺寸是可以變的,輸出的特征維度也是可以變的,這些都是超參數(shù)。也正是因為CRNN這種抽取特征的方式,使得它沒法辦法處理豎向的文本,所有高度上的像素都被壓到一個特征里了,分不開了。幀的尺寸決定了模型的精度,比如有兩個文字完全都在同一幀內(nèi),那模型就沒法把這兩個文字分開了,識別就有問題了。
要處理豎向的文本,需要訓(xùn)練一個識別文本方向的分類網(wǎng)絡(luò),然后根據(jù)文本的方向?qū)ωQ向的文本進(jìn)行旋轉(zhuǎn)或者切片拼接等不同的操作。目的就是變成CRNN可以處理的輸入。
2.3 Sequence modeling
我們令feature extraction部分的輸出為x=x1,x2,...,xT\bold{x}=x_1, x_2, ..., x_Tx=x1?,x2?,...,xT?,T=70T=70T=70,xtx_txt?表示第ttt幀的特征,為一個512維的向量。假設(shè)字典的長度為NNN,Sequence modeling就是一個雙向的LSTM,輸出y=y1,..,yT\bold{y} = y_1, .., y_Ty=y1?,..,yT?,yty_tyt?表示第iii幀為每個字典中字符的概率,是一個N+1N+1N+1維的向量。
Sequence modeling部分的總輸出是一個T×(N+1)T \times (N+1)T×(N+1)的概率圖。
使用雙向LSTM的好處是:
(1)文本是一個序列,抽取特征的CNN模型只能看到附近幾幀的圖片特征,而雙向LSTM可以融合更遠(yuǎn)的特征,使得模型看到完整的整個字;
(2)LSTM可以和CNN使用Back-Propagation Through Time (BPTT)的方法拼接起來一起訓(xùn)練;
(3)LSTM可以處理任意長度的輸入。
2.4 Transcription
這部分是使用CTC來做的,它在訓(xùn)練和預(yù)測時有著不同的處理方法。2.3中的y\bold{y}y之所以維度為N+1N+1N+1就是因為CTC需要一個空白符"?\phi?"。CTC的對齊基于兩個規(guī)則:
(1)先合并所有的重復(fù)字符;
(2)再刪除所有的空白符。
比如,下面兩個序列s\bold{s}s經(jīng)過對齊之后,都是"Hello"。
H?eee?lll???lll?ooHee??lll??llll?oooH \phi eee \phi lll \phi\phi\phi lll \phi oo \\ H ee \phi\phi lll \phi\phi llll \phi ooo H?eee?lll???lll?ooHee??lll??llll?ooo
2.4.1 訓(xùn)練部分
訓(xùn)練時,我們是知道文本標(biāo)簽的。
假設(shè)我們的訓(xùn)練數(shù)據(jù)為{Ii,li}\{\bold{I}_i, \bold{l}_i\}{Ii?,li?},Ii\bold{I}_iIi?為第iii張訓(xùn)練圖片,li\bold{l}_ili?為第iii張圖片的文本標(biāo)簽,yi\bold{y}_iyi?為第iii張圖片的預(yù)測概率圖(序列都用粗體進(jìn)行了表示)。我們的目標(biāo)就是
argmin??∑ilogp(li∣yi)(2-1)arg\min -\sum_{i} log p(\bold{l}_i|\bold{y}_i) \tag{2-1} argmin?i∑?logp(li?∣yi?)(2-1)
其中,p(li∣yi)p(\bold{l}_i|\bold{y}_i)p(li?∣yi?)表示用概率圖yi\bold{y}_iyi?得到文本序列li\bold{l}_ili?的概率。
p(li∣yi)=∑s:B(s)=lip(s∣yi)(2-2)p(\bold{l}_i|\bold{y}_i) = \sum_{\bold{s} : \Beta(\bold{s})=\bold{l}_i} p(\bold{s}|\bold{y}_i) \tag{2-2} p(li?∣yi?)=s:B(s)=li?∑?p(s∣yi?)(2-2)
s\bold{s}s表示可以變成文本l\bold{l}l的一條路徑,B(s)\Beta(\bold{s})B(s)表示對s\bold{s}s進(jìn)行CTC對齊操作。p(li∣yi)p(\bold{l}_i|\bold{y}_i)p(li?∣yi?)也就是所有可以從s\bold{s}s變?yōu)?span id="ze8trgl8bvbq" class="katex--inline">li\bold{l}_ili?的路徑概率和。
p(s∣yi)=∏t=1Tystt(2-3)p(\bold{s}|\bold{y}_i) = \prod_{t=1}^T y_{s_t}^t \tag{2-3} p(s∣yi?)=t=1∏T?yst?t?(2-3)
要找到所有可以從s\bold{s}s變?yōu)?span id="ze8trgl8bvbq" class="katex--inline">li\bold{l}_ili?的路徑,用枚舉法是不行的,這里一般會用HMM中的前向后向算法,也就是動態(tài)規(guī)劃。
2.4.2 預(yù)測部分
預(yù)測時,我們是不知道文本標(biāo)簽的。
這個時候要去計算所有可能的文本序列的概率,再找到最大的,簡直無法想象。所以預(yù)測時,我們只能寄希望于模型訓(xùn)練的足夠好,每一幀都預(yù)測得很準(zhǔn)。然后用greedy search或者beam search的方法來找到最有路徑。
greedy search是實際最常用的方法,就是取每幀概率最大的標(biāo)簽。
beam search是在每幀去概率最大的前n條路徑,一直保留n條概率最大的路徑,直到最后一幀,當(dāng)n取1時,beam search就退化為greedy search。
以上說的都是只有字典的情況,當(dāng)我們有詞表lexicon時,我們可以根據(jù)結(jié)果,取編輯距離小于δ\deltaδ的所有詞,然后再看取這些詞時,概率最大的是哪個詞,以此確定最終的輸出。
3 模型效果
作者還對比了不同數(shù)據(jù)集下,CRNN對比其他模型的效果,不過這都是2015年的時候的了,看看即可。
不如看下百度開源的paddle-ocr里的對比結(jié)果。CRNN雖然不是準(zhǔn)確率最高的,但是是paddle-ocr最推薦的算法。它的效果和性能的綜合優(yōu)勢是最高的。
參考資料
[1] An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition
[2] 一文讀懂CRNN+CTC文字識別
[3] PaddleOCR
總結(jié)
以上是生活随笔為你收集整理的论文阅读 - CRNN的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Web框架——Flask系列之Flask
- 下一篇: javaweb 常用jar包_使用jav