OCR性能優化:從認識BiLSTM網絡結構開始

摘要: 想要對OCR進行性能優化,首先要了解清楚待優化的OCR網絡的結構,本文從動機的角度來推演下基於Seq2Seq結構的OCR網絡是如何一步步搭建起來的。數據庫

本文分享自華爲雲社區《OCR性能優化系列(一):BiLSTM網絡結構概覽》,原文做者:HW007性能優化

OCR是指對圖片中的印刷體文字進行識別,最近在作OCR模型的性能優化,用 Cuda C 將基於TensorFlow 編寫的OCR網絡重寫了一遍,最終作到了5倍的性能提高。經過此次優化工做對OCR網絡的通用網絡結構和相關的優化方法有較深的認識,計劃在此經過系列博文記錄下來,也做爲對本身最近工做的一個總結和學習筆記。網絡

想要對OCR進行性能優化,首先要了解清楚待優化的OCR網絡的結構,在本文中我將嘗試着從動機的角度來推演下基於Seq2Seq結構的OCR網絡是如何一步步搭建起來的。機器學習

讀懂此文的前提只須要了解在矩陣乘法中矩陣的維度變化規律,即n*p的矩陣乘以 p*m 的矩陣等於 n*m 的矩陣。若是知道CNNRNN網絡的結構,對機器學習模型的構造套路有點了解的話更好。性能

首先給出從本文要剖析的OCR BILSTM 網絡整體結構以下圖:學習

接下來我將從這張圖的右上角(模型的輸出端)向左下角(模型的輸入端)逐步解釋每個結構的動機及其做用。優化

1. 構造最簡單的OCR網絡

首先考慮最簡單狀況下的OCR識別場景,假設輸入是隻含有一個文字圖片,圖片的高和寬均爲32個像素,即32*32的矩陣,爲了方便將其拉長即可獲得一個 1*1024 的矩陣。在輸出方面,因爲文字的特殊性,咱們只能將全部的文字進行標號,最後輸出所識別的文字的編號便好,由此獲得咱們的輸出是一個 1*1 的矩陣,矩陣元素的內容就是所識別的文字的編號。url

怎麼獲得這個1*1的矩陣呢?根據機率統計的套路,咱們假設全世界存在10000個文字,將其表爲1~1000號,那麼這10000個元素都有機率成爲咱們的輸出,所以咱們若是先算出這10000個文字做爲該輸入圖片的識別結果的機率的話,再挑機率最大的那個輸出即可以了。因而問題被轉變成如何從一個 1*1024的矩陣(X)中獲得一個 1*10000 的矩陣(Y)。在這裏即可以上機器學習模型結構中最多見的線性假設套路了,假設YX是之間是線性相關的,這樣即可獲得最簡單且經典的線性模型:Y = AX + B 其中稱X(維度:1*1024)爲輸入,Y(維度:1*10000)爲輸出,AB均爲該模型的參數,由矩陣乘法可知A的維度應該是 1024*1000B的維度應該是 1*10000。至此,只有X是已知的,咱們要計算Y的話還須要知道AB的具體值。在機器學習的套路中,做爲參數的AB的值在一開始是隨機設定的,而後經過喂大量的X及其標準答案Y來讓機器把這兩個參數AB慢慢地調整到最優值,此過程稱爲模型的訓練,喂進去的數據稱爲訓練數據。訓練完後,你即可以拿最優的A乘以你的新輸入X在加上最優的B獲得相應的Y了,使用argMax操做來挑選Y1*10000個數中最大的那個數的編號,就是識別出來的文字的編號了。spa

如今,再回頭去看圖1中右上角的那部分,相信你能看懂兩個黃色的 384*10000 1*10000的矩陣的含義了。圖中例子和上段文字描述的例子的區別主要在於圖中的輸入是1 1*1024的圖片,上段文字中的是 27 1*384的圖片罷了。至此,你已經瞭解如何構造一個簡單地OCR網絡了。接下來咱們就開始對這個簡單地網絡進行優化。.net

2. 優化策略一:減小計算量

