張承強,張永愛,顧興權(quán)
(1.福州大學(xué) 物理與信息工程學(xué)院,福建 福州 350116; 2.西安電子科技大學(xué) 通信工程學(xué)院,陜西 西安 710000)
在我國的各種古代藝術(shù)門類中,最具標(biāo)志性,最能集中地、典型地、鮮明地、持續(xù)而廣泛地表現(xiàn)民族精神和時代精神的藝術(shù),非書法莫屬[1]。數(shù)字化的書法字體臨摹成為了很多大眾的愛好,數(shù)字化的手寫字識別往往和深度學(xué)習(xí)相結(jié)合。深度學(xué)習(xí)是新興的機器學(xué)習(xí)研究領(lǐng)域,旨在研究怎樣從數(shù)據(jù)中自動地更好地提取多層特征表示,其核心思想是通過數(shù)據(jù)驅(qū)動的方式,采用一系列的非線性(如激活函數(shù))變換,從原始數(shù)據(jù)中提取由低層到高層、由具體到抽象、由一般到特定語義的特征[2]。ResNet(Residual Neural Network)是由微軟研究院的He Kaiming等四名華人提出的強大深度學(xué)習(xí)網(wǎng)絡(luò)[3-4],在ILSVRC2015比賽中取得冠軍,ResNet的結(jié)構(gòu)可以極快地加速神經(jīng)網(wǎng)絡(luò)[5-6]的訓(xùn)練,模型的準(zhǔn)確率也有比較大的提升,本文的深度學(xué)習(xí)網(wǎng)絡(luò)采用的就是ResNet網(wǎng)絡(luò)。
目前,在線的名人書法臨摹基本上都是照著某名人的書法臨摹再比較相似度,且都是觸屏?xí)鴮慬7-8]。觸屏?xí)鴮懘嬖陟`敏度強弱、屏幕大小和數(shù)字量化等因素而導(dǎo)致的手寫字細(xì)節(jié)丟失問題,而本文的系統(tǒng)平臺是在現(xiàn)實的紙等實物上進(jìn)行書寫后再拍照進(jìn)行上傳,有很多的細(xì)節(jié)能夠保留且很方便,只要制作的名人書法字越精細(xì),對細(xì)節(jié)的比較就越充分。此外,現(xiàn)今的在線名人書法臨摹也限制了用戶書寫行為,只能對著名人的字進(jìn)行臨摹,本文的系統(tǒng)平臺除此之外,還可以把日常的手寫字與多位名人字進(jìn)行比較,再展示與其最相似的名人真跡字并分析其結(jié)果。本文的平臺可以面向大眾娛樂,方便快捷地將自己的手寫字與名人字比較。
ResNet借鑒了以往網(wǎng)絡(luò)結(jié)構(gòu)的優(yōu)點,使用殘差學(xué)習(xí)方法解決了在信息傳遞時出現(xiàn)的信息丟失、損耗等問題,整個網(wǎng)絡(luò)只需要學(xué)習(xí)輸入與輸出不同的那一部分,使得網(wǎng)絡(luò)學(xué)習(xí)的目標(biāo)和難度得到簡化。與傳統(tǒng)的卷積神經(jīng)網(wǎng)絡(luò)相比,ResNet提出了兩種映射,恒等映射(identity mapping)和殘差映射(residual mapping)。圖1是一個簡單的Residual Block,恒等映射就是圖1中的曲線(Shortcut Connection)跳過2層權(quán)重(層數(shù)是可變的,也可以是3層)后把X直接送到2層后的ReLU層的映射,之所以稱為恒等,是因為X跳過了權(quán)重層,沒有經(jīng)過任何計算,即G(X)=X;殘差映射指普通網(wǎng)絡(luò)原來的部分。
圖1 Residual Block
曲線部分使得每一個殘差塊很容易地學(xué)習(xí)到恒等映射結(jié)果,并且在反向傳播時可以使梯度直接傳播到更淺的層。在傳統(tǒng)卷積神經(jīng)網(wǎng)絡(luò)上多次使用Residual Block,就形成了殘差網(wǎng)絡(luò)(Residual Network,ResNet)。殘差網(wǎng)絡(luò)解決了傳統(tǒng)極深網(wǎng)絡(luò)的退化問題,讓訓(xùn)練極深的網(wǎng)絡(luò)成為可能[9]。殘差網(wǎng)絡(luò)最常見的層數(shù)有50層和101層等。
ResNet50即共50層的殘差網(wǎng)絡(luò),如圖2所示,包括conv1,conv2.x,conv3.x,conv4.x和conv5.x卷積層,以及輸出層。每個卷積層包含有7×7,3×3和1×1大小的數(shù)量不等的卷積核,以及池化(pool)層和激活(ReLU)層。
圖2 ResNet50網(wǎng)絡(luò)配置
本文的ResNet50網(wǎng)絡(luò)使用目前流行的深度學(xué)習(xí)庫TensorFlow搭建,首先需要對數(shù)據(jù)進(jìn)行預(yù)處理,本文自制了名人書法字?jǐn)?shù)據(jù)集并將其與普通中文字?jǐn)?shù)據(jù)集合在一起,以增加模型訓(xùn)練的數(shù)據(jù)量;為了增強模型的泛化能力以提高準(zhǔn)確率,本文將數(shù)據(jù)集進(jìn)行數(shù)據(jù)增強,接著對圖片進(jìn)行大小尺寸的調(diào)整,本實驗將圖片尺寸調(diào)整為224×224的大小;TensorFlow官方推薦的訓(xùn)練數(shù)據(jù)標(biāo)準(zhǔn)格式是tfrecord格式,此格式能夠?qū)D片數(shù)據(jù)和標(biāo)簽一起存儲成二進(jìn)制文件,能夠在TensorFlow中實現(xiàn)快速地復(fù)制、移動、讀取和存儲操作,由于本文使用TensorFlow庫進(jìn)行模型搭建,可再將上述的數(shù)據(jù)集制作成tfrecord格式[10]。
數(shù)據(jù)預(yù)處理完成后,就開始搭建ResNet50網(wǎng)絡(luò),導(dǎo)入TensorFlow庫和加載預(yù)訓(xùn)練模型,設(shè)置batch_size、學(xué)習(xí)率和網(wǎng)絡(luò)輸入的大小,指定模型保存路徑,損失函數(shù)選擇sigmoid交叉熵,優(yōu)化器選擇Adam,并設(shè)置其他相關(guān)參數(shù)[11]。
設(shè)置完所有的參數(shù)后,對模型進(jìn)行訓(xùn)練,如圖3和圖4所示,分別是模型訓(xùn)練過程中的精度曲線和損失值(loss)曲線。
圖3 迭代次數(shù)與準(zhǔn)確率的關(guān)系圖
圖4 迭代次數(shù)與損失值的關(guān)系圖
本文的字相似度算法比現(xiàn)有的傳統(tǒng)字相似度算法簡單,且符合直觀感受,有易理解和計算量小等特點。
該算法分為以下幾步,為便于論述,將手寫字圖片和名人書法字圖片分別設(shè)為圖片A和圖片B。
(1)將圖片A和圖片B灰度化。最初的圖片是三通道的彩色圖,需要將其灰度化為單通道圖片以便下面只在單通道上二值化。
(2)自定義二值化。將圖片A和圖片B中的每個像素值大于設(shè)定的閾值(比如100)的像素點全部設(shè)為255,否則設(shè)為0。對于白紙黑字的手寫字,經(jīng)過實驗得出閾值取100能有很好的二值圖,即小斑點和劃痕相對較少。
(3)處理圖片A和B中的細(xì)小斑點、小劃痕、孤立點和噪音等像素,將其全部設(shè)為255 (此步驟是為了下一步截字精確)。
(4)分別將圖片A和B中的字恰好截取出來,得到圖片A1和B1。精確截字是為了在計算字之間的相似度時減少背景的影響。
(5)將圖片A1的尺寸設(shè)置為與圖片B1相同,得到圖片A2和B1。同尺寸后才能用步驟(7)中算法進(jìn)行相似度的計算。名人書法字的尺寸不作改變是為了要保持其字的形狀不變,所以將手寫字設(shè)為與其同尺寸。
(6)分別將圖片A2和B1顏色取反,得到圖片A3和B2。取反之后的圖片變成了白字黑背景的圖片,因為像素值為255表示白色,0表示黑色,所以白字黑背景進(jìn)行相似度計算時才是對字進(jìn)行相似度比較,不然黑字白背景其實是對背景進(jìn)行相似度計算。
(7)將圖片A3和B2采用修改的均方誤差算法[12](即PMSE)進(jìn)行相似度計算,原理如式(1),得到的計算結(jié)果就是圖片A和B的相似度值。
(1)
其中,m為圖片的寬,n為圖片的高,I(i,j)和K(i,j)分別表示兩張不同圖片在(i,j)點的像素值。
改進(jìn)的均方誤差算法的Python代碼實現(xiàn)如下:
def Pmse(imageA,imageB):
err = np.sum((imageA.astype("float") - imageB.astype("float")) ** 2)
err /= float(imageA.shape[0] * imageA.shape[1]*255*255)
return 1-err
相似度算法的實際實現(xiàn)過程如圖5所示。不過一般名人書法字最終的反色二值圖會預(yù)先制作好存放在數(shù)據(jù)庫中,這樣做一方面是為了減少系統(tǒng)平臺處理時間,另一方面名人書法字由于歲月的侵蝕可能會出現(xiàn)一些非理性的臟點,需要人工處理好再存于數(shù)據(jù)庫中。
字相似度算法在不同手寫字與不同名人真跡字之間的實際比較效果如圖6所示,其中的名人真跡字和手寫字是經(jīng)過上述步驟(1)~(6)處理后的,組別1和組別2中的名人真跡字是相同的真跡字,手寫字是不同的,從相似值的大小來看組別1更相似,也更符合人的主觀感受;組別2和組別3的名人真跡字是不同的,手寫字是相同的,從相似值的結(jié)果看組別3更相似,也更符合人的主觀感受;組別4中的名人真跡字與手寫字主觀感受上看起來很像,但由于名人真跡字邊緣過于粗糙而使相似度的值沒有超過0.9。通過實驗認(rèn)為相似度的值超過0.88(即88%)為手寫字的結(jié)構(gòu)基本準(zhǔn)確(即相似)。
圖5 字相似度計算實例流程圖
圖6 字相似度算法效果
本文的字相似度算法比書法字骨架提取、骨架相似度計算和點化形態(tài)相似度計算等綜合性算法顯然更簡單和計算量更小,具有代碼易實現(xiàn)、實時性明顯和通用性(其他文字亦可)等特點,效果直觀上無區(qū)別,優(yōu)勢明顯。
本文開發(fā)的基于深度學(xué)習(xí)的在線手寫字與名人書法字相似度比較Android平臺,將Android、Web服務(wù)器、深度學(xué)習(xí)和字相似度算法結(jié)合在一起。整個平臺有四大模塊,分別為Android應(yīng)用的圖片上傳模塊[13]、識別模塊、字相似度計算模塊和Android應(yīng)用顯示結(jié)果模塊。Android應(yīng)用的圖片上傳模塊:用戶可以進(jìn)行本地相冊的圖片上傳或?qū)κ謱懽峙恼蘸笤偕蟼鳎蛔R別模塊:上傳的圖片被Web網(wǎng)站接收并預(yù)處理后,通過已訓(xùn)練好的文字深度學(xué)習(xí)模型(即ResNet50模型)識別用戶提交的圖片,成功識別為某字;字相似度計算模塊:在成功識別后,Web網(wǎng)站[14]會將上傳的圖片與數(shù)據(jù)庫中各名人書法字的該字圖片進(jìn)行相似度的計算,并返回結(jié)果;Android應(yīng)用顯示結(jié)果模塊:顯示內(nèi)容包括用戶提交的圖片、最相似的名人真跡圖片、相似值和分析結(jié)果等信息。在線Android平臺結(jié)構(gòu)如圖7所示。
圖7 在線Android系統(tǒng)平臺
Android應(yīng)用的圖片上傳模塊的顯示界面如圖8所示,這是一個用HTML+CSS+Javascript技術(shù)簡單設(shè)計的網(wǎng)頁頁面[15],Android應(yīng)用是一個定制的瀏覽器,Webview方法已經(jīng)設(shè)置了指定的Web服務(wù)器網(wǎng)址,在打開Android應(yīng)用時會訪問指定的Web網(wǎng)站,Web網(wǎng)站將會響應(yīng)設(shè)計好的網(wǎng)頁頁面代碼,通過HTTP協(xié)議將代碼發(fā)送到Android端,定制的瀏覽器會解析頁面代碼進(jìn)行頁面渲染。Android應(yīng)用的顯示界面也可以做成微信小程序等界面[16]。
圖8 Android應(yīng)用已選定圖片的界面
Android應(yīng)用顯示結(jié)果模塊的顯示界面如圖9所示,圖8上傳手寫字到Web服務(wù)器之后,服務(wù)器處理完成后會將處理結(jié)果返回給Android端,Android界面會展示返回的處理結(jié)果,該界面展示的信息有識別到的手寫字、相似度計算的結(jié)果、手寫字圖片和最相似的名人字圖片以及簡單評價等。
圖9 后臺處理結(jié)果展示
本文將自制的名人真跡字?jǐn)?shù)據(jù)集和普通中文數(shù)據(jù)集合在一起訓(xùn)練了ResNet50模型,訓(xùn)練好的ResNet50網(wǎng)絡(luò)對手寫漢字的識別精度非常高;改進(jìn)的字相似度算法對手寫字與名人真跡字的相似度計算的結(jié)果完全符合人的主觀感受且計算量不大,適合做Android端與服務(wù)器端的在線相似度識別計算任務(wù);最后將訓(xùn)練好的ResNet50模型和字相似度算法放在搭建好的Web網(wǎng)站上,再與Android應(yīng)用相結(jié)合,實現(xiàn)了一個實時在線手寫字與名人真跡字的相似度比較系統(tǒng)。此外本平臺若增加鋼筆字和水筆等字的數(shù)據(jù)集,也可對鋼筆和水筆的名人真跡字進(jìn)行相似度的計算。