楊艷華
(集美大學(xué) 計算機工程學(xué)院,福建 廈門 361021)
文字識別在信件包裹的分揀、統(tǒng)計報表的錄入分析、各類證件識別、車牌識別、道路識別等實際場景中有著廣泛的應(yīng)用。如何讓計算機高效地理解圖片上的文字信息,尤其是印刷體漢字信息,是文字識別領(lǐng)域的重要問題。
印刷體漢字識別技術(shù)源于國外,最早是1966年由美國的IBM公司運用模板匹配法完成了1000個印刷體漢字的識別[1]。20世紀70年代末,我國開始漢字識別的研究,從最初的僅局限于有限的、規(guī)則漢字的識別,到利用計算機實現(xiàn)對各種文字、各種印刷體和復(fù)雜圖文版面的自動識別和理解,經(jīng)過幾十年的深入研究,已經(jīng)取得了豐碩的成果[2-3]。然而,由于漢字內(nèi)部結(jié)構(gòu)復(fù)雜、字體多樣、字符筆畫相似度高等特點,使得對其識別研究工作仍然面臨巨大的挑戰(zhàn)。
2006年,加拿大學(xué)者杰弗里·辛頓和他的學(xué)生魯斯蘭提出深度學(xué)習(xí)的概念,近幾年其在語音識別、文本檢測和識別、圖像識別等多類應(yīng)用中取得了顯著的進展。深度學(xué)習(xí)以原始樣本數(shù)據(jù)為基礎(chǔ),通過特定的訓(xùn)練方法得到一個由多個非線性處理層構(gòu)成的深度網(wǎng)絡(luò)的機器學(xué)習(xí)過程[4],它是人工神經(jīng)網(wǎng)絡(luò)的一種延伸,通過低級到高級逐層提取數(shù)據(jù)特征的過程找到所述特征數(shù)據(jù)的分布式表示。與傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)不同,深度神經(jīng)網(wǎng)絡(luò)采用自下而上的無監(jiān)督學(xué)習(xí)特征的方式來優(yōu)化網(wǎng)絡(luò)權(quán)重的初值,然后再自頂而下對權(quán)重進行微調(diào),這樣就避免了局部最小值的收斂問題[5]。卷積神經(jīng)網(wǎng)絡(luò)(convolutional neural network,CNN)是常見的深度神經(jīng)網(wǎng)之一,比較適合二維圖像的處理。
卷積神經(jīng)網(wǎng)絡(luò)自動提取輸入的原始圖像的特征,它提取的特征不受旋轉(zhuǎn)、平移和縮放等形變的影響,被廣泛應(yīng)用在文字識別上。2012年Ciregan等人在文獻[6]中提出了一種多列卷積神經(jīng)網(wǎng)絡(luò)模型,該模型對脫機手寫體漢字的識別率達到了93.50%,但該樣本庫只包含手寫體漢字,且網(wǎng)絡(luò)模型較復(fù)雜,參數(shù)調(diào)整難度大。2013年Lan Goodfellow提出的基于CNN模型的算法將文字定位、分割和識別結(jié)合在一起,能夠不受約束地識別自然照片中的字符[7],然而該模型需要提前選定可預(yù)測序列的最大長度,且對字體的大小和文字的質(zhì)量要求較高,當(dāng)字符數(shù)量較多時算法性能顯著下降。文獻[8]采用多尺度滑動窗提取文字特征,再結(jié)合深度神經(jīng)網(wǎng)絡(luò)的方法對印刷體漢字進行識別,該方法需要進行繁瑣的特征提取和降維預(yù)處理。Shi等[9]提出CRNN(convolution recurrent neural network)模型,通過深度卷積神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)文字特征,再結(jié)合BiLSTM(bi-directional long shot-term memory)循環(huán)網(wǎng)絡(luò)預(yù)測序列標(biāo)簽,在文字識別率上有極大的提高,然而該模型需要占用更多的內(nèi)存空間等資源,且訓(xùn)練時間較長。
上述這些方法都不能很好地解決印刷體漢字識別的應(yīng)用問題。因此,本文定義了一種改進的卷積神經(jīng)網(wǎng)絡(luò)模型對多字體印刷體漢字進行訓(xùn)練分類。為了獲得大規(guī)模訓(xùn)練的樣本數(shù)據(jù),避免過擬合現(xiàn)象出現(xiàn),采用了多種數(shù)據(jù)增廣方式;為有效緩解訓(xùn)練中數(shù)據(jù)分布改變的情況、加快網(wǎng)絡(luò)收斂速度,并對中間數(shù)據(jù)進行批標(biāo)準(zhǔn)化(batch normalization,BN)處理。此外,為了更好地優(yōu)化網(wǎng)絡(luò)的訓(xùn)練過程,運用了自適應(yīng)矩估計(adaptive moment estimation,Adam)優(yōu)化算法。通過一系列實驗,驗證了本文定義的模型在多字體印刷體漢字識別中的有效性。
模型的訓(xùn)練需要足夠大量的數(shù)據(jù),本文對國標(biāo)一級字庫共3755個漢字進行識別,使用一系列措施增加訓(xùn)練樣本。訓(xùn)練樣本數(shù)據(jù)是用Python和OpenCV編寫程序讓計算機自動生成的單個漢字圖像。為進一步增強泛化能力,本文對每個漢字生成了黑體、仿宋、隸書、幼圓、華文隸書、華文細黑、華文新魏、方正姚體、方正粗黑宋簡體等十二種字體的圖片,同時再設(shè)置±30°的旋轉(zhuǎn)角度,使用Python中 PIL(python image library)庫的Image模塊中的漢字生成函數(shù)生成字體源圖片。源圖片生成過程如圖1所示。
圖1 字體源圖片生成流程
上述每種字體只生成了一張圖片,單個漢字只有12張圖片,這樣的數(shù)量還遠遠不夠。因此,需要在該數(shù)據(jù)集上進行數(shù)據(jù)增廣,以擴充訓(xùn)練數(shù)據(jù)集。本文采用的數(shù)據(jù)增廣方法具體如下。
(1)扭曲增廣,是對原圖像做透視變換,用一個3×3的變換矩陣進行矩陣乘法運算來變換原圖像的坐標(biāo),透視變換矩陣如式(1)
其中,A為變換矩陣,如式(2)
對圖像進行扭曲操作,就是對像素坐標(biāo)進行透視變換。令a33=1,源像素點坐標(biāo)(x,y)經(jīng)變換后的目標(biāo)點坐標(biāo)(X',Y')的計算公式如式(3)和式(4)。
先求出變換矩陣A,需要給出源圖像的4個固定點(xi,yi)(i=1,2,3,4)和目標(biāo)圖像的4個固定點(X'j,Y'j)(j=1,2,3,4),調(diào)用 OpenCV的 cv. getPerspectiveTransform()函數(shù)求解矩陣 A,再使用 cv.wrapPerspective()函數(shù)實現(xiàn)扭曲操作。
(2)噪點增加,先設(shè)置添加的椒鹽噪聲比例20%~30%,然后再調(diào)用隨機函數(shù)np.random.randint()生成噪聲點的坐標(biāo),最后將該坐標(biāo)點的像素賦值為噪聲像素值。
(3)波紋變換,通過改變正弦函數(shù)x=Asin(2πx/T)和余弦函數(shù)y=Acos(2πy/T)的幅值 A、周期T等參數(shù)實現(xiàn)。
(4)腐蝕和膨脹,通過一個3×3的正方形蒙板內(nèi)核對源圖像進行卷積運算。膨脹和腐蝕運算分別如式(5)和式(6)。
其中膨脹運算時,A是源圖像,B是蒙板內(nèi)核,先求出B關(guān)于其中心點的反射集合B,再用B在圖像A上平移y,如果的像素與A至少有一個像素相交,則保留中心點對應(yīng)的像素點,以達到邊界外擴的效果,調(diào)用cv.dilate()函數(shù)實現(xiàn)。腐蝕運算時,用B在圖像A上平移y,如果B的中心點對應(yīng)的像素完全相同,則保留A圖上的像素點,否則全部刪除,以達到邊界內(nèi)收的效果,調(diào)用cv.erode()函數(shù)實現(xiàn)。
以“啊”字為例,數(shù)據(jù)增廣后的示例如圖2所示。本文一共生成5 497 320張100×100像素大小的樣本圖片,抽取其中的20%構(gòu)成test集合,剩下的構(gòu)成train集合。
圖2 數(shù)據(jù)增廣后的示例
在經(jīng)典LeNet-5模型基礎(chǔ)上,本文通過增加卷積層和池化層,擴展得到的印刷體漢字識別網(wǎng)絡(luò)模型結(jié)構(gòu)如圖3所示,主要由5個卷積層、4個池化層、2個全連接層和一個Softmax回歸層組成。
圖3 深度卷積神經(jīng)網(wǎng)絡(luò)模型
整個模型進行特征提取和分類的過程如下:
(1)輸入層是一幅100×100像素大小的漢字樣本圖片。
(2)卷積層使用了3×3的卷積核對圖片進行固定步長的卷積操作,通過圖片像素和卷積核權(quán)重值做乘法,并逐層增加卷積核深度,得到相應(yīng)的特征輸出。卷積操作的計算如式(7)。
(3)接入2×2的正方形池化窗口的最大池化層,取圖像每個窗口區(qū)域的最大值,避免過擬合現(xiàn)象,并簡化整個網(wǎng)絡(luò)的計算復(fù)雜度。計算過程如式(8)。
其中,N是池化窗口大小,u(n,n)為池化窗口。
以上(2)~(3)的一系列卷積和池化操作后,得到512幅4×4像素大小的特征圖。
(4)經(jīng)過兩個全連接層將圖片不同位置的特征進行整合后,接入Softmax層分類輸出。對于有K類分類的情況,設(shè)每類有n個樣本的訓(xùn)練集合為{(x(1),y(1)),(x(2),y(2)),…,(x(n),y(n))},其中,x(i)為特征向量,y(i)∈{1,2,…,K}為樣本類別標(biāo)簽。首先,定義回歸函數(shù)如式(9)。
其中,wk為第k類的模型參數(shù)。
然后,計算每個樣本的所屬類別概率p(y(i)=k|x(i);w1,…,wK)。用一個K維的標(biāo)簽向量表示這k類概率值,即樣本x(i)概率為。 其中,y(i)=(yi1,…,yik,…,yiK)T為 x 的標(biāo)簽向量。 注意,在式(9)中采用對概率分布進行歸一化處理,使得所有概率之和為1。
接著用極大似然估計法估計模型參數(shù)wi,定義目標(biāo)函數(shù)如式(10)。
用Adam優(yōu)化算法求該目標(biāo)函數(shù)的最優(yōu)解,并在傳播中不斷調(diào)整網(wǎng)絡(luò)權(quán)值,實現(xiàn)訓(xùn)練。
兩個全連接層分別采用1 024個神經(jīng)元和3 755個神經(jīng)元提取輸入圖片高層特征表示,整個網(wǎng)絡(luò)的參數(shù)有16 200 208個。完整網(wǎng)絡(luò)配置參數(shù)如表1所示。
表1 網(wǎng)絡(luò)配置的詳細參數(shù)
由于本文模型層次較深,因此在所有卷積層和全連接層之后都加入了批標(biāo)準(zhǔn)化處理層,這樣可以有效糾正中間輸入分布的偏移情況,加速模型收斂。設(shè)每一層的輸入是一個d維向量,即x=(x(1),x(2),…,x(d)),并且一個mini-batch包含有m個訓(xùn)練實例,即B={x1,….,xm}。BN的處理過程如下:
(1)對每一個輸入激活x(k)進行變換。首先計算mini-batch的平均值和方差,然后進行變換。 經(jīng)過這一變換后,每個輸入激活就形成了均值為0,方差為1的正態(tài)分布。
從表1的配置可知,本文網(wǎng)絡(luò)中BN層設(shè)置在激活函數(shù)之前,并且BN層也采用共享權(quán)重的策略,把一張?zhí)卣鲌D當(dāng)做一個神經(jīng)元處理。則整個網(wǎng)絡(luò)隱藏層前向傳播算法的計算如式(11)。
其中:W、b分別為當(dāng)前層的權(quán)重和偏置;g(·)為激活函數(shù);u為BN層的輸入;z為當(dāng)前層的輸出。
本文實驗系統(tǒng)是基于TensorFlow[10]深度學(xué)習(xí)框架,用Python語言構(gòu)建的。硬件環(huán)境為Intel CoreTMi5-4210M、NVIDIA GeForce GTX 960M GPU;操作系統(tǒng)為Windows7 64位;軟件配置為CUDA 8.0、TensorFlow 1.14、Python 3.6.2、OpenCV 2.4.2.0。
模型訓(xùn)練采取分步法進行,將前面生成的樣本圖片集分為訓(xùn)練集、驗證集、測試集三部分,驗證集圖片數(shù)量為訓(xùn)練集圖片中隨機挑選出的四分之一。設(shè)定驗證步數(shù)為100步,模型的存儲步數(shù)為500 步,最大訓(xùn)練迭代步數(shù) 16 000 步;Adam 優(yōu)化器的參數(shù)[11]為:b1=0.9,b2=0.999,h=0.01,e=10-8。經(jīng)過多次實驗,最終確定batch_size為128,學(xué)習(xí)率為0.1,訓(xùn)練過程中l(wèi)oss和accuracy變化曲線如圖4所示。
圖4 訓(xùn)練集和驗證集上loss和accuracy變化曲線
從圖4可以看出,訓(xùn)練的accuracy曲線和驗證的accuracy曲線趨勢基本一致,準(zhǔn)確率(分對的樣本數(shù)/總的樣本數(shù))都接近1;訓(xùn)練的loss曲線和驗證的loss曲線也相差無幾,驗證loss曲線接近于0。表明模型訓(xùn)練超參數(shù)設(shè)置得不錯,該模型已經(jīng)可以很好擬合漢字識別訓(xùn)練集。
為了確定模型的準(zhǔn)確性,本文從3個方面進行驗證:測試集、不同模型和不同算法。實驗評價指標(biāo)采用Top1準(zhǔn)確率、Top5準(zhǔn)確率、識別率和訓(xùn)練時間。
(1)在測試集上驗證
將本文模型在測試集數(shù)據(jù)上進行性能評估,計算Top1(即準(zhǔn)確率)和Top5(測試集中正確標(biāo)簽包含在前5個分類概率中的個數(shù)/總的測試集),對模型的正確性進行驗證。測試集圖片是裁剪出來的單字圖片,使用本文訓(xùn)練的模型進行識別,通過統(tǒng)計識別正確的字符和識別錯誤的字符的數(shù)量,得到Top1準(zhǔn)確率為99.864%,Top 5準(zhǔn)確率為99.948%。評估結(jié)果如表2所示。
表2 測試集上本文模型的驗證結(jié)果
(2)不同模型的識別率對比
將本文模型與其他深度學(xué)習(xí)漢字識別模型對比,各模型識別率如表3所示。其中文獻[8]以卷積神經(jīng)網(wǎng)絡(luò)為分類器,通過提取文字圖像的多尺度梯度特征,網(wǎng)絡(luò)的識別率達到了98.292%。文獻[12]采用7層卷積神經(jīng)網(wǎng)絡(luò),減少了特征提取的過程,識別率達到98.336%。文獻[13]中采用暗區(qū)域文字圖像增強算法免去文字分割,再結(jié)合CTC(connectionist temporal classification)解碼預(yù)測字符串序列,系統(tǒng)識別率達到98.71%。文獻[14]以MNIST(mixed national institute of standards and technology database)網(wǎng)絡(luò)為基礎(chǔ),經(jīng)過參數(shù)調(diào)制和SGD(stochastic gradient descent)優(yōu)化算法設(shè)計的卷積神經(jīng)網(wǎng)絡(luò),在測試集上的識別率高達99.955%,但是該模型對多字體的識別率只有98.85%。本文采用了更深的12層卷積神經(jīng)網(wǎng)絡(luò)模型,并且在訓(xùn)練中加入了優(yōu)化算法,對多字體的識別率顯著提高。
表3 不同模型的識別率比較
(3)不同算法驗證
本實驗中,為了討論批標(biāo)準(zhǔn)化、不同優(yōu)化算法、和數(shù)據(jù)增廣對模型識別率和時間的影響,分別做了幾組對比實驗,設(shè)置訓(xùn)練的batch_size為128。實驗結(jié)果如表4所示。
表4 不同算法的訓(xùn)練結(jié)果對比
從表4的結(jié)果可以看出,不使用數(shù)據(jù)增廣的情況下,訓(xùn)練的時間最短,但是由于樣本數(shù)量不充分,識別率較低。只使用SGD時需要設(shè)置好的學(xué)習(xí)率和初始化調(diào)整方案,能達到較好的識別效果,但是很耗時。使用自適應(yīng)矩估計優(yōu)化算法的訓(xùn)練時間較短些,但是識別效果欠佳。批標(biāo)準(zhǔn)化的引入減少了迭代的次數(shù),使得訓(xùn)練時間顯著減少,并且能夠在整體上提升識別率和模型的泛化能力;使用數(shù)據(jù)增廣對樣本數(shù)據(jù)進行擴充,能夠有效防止網(wǎng)絡(luò)過擬合、提高識別率。本文模型在保證較高的識別率前提下,訓(xùn)練時間也有較大縮短。
本文基于印刷體漢字的識別特點,對經(jīng)典的LeNet-5模型進行一系列的改良,構(gòu)建了一個12層的深度卷積神經(jīng)網(wǎng)絡(luò)模型,使用該模型可以很好地識別多種字體的印刷體漢字。在本文的模型中綜合運用數(shù)據(jù)增廣、批標(biāo)準(zhǔn)化處理和Adam優(yōu)化算法等策略進行訓(xùn)練,通過各種實驗驗證了網(wǎng)絡(luò)模型的有效性。實驗結(jié)果表明,越深的網(wǎng)絡(luò)結(jié)構(gòu)在提高識別率上有很大的作用,但是訓(xùn)練的時間也會延長;運用批標(biāo)準(zhǔn)化處理可以減少迭代次數(shù),這樣整體上加快了訓(xùn)練速度;優(yōu)化方法的運用也很重要。本文模型可以應(yīng)用于身份證漢字的識別、車牌識別、盲人閱讀器等應(yīng)用場景。
今后研究需要改進和提高的主要有四個方面:(1)引入遷移學(xué)習(xí)和微調(diào)方法,先通過預(yù)訓(xùn)練模型進行數(shù)據(jù)特征的提取,再對訓(xùn)練模型進行微調(diào),以提高漢字數(shù)據(jù)集的識別率;(2)增加二級字庫中的3008個漢字到源圖片庫,擴大訓(xùn)練樣本的數(shù)量,研究識別率提高的效果;(3)嘗試更深的訓(xùn)練網(wǎng)絡(luò)和深度學(xué)習(xí)框架,如Inception-ResNet和Pytorch等;(4)結(jié)合嵌入式系統(tǒng)進行移動場景中的識別研究。