其中OCR識別的關鍵技術在於文字檢測和文本識別部分,這也是深度學習技術可以充分發揮功效的地方。
自然場景文字識別(Scene text detection)
01. Detecting Text in Fine-scale proposals
02. Recurrent Connectionist Text Proposals
04. Model outputs and loss function
什么是OCR?
OCR的全稱是"Optical Character Recognition".它利用光學技術和計算機技術讀取打印在紙上或寫在紙上的文字,並將其轉換為計算機和人都能理解的形式.
簡易OCR的過程
- 第一步,通過圖像信息采集(一般是相機),得到了一幅包含待識別字符的圖像,並對其結構進行了分析.
- 第二步,采用閾值運算等圖像處理方法對待測對象進行去噪,並校正待檢測的物體.
- 第三步,由於文本信息的特殊性,需要進行行和列分割用於檢測單個或連續的字符.
- 第四步,將分割后的字符圖像導入識別模型進行處理, 從而獲得原始圖像中的字符信息.
其中,OCR識別的關鍵技術在於文字檢測和文本識別部分,這也是深度學習技術可以充分發揮功效的地方。
自然場景文字識別(Scene text detection)
印刷字體的OCR技術現在已經相當成熟.騰訊Tim手機版自帶圖像文本提取功能;Microsoft Office lens具備掃描功能.雖然不能說100%正確,但基本上可以做到95%以上的打印字體識別基本可以完成.所以現在的技術關注更多的是"場景文本識別",表示在復雜的環境中進行字符識別.如下圖所示的兩種環境:
復雜場景的字符識別的操作主要包含兩步:文本檢測和文本識別.CTPN便是一種效果不錯的提取場景文本的算法,它可以檢測文本信息在自然環境中的位置.
在選擇圖像中的位置信息時,很容易想到用於目標檢測的R-CNN模型(從一副圖中尋找RoI).畢竟,近幾年中,談起圖像處理,人們會想到CNN.
基於這種處理方式,可以將"字符位置"進行標記,然后將截取的圖片放入CNN模型中進行處理? 然而,現實並非如此. 大量文本信息的文本、字體、位置等各種情況直接對R-CNN方法造成了干擾,造成了嚴重偏差。鑒於這種情況,CTPN便是通過結合CNN的優點,針對環境文本信息做出反應的模型.
CTPN 網絡結構
文本信息的字符是一個序列,是一個由"字符、部分字符、多字符"組成的序列。如下圖所示,待檢測的文本信息具備"序列"這樣的特征. 很顯然,基於這樣的特征,文本檢測識別的目標不同於一般的目標檢測,可以獨立的針對各個目標進行檢測.同時,基於"序列"的特征,會比較容易的想到利用上下文的語境,利用上下文確定文本的位置. 這自然會想到RNN系列的模型.
值得注意的是,作者認為預測文本水平方向的位置要比預測文本垂直方向的位置困難得多。
因此,在檢測過程中,可以引入數學上類似的"微分"思想。首先檢測一個固定寬度的小文本段。在后處理部分,將這些小文本段連接起來,得到一條文本行,如下圖所示。
通過將CNN和RNN,以及數學上"微分"的思想作用於處理文本。CTPN的網絡結構如下圖所示:
繪制結構圖:http://ethereon.github.io/netscope/#/editor
結構代碼:https://github.com/tianzhi0549/CTPN/blob/master/models/deploy.prototxt
具體操作可以划分為5步:
1. 首先,使用VGG-16模型中的前5個Conv獲得feature map,大小為N*C*W*H。VGG網絡結構如下圖所示,使用的網絡結構如紅色框體內。由於紅色框體內共包含4個池化操作,因此,此時輸出的feature map 為原圖的1/16。
2. 利用3*3滑動窗口從上一步得到的feature map中提取特征,生成3*3*C的特征向量。輸出N*9C*H*W的feature map。並利用這些特征預測多個anchor。這里anchor的定義與Faster-Rcnn中的相同。
3*3滑動窗口的操作如下圖所示,即提取每個點附近的9個臨近點,每行都如此處理,也就使得特征提取前后分辨率不發生變化。即feature map維度的變化如下:
3. 將上一步得到的特征輸入到Bi-LSTM中,輸出W*256的結果(128雙向整合結果),再將結果輸入到512維全連接層(FC)中。結構輸出節點數量可參照下圖。
這里會有一個轉換,就是如何將圖像形狀(N*9C*H*W)轉化為LSTM可以輸入的向量(一維向量)?如下圖im2col_transpose操作所示,將feature map(N*9C*H*W)進行reshape操作。
reshape的具體操作如下所示:
基於此,作者以NH=Batch,W作為LSTM的最大時間長度,9C作為LSTM網絡輸入節點的個數。此時,數據維度符合LSTM輸入的要求。
4. 最后,通過分類或回歸得到的輸出主要分為三個部分。根據網絡結構圖,從上到下依次為:
- vertical coordinates(2k):錨框的高度和中心點y軸坐標;
- scores (2k):錨框的類別得分,即表示當前錨框中包含的內容為是否是一個字符的得分。
- side-refinement (k):表示水平偏移量。
其中,k表示錨框的數量。在實驗中,錨框的水平寬度為16 像素,
這一部分是通過Faster R-CNN中的RPN網絡獲得text proposals,也就是上述三部分的過程。
5. 獲得text proposals后,使用文本構造算法,將得到的細長矩形合並到一個文本序列框中。
細節補充
01. Detecting Text in Fine-scale proposals
CTPN與RPN和Faster R-CNN主要區別在於引入了"微分"思想,即將候選區域切割成細小的條狀進行處理。其采用了一組(10個)等寬度的anchor,高度從11到283變化(by ÷0.7 each time)。寬、高可以清晰的表示為:
RPN與Fine-scale text proposals對比結果如下所示:
文獻中返回y軸坐標的方法如下所示,其中,*表示真實值;vc, vh表示預測的中心y坐標和高度,vc*,vh*表示Ground Truth;cya,ha表示anchor的中心y坐標和高度(pre-computed)。cy和h表示預測的中心y坐標和高度。
02. Recurrent Connectionist Text Proposals
該方法對應於前一個過程中"Bi-LSTM"的細節,上下文信息用於文本位置的定位。Bi-LSTM具有128個隱含層節點,輸入是由3*3的滑動窗口構成的3*3*C的特征,由於是雙向,最終形成256的輸出。如下圖所示:
使用RNN和不使用RNN的對比結果如下圖所示,第一行是不使用RNN的CTPN;第二行是使用RNN的CTPN。
03. side-refinement
side-refinement是最后的優化過程,通過合並和匯總已定位的"小矩形",得到所需文本信息的位置信息。即合並下圖中的紅色小矩形,最后生成一個黃色大矩形。"小矩形"是否保留直接通過有無文本信息的得分是否大於0.7來判斷。
對於將一系列紅色小矩形合並成最終的黃色大矩形的方法遵循以下規則(下面簡稱文本線構造方法):
因為它指定返回框的寬度為固定的16像素,所以它將導致一些位置錯誤。定義公式如下:
其中,*表示GroundTruth;Xside表示回歸的左/右邊界,cxa表示錨點中心的橫坐標,wa為16像素的固定寬度。所以O的定義相當於一個縮放比例,這有助於我們對回歸后的方框結果進行拉伸,從而更好地匹配實際文本的位置。對比圖如下,紅色方框為使用side-refinement,黃色方框為未使用side-refinement的結果:
04. Model outputs and loss function
輸出一共包含三個部分:
- 是否有文本的得分 2k
- 縱坐標 vc,vh 2k
- side-refinement的偏移量(o)k
因此,損失函數也包含三部分,一個分類損失,兩個回歸損失:
- anchor softmax loss: 針對每個anchor中是否包含文本。si*={0,1};
- anchor y坐標回歸損失: 針對包含文本的anchor y方向的偏移量;
- anchor x坐標回歸損失: 針對包含文本的anchor x方向的偏移量。
在整個過程中,該方法最大的兩點也是將RNN引入到文本檢測中,利用"微分"的思想來減少被檢測的誤差,以及使用定寬錨檢測多塊分割。最后一個合並序列是需要檢測的文本區域。CNN和RNN之間高效無縫的連接大大提高了准確率。實驗對比如下表所示: