您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“OCR性能優(yōu)化的方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“OCR性能優(yōu)化的方法”吧!
摘要: 想要對OCR進行性能優(yōu)化,首先要了解清楚待優(yōu)化的OCR網(wǎng)絡(luò)的結(jié)構(gòu),本文從動機的角度來推演下基于Seq2Seq結(jié)構(gòu)的OCR網(wǎng)絡(luò)是如何一步步搭建起來的。
OCR是指對圖片中的印刷體文字進行識別,最近在做OCR模型的性能優(yōu)化,用 Cuda C 將基于TensorFlow 編寫的OCR網(wǎng)絡(luò)重寫了一遍,最終做到了5倍的性能提升。通過這次優(yōu)化工作對OCR網(wǎng)絡(luò)的通用網(wǎng)絡(luò)結(jié)構(gòu)和相關(guān)的優(yōu)化方法有較深的認(rèn)識,計劃在此通過系列博文記錄下來,也作為對自己最近工作的一個總結(jié)和學(xué)習(xí)筆記。
想要對OCR進行性能優(yōu)化,首先要了解清楚待優(yōu)化的OCR網(wǎng)絡(luò)的結(jié)構(gòu),在本文中我將嘗試著從動機的角度來推演下基于Seq2Seq結(jié)構(gòu)的OCR網(wǎng)絡(luò)是如何一步步搭建起來的。
讀懂此文的前提只需要了解在矩陣乘法中矩陣的維度變化規(guī)律,即n*p的矩陣乘以 p*m 的矩陣等于 n*m 的矩陣。如果知道CNN和RNN網(wǎng)絡(luò)的結(jié)構(gòu),對機器學(xué)習(xí)模型的構(gòu)造套路有點了解的話更好。
首先給出從本文要剖析的OCR BILSTM 網(wǎng)絡(luò)總體結(jié)構(gòu)如下圖:
接下來我將從這張圖的右上角(模型的輸出端)向左下角(模型的輸入端)逐步解釋每一個結(jié)構(gòu)的動機及其作用。
首先考慮最簡單情況下的OCR識別場景,假設(shè)輸入是只含有一個文字圖片,圖片的高和寬均為32個像素,即32*32的矩陣,為了方便將其拉長便可得到一個 1*1024 的矩陣。在輸出方面,由于文字的特殊性,我們只能將所有的文字進行標(biāo)號,最后輸出所識別的文字的編號便好,由此得到我們的輸出是一個 1*1 的矩陣,矩陣元素的內(nèi)容就是所識別的文字的編號。
怎么得到這個1*1的矩陣呢?根據(jù)概率統(tǒng)計的套路,我們假設(shè)全世界存在10000個文字,將其表為1~1000號,那么這10000個元素都有概率成為我們的輸出,因此我們?nèi)绻人愠鲞@10000個文字作為該輸入圖片的識別結(jié)果的概率的話,再挑概率最大的那個輸出便可以了。于是問題被轉(zhuǎn)變成如何從一個 1*1024的矩陣(X)中得到一個 1*10000 的矩陣(Y)。在這里便可以上機器學(xué)習(xí)模型結(jié)構(gòu)中最常見的線性假設(shè)套路了,假設(shè)Y和X是之間是線性相關(guān)的,這樣便可得到最簡單且經(jīng)典的線性模型:Y = AX + B。 其中稱X(維度:1*1024)為輸入,Y(維度:1*10000)為輸出,A和B均為該模型的參數(shù),由矩陣乘法可知A的維度應(yīng)該是 1024*1000,B的維度應(yīng)該是 1*10000。至此,只有X是已知的,我們要計算Y的話還需要知道A和B的具體值。在機器學(xué)習(xí)的套路中,作為參數(shù)的A和B的值在一開始是隨機設(shè)定的,然后通過喂大量的X及其標(biāo)準(zhǔn)答案Y來讓機器把這兩個參數(shù)A、B慢慢地調(diào)整到最優(yōu)值,此過程稱為模型的訓(xùn)練,喂進去的數(shù)據(jù)稱為訓(xùn)練數(shù)據(jù)。訓(xùn)練完后,你便可以拿最優(yōu)的A乘以你的新輸入X在加上最優(yōu)的B得到相應(yīng)的Y了,使用argMax操作來挑選Y這1*10000個數(shù)中最大的那個數(shù)的編號,就是識別出來的文字的編號了。
現(xiàn)在,再回頭去看圖1中右上角的那部分,相信你能看懂兩個黃色的 384*10000 和 1*10000的矩陣的含義了。圖中例子和上段文字描述的例子的區(qū)別主要在于圖中的輸入是1張 1*1024的圖片,上段文字中的是 27張 1*384的圖片罷了。至此,你已經(jīng)了解如何構(gòu)造一個簡單地OCR網(wǎng)絡(luò)了。接下來我們就開始對這個簡單地網(wǎng)絡(luò)進行優(yōu)化。
在上面的文字描述的例子中,我們每識別一個文字就要做一次 1*1024和1024*10000的矩陣乘法計算,這里面計算量太大了,是否有一些計算是冗余的呢?熟悉PCA的人應(yīng)該馬上能想到,其實將 32*32 的文字圖片拉長為 1*1024的矩陣,這個文字的特征空間是1024維,即便每維的取值只有0和1兩種,這個特征空間可表示的值都有2^1024種,遠(yuǎn)遠(yuǎn)大于我們所假設(shè)的文字空間中所有文字個數(shù)10000個。為此我們可以用PCA或各種降維操作把這個輸入的特征向量降維到小于10000維,比如像圖中的128維。
(提醒:在上圖中為了體現(xiàn)出batch Size的維度,是按27張文字圖片來畫的,下文中的討論均只針對1張文字圖片,因此下文中維度為 1的地方均對應(yīng)著圖中的27)
也許你已經(jīng)注意到了,圖中與黃色的384*10000矩陣相乘的“位置圖像特征”的維度沒有直接用一個1*384,而是 1*(128+128+128)。其實這里隱含著一個優(yōu)化,這個優(yōu)化是基于文字間的關(guān)聯(lián)假設(shè)的,簡單地例子就是如果前面一個字是“您”,那其后面跟著的很可能是“好”字,這種文字順序中的統(tǒng)計規(guī)律應(yīng)該是可以用來提升文字圖片的識別準(zhǔn)確率的。那怎么來實現(xiàn)這個關(guān)聯(lián)呢?
在圖中我們可以看到左側(cè)有一個10000*128的參數(shù)矩陣,很容易知道這個參數(shù)就像一個數(shù)據(jù)庫,其保存了所有10000個文字圖片經(jīng)過加工后的特征(所謂加工便是上面提到的降維,原始特征應(yīng)該是 10000*1024的),照圖中的結(jié)構(gòu),我需要輸入當(dāng)前識別的這個字的前一個字的識別結(jié)果 (識別工作是一個字接一個字串行地識別出來的)。然后選擇出上個字對應(yīng)的特征矩陣 1*128,再經(jīng)過一些加工轉(zhuǎn)換后當(dāng)做1*384的輸入中的前1/3部分內(nèi)容。
同理,1*384里靠后的兩個1*128又代表什么含義呢?雖然在句子中,前面一個字對后面一個字的影響很大,即使當(dāng)前要預(yù)測的字在圖片中很模糊,我也可以根據(jù)前面的字將其猜出來。那是否可以根據(jù)其前k個字或者后k個字猜出來呢?顯然答案是肯定的。因此靠后的兩個1*128分別代表的是句子圖片里文字“從前到后(Forward)”和“從后到前(Backward)”的圖片特征對當(dāng)前要識別的字的影響,因此圖中在前面加了個“雙向LSTM網(wǎng)絡(luò)”來生成這兩個特征。
至此,改良版的OCR網(wǎng)絡(luò)輪廓基本出來了,還有一些細(xì)節(jié)上的問題需要解決。不知你是否注意到,按上面所述,1*384中包含了3個1*128的特征,分別代表著前一個字對當(dāng)前字的影響、圖片中的整個句子中各個文字從前到后(Forward)的排序?qū)Ξ?dāng)前文字的影響、圖片中的整個句子中各個文字從后到前(Backward)的排序?qū)Ξ?dāng)前文字的影響。
但是他們的特征長度都是128?。?!一個字是128,一個句子也是128?對于不同的文字圖片中,句子的長度還可能不一樣,怎么可能都用一個字的特征長度就表示了呢?
如何表示一個可變長的句子的特征呢?乍一看的確是個很棘手的問題,好在它有一個很粗暴簡單的解決辦法,就是加權(quán)求和,又是概率統(tǒng)計里面的套路,管你有幾種情況,所有的情況的概率求和后都得等于1??吹皆谶@里不知道是否被震撼到,“變化”和“不變”這樣看起來水火不容的兩個東西就是這么神奇地共存了,這就是數(shù)學(xué)的魅力,讓人不禁拍手贊絕!
下圖以一個實際的例子說明這種神奇的方式的運作方式。當(dāng)我們要對文字片段中的“筷”字進行識別時,盡管改字已近被遮擋了部分,但根據(jù)日常生活中的一些經(jīng)驗知識積累,要對該位置進行補全填空時,我們聯(lián)系上下文,把注意力放在上文中的“是中國人”和下文中的“吃飯”上。這個加權(quán)系數(shù)的機制便是用來實現(xiàn)這種注意力機制的。至于“日常生活中的經(jīng)驗”這種東西就是由“注意力機制網(wǎng)絡(luò)”通過大量的訓(xùn)練數(shù)據(jù)來學(xué)習(xí)得到的。也就是圖1中的那32個alpha的由來。注意力網(wǎng)絡(luò)在業(yè)界一般由GRU網(wǎng)絡(luò)擔(dān)任,由于篇幅原因,在此不展開了,下回有機會再細(xì)說??垂賯冎恍柚涝趫D一的右邊還應(yīng)該有個“注意力網(wǎng)絡(luò)”來輸出32個alpha的值便好。
到此,相信大家對“OCR性能優(yōu)化的方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。