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