楊光鍇
(河北省科學院,河北 石家莊 050081)
漢字作為世界上最古老的文字之一,距今已有數(shù)千年的歷史。計算機領(lǐng)域關(guān)于手寫漢字的研究主要集中在識別和生成兩個方面。作為模式識別應用的一個重要領(lǐng)域,手寫漢字識別技術(shù)已有很大的發(fā)展。而手寫漢字生成的研究還處于不斷發(fā)展的階段。相較于英文字母和阿拉伯數(shù)字,漢字的手寫生成更為復雜和困難。漢字的字符數(shù)量巨大,總計數(shù)量可能有約十萬個,即便中國常用的漢字字符也有數(shù)千個之多,獲得全部漢字的手寫樣本是不現(xiàn)實的[1-3]。漢字的構(gòu)造結(jié)構(gòu)復雜,大部分漢字的筆畫數(shù)遠大于英文字母和數(shù)字,會在計算機學習漢字的結(jié)構(gòu)時造成更大困難。因此,如何通過自動學習特定風格的漢字樣本,進而擴展應用到全部漢字之中,是研究的主要方向。
近年來,深度學習迅速發(fā)展,在諸多領(lǐng)域取得了大量成果和應用。2014年,Goodfellow等人[4]提出生成對抗網(wǎng)絡(luò)(GAN, Generative Adversarial Networks),這是一種無監(jiān)督學習方式生成數(shù)據(jù)的深度學習架構(gòu),是目前發(fā)展最為迅速的深度學習領(lǐng)域之一,在圖像生成等領(lǐng)域具有廣泛的適用性。GAN由生成網(wǎng)絡(luò)和判別網(wǎng)絡(luò)構(gòu)成其主要網(wǎng)絡(luò)結(jié)構(gòu),生成網(wǎng)絡(luò)從潛在空間(Latent Space)中生成數(shù)據(jù),判別網(wǎng)絡(luò)對真實數(shù)據(jù)和生成網(wǎng)絡(luò)生成的數(shù)據(jù)進行判別真?zhèn)?,通過生成網(wǎng)絡(luò)和判別網(wǎng)絡(luò)間的多次循環(huán),兩個網(wǎng)絡(luò)在對抗中不斷訓練和提升。Radford等人[5]在GAN的基礎(chǔ)上提出DCGAN架構(gòu),可以有效地實現(xiàn)高質(zhì)量圖片生成,且具有很強的穩(wěn)定性和實用性。Isola 等人[6]提出了Pix2Pix模型,實現(xiàn)了對應圖像的遷移轉(zhuǎn)換。Zhu等人[7]提出循環(huán)生成對抗網(wǎng)絡(luò)(Cycle-consistent Generative Adversarial Networks,CycleGAN),其使用條件更為寬泛,不需要像Pix2Pix使用成對的圖像,可用于圖像風格轉(zhuǎn)換、繪畫照片互轉(zhuǎn)等跨領(lǐng)域變換。本文采用CycleGAN模型方法,實現(xiàn)手寫漢字的生成。
圖1 CycleGAN整體結(jié)構(gòu)示意圖
CycleGAN作為基于GAN思想產(chǎn)生的一種變體,由兩個GAN合作組成[8-10]。如圖1所示,X和Y分別代表不同類別的數(shù)據(jù),第一個GAN由生成網(wǎng)絡(luò)G和判別網(wǎng)絡(luò)DY組成,G用于從X類別數(shù)據(jù)生成Y類別數(shù)據(jù),DY用于判別Y類別數(shù)據(jù)真?zhèn)?;同理,第二個GAN由生成網(wǎng)絡(luò)F和判別網(wǎng)絡(luò)DX組成,F(xiàn)用于從Y類別數(shù)據(jù)生成X類別數(shù)據(jù),DX用于判別X類別數(shù)據(jù)真?zhèn)?。G和F的目的是生成Y和X類別數(shù)據(jù),進而通過DY和DX的判別,達到模仿生成的目的[11-12]。
針對每一個GAN分別設(shè)定對應的損失函數(shù)。由G和DY組成的GAN的損失函數(shù)為:
LGAN(G,DY,X,Y)=Ey~Pdata(y)[logDY(y)]+Ex~Pdata(x)[log(1-DY(G(x)))]
(1)
由F和DX組成的GAN的損失函數(shù)為:
LGAN(F,DX,X,Y)=Ex~Pdata(x)[logDX(x)]+Ey~Pdata(y)[log(1-DX(F(y)))]
(2)
以上采取的是傳統(tǒng)GAN的對抗損失,為增強手寫字體生成時模型訓練的穩(wěn)定性,這里將log似然替換為使用平方差構(gòu)造對抗損失函數(shù)。原對抗損失函數(shù)修改為:
LGAN(G,DY,X,Y)=Ey~Pdata(y)[(DY(y)-1)2]+Ex~Pdata(x)[DY(G(x))2]
(3)
LGAN(F,DX,X,Y)=Ex~Pdata(x)[(DX(x)-1)2]+Ey~Pdata(y)[DX(F(y))2]
(4)
圖2 循環(huán)一致性示意圖
x→G(x)→F(G(x))≈x
(5)
反向循環(huán)同理:
y→F(y)→G(F(y))≈y
(6)
這里使用L1范數(shù)計算循環(huán)一致性損失函數(shù),循環(huán)一致性損失函數(shù)為:
Lcyc(G,F)=Ex~Pdata(x)[‖F(xiàn)(G(x))-x‖1]+Ey~Pdata(y)[‖G(F(y))-y‖1]
(7)
式中右側(cè)兩項分別對應X和Y正反兩個方向情況。通過使用循環(huán)一致性損失函數(shù),能夠保證經(jīng)過G(F(y))和F(G(x))后生成的圖像與原圖像基本保持一致。
完整的損失函數(shù)由對抗損失函數(shù)和循環(huán)一致性損失函數(shù)共同構(gòu)成:
L(G,F,DX,DY)=LGAN(G,DY,X,Y)+LGAN(F,DX,X,Y)+λLcyc(G,F)
(8)
其中,引入超參數(shù)λ來控制循環(huán)一致性損失在全部損失中的的權(quán)重。最終的優(yōu)化問題轉(zhuǎn)換為求解損失函數(shù)的最小最大值問題:
(9)
生成網(wǎng)絡(luò)是一個自編碼網(wǎng)絡(luò),以X域或Y域圖片為輸入,輸出生成圖片。如圖3所示,生成網(wǎng)絡(luò)基本構(gòu)成由編碼器、解碼器和特征轉(zhuǎn)換器構(gòu)成。設(shè)置輸入圖片大小1通道112×112像素。將圖片輸入編碼器,經(jīng)特征轉(zhuǎn)換器轉(zhuǎn)換后,進入解碼器,返回生成圖像。編碼器包括3個卷積層(Conv),第一個卷積層步長(Stride)設(shè)置為1,其余設(shè)置為2,使用reLU作為激活函數(shù),通過卷積層進行下采樣,縮小圖片尺寸,增加通道數(shù)量到256。考慮到漢字生成問題相對于斑馬與馬互轉(zhuǎn)、卡通和實際場景互換等問題不同,漢字生成問題在色彩空間、結(jié)構(gòu)構(gòu)成上相對單一,因此減少CycleGAN原始模型的殘差塊數(shù)量,將特征轉(zhuǎn)換器中的殘差塊調(diào)整至4個。解碼器為2個轉(zhuǎn)置卷積層(Conv_Transpose)組成,步長(Stride)為2,使用reLU作為激活函數(shù),通過轉(zhuǎn)置卷積層進行上采樣,增大圖片尺寸,減少通道數(shù)量,最后通過1個卷積層,并以tanh為激活函數(shù),將圖片轉(zhuǎn)換回原始大小(1×112×112)。
圖3 生成網(wǎng)絡(luò)結(jié)構(gòu)圖
判別網(wǎng)絡(luò)為一個卷積神經(jīng)網(wǎng)絡(luò),但判別方式不是將圖片輸入最終映射為一個具體數(shù)值,而是采用PatchGAN設(shè)計,使用卷積將輸入圖片映射為N×N矩陣,使用矩陣來評價判別圖片,通過PatchGAN的每個感受野對應于輸入中的一塊區(qū)域(原始CycleGAN模型為70×70),再將N×N矩陣的均值作為輸入圖片的最終判別結(jié)果。對于漢字生成這一特定問題,由于漢字結(jié)構(gòu)構(gòu)成上各個部分的大小一般在整個圖像的一半以內(nèi),采用的圖片像素也相對較小,因此對原有CycleGAN模型的PatchGAN進行調(diào)整,減小其感受野,縮減1個卷積層,將PatchGAN的判別區(qū)域大小調(diào)整為34×34。如圖4所示,調(diào)整后的CycleGAN模型主要由4個卷積層組成,接收真實和生成圖片,經(jīng)卷積層處理,最終返回一個(26,26,1)的張量,使用該張量判別是否為真實圖片。
圖4 判別網(wǎng)絡(luò)結(jié)構(gòu)圖
實驗的基本思路是以標準漢字作為數(shù)據(jù)集X,以手寫漢字作為數(shù)據(jù)集Y,采用改進后的CycleGAN模型對其進行訓練,達到生成手寫漢字目的。本文采用生成的仿宋標準字體圖片作為標準漢字數(shù)據(jù)集X,采用CASIA-HWDB1.1數(shù)據(jù)集[15]作為手寫漢字數(shù)據(jù)集Y。其中,CASIA-HWDB是由中科院自動化研究所在2007—2010年間收集,包含了1 020人書寫的脫機手寫中文單字樣本和手寫文本。本文使用的CASIA-HWDB1.1為手寫單字數(shù)據(jù)庫,由300位作者手寫而成,其中訓練集包含240人,測試集包含60人,每位作者書寫我國漢字代碼標準GB2312-80中全部3 755個一級漢字。如圖5所示,對CASIA-HWDB1.1每名作者的單字圖片進行采集,并分析其像素大小,發(fā)現(xiàn)其圖片大小多為100×100像素左右,同時綜合考量網(wǎng)絡(luò)架構(gòu)、模型建立等因素,將手寫漢字圖片和仿宋標準字體圖片統(tǒng)一調(diào)整至112×112像素大小。在CASIA-HWDB1.1數(shù)據(jù)集中,選擇了原測試集第13位和第26位作者(后文所述作者均為原測試集作者)的手寫字體作為實驗對象。
圖5 CASIA-HWDB1.1部分作者所寫單字像素大小分布
實驗在 Windows 10 操縱系統(tǒng)下進行,編程語言Python3.7,編程環(huán)境Anaconda、Pycharm,使用深度學習框架Pytorch V1.2,CUDA10.0,采用Wisdom作為交互式可視化工具,硬件設(shè)備為處理器Intel(R)Core(TM)i5-6500CPU @ 3.2GHz,運行內(nèi)存4GB (RAM),顯卡NVIDIA GeForce 720。
損失函數(shù)中循環(huán)一致性損失在全部損失中的權(quán)重λ設(shè)置為10。Batchsize設(shè)置為1,總計訓練100 epoch,優(yōu)化器采用Adam算法,其中參數(shù)beta1和beta2分別設(shè)置為0.5和0.999,學習率lr設(shè)置為0.0002??紤]到漢字圖像具有具體的內(nèi)涵意義,訓練時不采用圖片旋轉(zhuǎn)、翻轉(zhuǎn)等數(shù)據(jù)增強手段。從每位作者的手寫字體中,隨機選取200個圖片,同時一并挑選相應的仿宋字體圖片用于訓練。
圖6 CycleGAN損失函數(shù)曲線
以訓練第13位作者字體過程為例,圖6為其訓練時的總
體損失函數(shù)的變化曲線??梢钥闯?,隨著訓練的不斷深入,損失函數(shù)值由開始的較大值,在一定周期后逐漸收斂,函數(shù)值波動幅度逐漸變小,且基本趨于穩(wěn)定。
從實驗結(jié)果看,生成的字體總體情況較好,將生成的漢字與原作者的手寫字體進行比對可以發(fā)現(xiàn),生成的字體能夠一定程度上體現(xiàn)出原作者的筆記樣式,如圖7所示。
通過使用訓練好的模型進行預測,也可對原3755個一級漢字之外的漢字進行模仿生成,如圖8所示,“鍇”“釗”兩字并不在原CASIA-HWDB1.1數(shù)據(jù)集中,也有較好的生成效果。
圖7 標準仿宋漢字、原手寫漢字和生成漢字對比
圖8 標準仿宋漢字和一級漢字之外的生成漢字對比
本文提出了一種基于生成對抗網(wǎng)絡(luò)的手寫漢字生成方法,通過使用標準漢字和手寫漢字構(gòu)建CycleGAN模型,實現(xiàn)二者之間的相互轉(zhuǎn)換。經(jīng)過實驗驗證,本方法生成的手寫漢字使用的數(shù)據(jù)量相對較少,具有比較高的識別度,但該方法還存在一定局限性。一是訓練時間要求較長,且單次實驗僅能夠訓練一個作者的手寫字體。二是生成的手寫漢字缺乏客觀評判的標準,對于生成的漢字,評價基本依靠感性的肉眼鑒別。三是生成的漢字與原標準漢字(仿宋)還有很多相近之處,如連筆等方面沒有得到很好的體現(xiàn),但如果為了實現(xiàn)更好的效果而冒然增加訓練周期,可能會出現(xiàn)模式崩潰(Mode Collapse)現(xiàn)象。