1。 前言

文字識別就是將目標區域中包含的文字進行識別提取的過程。對於文字識別,CRNN+CTC的方法取得了很好的結果,它是白翔老師團隊2015年提出的方法,儘管已經過去了很久,但由於其準確率高,現在依然被廣泛地採用。本文將對其網路結構及原理進行介紹。

2。 網路結構

CRNN的網路結構如圖1 所示。可以從圖中看出,模型包括三個部分,分別稱作卷積層、迴圈層以及轉錄層。

快速理解文字識別模型CRNN

圖1 CRNN網路結構圖

卷積層由CNN構成,它的作用是從輸入的影象中提取特徵。提取的特徵圖將會輸入到接下來的迴圈層中,迴圈層由RNN構成,它將輸出對特徵序列每一幀的預測。最後轉錄層將得到的預測機率分佈轉換成標記序列,得到最終的識別結果,它實際上就是模型中的損失函式。透過最小化損失函式,訓練由CNN和RNN組成的網路。

2。1 卷積層

CRNN模型中的卷積層由一系列的卷積層、池化層、BN層構造而成。就像其他的CNN模型一樣,它將輸入的圖片轉化為具有特徵資訊的特徵圖,作為後面迴圈層的輸入。當然,為了使提取的特徵圖尺寸相同,輸入的影象事先要縮放到固定的大小。

由於卷積神經網路中卷積層和最大池化層的存在,使其具有平移不變性的特點。卷積神經網路中的感受野指的是經過卷積層輸出的特徵圖中每個畫素對應的原輸入影象區域的大小,它與特徵圖上的畫素從左到右,從上到下是一一對應的,如圖 2 所示。因此,可以將特徵圖作為影象特徵的表示。

快速理解文字識別模型CRNN

圖2 CNN的感受野

雖然卷積神經網路以其強大的優勢被廣泛應用到視覺領域中,但是由於其往往需要將輸入影象縮放到統一尺寸,所以對於那些尺寸變化較大的資料比如文字資訊便不能起到很好的效果。為此,在這裡模型在卷積層的後面添加了由RNN組成的迴圈層,用來更好地處理序列資訊。

CRNN的卷積層具體的網路結構如圖3 所示,它是在VGG網路的基礎上改造而成。卷積層對於VGG主要對兩個地方進行了改動:

將第2層和第3層的MaxPooling的卷積核的大小從

2\times 2

改成了

1\times2

這是為了最後提取的特徵圖可以輸入到迴圈層RNN中。從CRNN的結構圖可以看出,當圖片輸入CRNN之前,圖片的大小會統一放縮至

w\times32

,即長寬比保持不變,高度固定為32。假如有一張圖片的大小為

100\times 32

,裡面包含10個字元,那麼經過CRNN的卷積層後,將得到尺寸為

25\times1\times\rm{channels}

的特徵圖。忽略掉維度1,將該特徵圖轉化為大小為

25\times\rm{channels}

的輸出向量

z

。該向量的長度為25,每一個分量

z_i

的維度等於通道數,對應原輸入圖片的一塊矩形區域,可以表示對應該區域的提取特徵。處理後的向量

z

可作為迴圈層的輸入進行進一步的計算。

第5層和第6層的卷積層後面都添加了一個BN(Batch Normalization)層。因為BN層可以對輸入資料進行歸一化,加速網路的收斂速度。

快速理解文字識別模型CRNN

圖3 卷積層網路配置

2。2 迴圈層

在卷積層的後面,是由雙向遞迴神經網路(RNN)構成的迴圈層,它將卷積層得到的特徵序列

x=\left[x_{1}, x_{2}, \ldots, x_{T}\right]

中的每一個分量

x_i

都產生一個標籤分佈

y_i

。之所以要採用迴圈層,主要考慮了三點因素。第一,卷積層不能很好地提取序列的上下文資訊,而RNN恰好能解決這個問題。第二,經過迴圈層得到的誤差在反向傳播時可以傳回卷積層,所以迴圈層和卷積層可以共同訓練。第三,也是最重要的一點就是,RNN可以處理長短不一的序列,而這是卷積層所不具備的。

普通的RNN有很大的侷限性,比如如果序列過長會存在梯度消失或梯度爆炸的問題,這一方面限制了能捕獲的上下文資訊,同時也加大了訓練難度。所以這裡使用LSTM來代替傳統的RNN,他是RNN的一種變體,透過門機制將短時記憶和長時記憶結合到一次,在一定程度上解決了這問題。由於序列中的某個變數既和之前的資訊有關,也和它後面的資訊有關,所以使用雙向的LSTM能夠更加充分地利用上下文資訊,同時測試表明增加BiLSTM的層數可以有效的提升識別的準確率,這裡使用了兩層的BiLSTM,在實際應用當中可以根據自身的情況適當進行改變。

如果不瞭解LSTM的小夥伴可以參考下面我寫的另一篇文章。

待更新

卷積層得到的特徵序列經過迴圈層兩個BiLSTM的處理後,進一步結合了上下文的語義資訊,可以對圖片中的文字資訊進行更好地識別。這裡需要說明的是,由於卷積層的輸入的維度和LSTM的輸入並不完全相同,所以還需要構造線性層進行維度的轉換,作為卷積層和迴圈層的過渡,使其滿足迴圈層的輸入要求。

2。3 轉錄層

轉錄層的作用是將前面透過CNN層和RNN層得到的預測序列轉換成標記序列,得到最終的識別結果。簡單來說,就是選取預測序列中每個分量中機率最大的索引對應的符號作為識別結果,最終組成序列作為最終的識別序列。本文采用CTC中定義的條件機率來處理序列的轉換問題。

由於具體的原理涉及的內容較多,另寫了一篇文章進行了較詳細地說明,不瞭解的可以戳下面的連結進行閱讀。

實際在應用時,它對應的就是CRNN模型的損失函式。目前新版的pytorch已經集成了ctc演算法

torch。nn。CTCLoss

,不過之前的版本存在bug,不知道最新版有沒有修復;另一個常用的實現是百度開源的warp-ctc, 這個應該是沒問題的。

3。 總結

以上就是CRNN的全部內容,可以看到整體的模型結構還是比較簡潔的,但是實際的效果確實很不錯,這也是其提出了這麼長時間依然被廣泛使用的原因吧。另一種文字識別演算法是基於CNN+Attention的方法,感興趣的同學可以自己去了解。

最後,不要光收藏不點贊嘛,點個贊再走吧,寫文章不易,多多鼓勵~