在上面的文字描述的例子中,咱們每識別一個文字就要作一次 1*10241024*10000的矩陣乘法計算,這裏面計算量太大了,是否有一些計算是冗餘的呢?熟悉PCA的人應該立刻能想到,其實將 32*32 的文字圖片拉長爲 1*1024的矩陣,這個文字的特徵空間是1024維,即使每維的取值只有01兩種,這個特徵空間可表示的值都有2^1024種,遠遠大於咱們所假設的文字空間中全部文字個數10000個。爲此咱們能夠用PCA或各類降維操做把這個輸入的特徵向量降維到小於10000維,好比像圖中的128維。

3. 優化策略二:考慮文字間的相關性

(提醒:在上圖中爲了體現出batch Size的維度,是按27張文字圖片來畫的,下文中的討論均只針對1張文字圖片,所以下文中維度爲 1的地方均對應着圖中的27)

也許你已經注意到了,圖中與黃色的384*10000矩陣相乘的位置圖像特徵的維度沒有直接用一個1*384,而是 1*128+128+128)。其實這裏隱含着一個優化,這個優化是基於文字間的關聯假設的,簡單地例子就是若是前面一個字是,那其後面跟着的極可能是字,這種文字順序中的統計規律應該是能夠用來提高文字圖片的識別準確率的。那怎麼來實現這個關聯呢?

在圖中咱們能夠看到左側有一個10000*128的參數矩陣,很容易知道這個參數就像一個數據庫,其保存了全部10000個文字圖片通過加工後的特徵(所謂加工即是上面提到的降維,原始特徵應該是 10000*1024的),照圖中的結構,我須要輸入當前識別的這個字的前一個字的識別結果 (識別工做是一個字接一個字串行地識別出來的)。而後選擇出上個字對應的特徵矩陣 1*128,再通過一些加工轉換後當作1*384的輸入中的前1/3部份內容。

同理,1*384裏靠後的兩個1*128又表明什麼含義呢?雖然在句子中,前面一個字對後面一個字的影響很大,即便當前要預測的字在圖片中很模糊,我也能夠根據前面的字將其猜出來。那是否能夠根據其前k個字或者後k個字猜出來呢?顯然答案是確定的。所以靠後的兩個1*128分別表明的是句子圖片裏文字從前到後(Forward從後到前(Backward的圖片特徵對當前要識別的字的影響,所以圖中在前面加了個雙向LSTM網絡來生成這兩個特徵。

至此,改良版的OCR網絡輪廓基本出來了,還有一些細節上的問題須要解決。不知你是否注意到,按上面所述,1*384中包含了31*128的特徵,分別表明着前一個字對當前字的影響、圖片中的整個句子中各個文字從前到後(Forward)的排序對當前文字的影響、圖片中的整個句子中各個文字從後到前(Backward)的排序對當前文字的影響。

可是他們的特徵長度都是128!!!一個字是128,一個句子也是128?對於不一樣的文字圖片中,句子的長度還可能不同,怎麼可能都用一個字的特徵長度就表示了呢?

如何表示一個可變長的句子的特徵呢?乍一看的確是個很棘手的問題,好在它有一個很粗暴簡單的解決辦法,就是加權求和,又是機率統計裏面的套路,管你有幾種狀況,全部的狀況的機率求和後都得等於1。看到在這裏不知道是否被震撼到,變化不變」這樣看起來水火不容的兩個東西就是這麼神奇地共存了,這就是數學的魅力,讓人不由拍手贊絕!

下圖以一個實際的例子說明這種神奇的方式的運做方式。當咱們要對文字片斷中的字進行識別時,儘管改字已近被遮擋了部分,但根據平常生活中的一些經驗知識積累,要對該位置進行補全填空時,咱們聯繫上下文,把注意力放在上文中的是中國人和下文中的吃飯上。這個加權係數的機制即是用來實現這種注意力機制的。至於平常生活中的經驗這種東西就是由注意力機制網絡經過大量的訓練數據來學習獲得的。也就是圖1中的那32alpha的由來。注意力網絡在業界通常由GRU網絡擔任,因爲篇幅緣由,在此不展開了,下回有機會再細說。看官們只需知道在圖一的右邊還應該有個注意力網絡來輸出32alpha的值便好。

 

點擊關注,第一時間瞭解華爲雲新鮮技術~

相關文章
相關標籤/搜索