石裕林
(長(zhǎng)江大學(xué),湖北 荊州)
GANs 的基本原理是通過(guò)生成器G 和判別器D 的訓(xùn)練,使兩部分相互對(duì)抗的過(guò)程[1]。GANs 的任務(wù)是訓(xùn)練一個(gè)盡可能完美的生成器G,從而實(shí)現(xiàn)隨機(jī)的噪聲z 到生成的數(shù)據(jù)x 的映射:G(z)->~x。同時(shí)訓(xùn)練一個(gè)盡可能完美的判別器D,用來(lái)判斷其輸入的數(shù)據(jù)是來(lái)自真實(shí)樣本數(shù)據(jù)集還是生成的數(shù)據(jù)。
圖1 GAN 網(wǎng)絡(luò)的基礎(chǔ)框架
生成器G 和判別器D 模型之間進(jìn)行著極大值和極小值的博弈中分別是對(duì)方的競(jìng)爭(zhēng)對(duì)手,它用下列公式表示。
式(1)中的x 表示為真實(shí)圖片,輸入生成器G 的z,G(z)代表其為生成器G 輸出結(jié)果,D(x)為判別器D判斷輸入的真實(shí)圖片是否屬于為真實(shí)數(shù)據(jù),D(G(z))為判別器D 的輸出結(jié)果,其表示輸入的圖片來(lái)自真實(shí)樣本數(shù)據(jù)的可能性。
訓(xùn)練過(guò)程如圖2 所示。
圖2 生成器判別器與樣本示意
圖2 中曲線的起伏表示其各自的數(shù)據(jù)分布,曲線Pdata(x)代表的是真實(shí)數(shù)據(jù),曲線D 為判別的概率,曲線Pg(x)代表生成器生成樣本的分布狀況。圖片下部分z 表示隨機(jī)噪聲,z 到x 表示噪聲輸入生成器之后的分布情況。
(a)狀態(tài)是訓(xùn)練剛開始的時(shí)候,多次訓(xùn)練之后達(dá)到(b)狀態(tài),當(dāng)訓(xùn)練達(dá)到(c)狀態(tài),此時(shí)生成樣本已經(jīng)比較接近真實(shí)樣本了。反復(fù)對(duì)以上訓(xùn)練過(guò)程進(jìn)行迭代最終達(dá)到理想狀態(tài)(d)。
CycleGAN 由兩個(gè)相互對(duì)應(yīng)的GAN 網(wǎng)絡(luò)所組成,這樣就形成了一個(gè)環(huán)狀的網(wǎng)絡(luò)結(jié)構(gòu)。這兩個(gè)GAN 網(wǎng)絡(luò)使用兩個(gè)生成器,并且自身?yè)碛袑僮约旱呐袆e器也就是說(shuō)其一共有2 個(gè)生成器和2 個(gè)判別器[2]。其網(wǎng)絡(luò)模型如圖3 所示。
圖3 CycleGAN 模型
如圖3 所示,X 代表X 樣本空間的數(shù)據(jù),Y 代表屬于Y 樣本空間的數(shù)據(jù)。生成G 通過(guò)輸入X 產(chǎn)生Y樣本空間的數(shù)據(jù),生成的Y 樣本空間再由生成器F 重構(gòu)為X 樣本空間的原圖像;與之對(duì)應(yīng)的生成器F 輸入為Y 生成的為X,再由生成器G 重構(gòu)為Y 樣本空間圖像。DX 和DY 分別是兩個(gè)判別器用來(lái)判斷各自的生成數(shù)據(jù)是否滿足對(duì)應(yīng)的樣本空間,從而使兩種不同域的圖片進(jìn)行很好的轉(zhuǎn)換。
因此,實(shí)際上CycleGAN 模型的目標(biāo)就是學(xué)習(xí)X樣本空間到Y(jié) 樣本空間的映射。我們將這種映射關(guān)系稱為G,也就是模型中的生成器G,G 可以將輸入的樣本數(shù)據(jù)X 轉(zhuǎn)換為Y 域的樣本數(shù)據(jù)即:G(X)->Y。同樣的,Y 樣本空間到X 樣本空間的映射可以表示為:F(Y)->X。對(duì)于映射G(X)->Y,我們還需要一個(gè)判別器DY對(duì)輸入的生成數(shù)據(jù)判斷其是否來(lái)自真實(shí)數(shù)據(jù)。由現(xiàn)在生成器G 以及判別器DY,則GAN 損失如公式(2)所示:
實(shí)際上該損失其實(shí)與原始的GAN 損失如出一轍,如果僅僅使用這一個(gè)損失進(jìn)行訓(xùn)練明顯是不行的。這是因?yàn)橛成銰 完全可以將X 域的圖像全都映射為Y域中的同一張圖片,這樣損失就失去了它的作用。所以,作者又提出了叫做循環(huán)一致性損失。同樣的對(duì)于映射F(Y)->X,我們定義器判別器為DX器,根據(jù)F(G(X))近似于X 和G(F(Y))近似于Y,循環(huán)一致性損失就為如公式(3):
對(duì)另一個(gè)GAN 的損失進(jìn)行定義為L(zhǎng)GAN(F,DX,X,Y)。最終的損失就由三個(gè)部分所組成如公式(4)所示:
那么CycleGAN 的原理可以簡(jiǎn)單理解為:對(duì)兩種不同風(fēng)格的圖片進(jìn)行相互轉(zhuǎn)換。
Pix2pix 是基于CGAN 的網(wǎng)絡(luò)模型,CGAN 與傳統(tǒng)的GAN 不同,傳統(tǒng)的GAN 生成器輸入的數(shù)據(jù)只是一個(gè)隨機(jī)的噪聲,通過(guò)隨機(jī)噪聲來(lái)生成一張圖片。從隨機(jī)噪聲~z 來(lái)學(xué)習(xí)到目標(biāo)圖片y:G:~z→y;而CGAN 的生成器輸入的數(shù)據(jù)不再只是單單一個(gè)隨機(jī)的噪聲,而是傳入某一張圖片x 和某一個(gè)控制條件z 來(lái)生成一張假圖片,那么CGAN 能通過(guò)輸入的x 和z 來(lái)生成目標(biāo)圖像y:G:(x,z)→y。那么CGAN 的生成器G 的目標(biāo)就不僅僅是為了欺騙判別器D 而且還需要讓生成的圖片滿足控制條件z。而CGAN 中的判別器的輸入數(shù)據(jù)為一個(gè)真(假)的樣本圖片和控制條件y 用來(lái)判斷是否滿足控制條件y。在以前的研究中我們發(fā)現(xiàn),對(duì)于CGAN 來(lái)說(shuō),如果增加一個(gè)另外的損失,例如L2 距離(生成圖片與樣本圖片),會(huì)有更好的效果。這樣判別器的損失不發(fā)生變化,而生成器的損失發(fā)生了變化。但是,在P.Isola, J.Zhu 等人文獻(xiàn)中使用了L1 距離(公式(5)),這是因?yàn)榕cL2 距離相比較,L1 距離所生成的圖像會(huì)更清晰,能減少模糊的產(chǎn)生。
Pix2pix 的生成器使用了U-Net 網(wǎng)絡(luò)結(jié)構(gòu),U-Net加入了殘差連接,將對(duì)應(yīng)的feature maps 和解碼之后的與之具有相同大小的feature maps 按照各自的通道拼接在一起,這樣就可以將樣本卷積之后的不同分辨率的細(xì)節(jié)保存下來(lái)。
對(duì)于漢字字體圖片生成來(lái)說(shuō),采用Pix2pix 網(wǎng)絡(luò)模型需要相互匹配的數(shù)據(jù)集。兩種風(fēng)格字體圖片的樣本域中的圖片需要進(jìn)行配對(duì)處理。
本文所使用的數(shù)據(jù)有人工手寫的近600 多個(gè)手寫漢字圖片作為目標(biāo)生成字體和用于參考字體圖片的方正楷體、方正黑體,每個(gè)共3 755 個(gè)印刷字體圖片。首先對(duì)手寫漢字圖片進(jìn)行單字切割工作。其次利用垂直投影算法對(duì)手寫漢字圖片進(jìn)行處理,達(dá)到單字分割的目的[3]。分割完成后將每張圖片的背景處理為白色,得到599 張白底黑字的手寫漢字圖片。最后選擇方正黑體和方正楷體作為參考字體,使用python 生成字體庫(kù)中常用漢字3 755 個(gè)漢字圖片,同樣調(diào)整生成圖片的大小與手寫漢字圖片相一致[4]。
Pix2pix 網(wǎng)絡(luò)模型的訓(xùn)練需要相互匹配的數(shù)據(jù)。利用華為OCR 對(duì)單個(gè)手寫漢字圖片進(jìn)行識(shí)別,對(duì)處理好的599 個(gè)手寫漢字圖片進(jìn)行識(shí)別建立其漢字索引,用于與參考字體圖片進(jìn)行匹配。
進(jìn)行識(shí)別之后,我們就得到了即將進(jìn)行訓(xùn)練的手寫漢字索引,將參考字體圖片與手寫字體圖片進(jìn)行配對(duì)。即新建兩個(gè)文件夾A 和B,文件夾A 用來(lái)放參考字體圖片,文件夾B 用來(lái)放手寫漢字圖片,對(duì)于文件夾A 中的每一個(gè)參考字體圖片在文件夾B 中都能找到與之同名的手寫漢字圖片[5]。將兩個(gè)相互配對(duì)的字體圖片進(jìn)行拼接,我們能更清晰的看到參考字體與目標(biāo)字體的對(duì)應(yīng)關(guān)系。
以上工作全部完成后,我們基本已經(jīng)完成了對(duì)Pix2pix 模型數(shù)據(jù)集的處理。
將參考字體圖片作為X 樣本空間,手寫漢字圖片作為X 遷移的對(duì)象Y 樣本空間,使用兩個(gè)對(duì)稱的GAN 網(wǎng)絡(luò)進(jìn)行訓(xùn)練[6]。模型如圖4 所示。
圖4 CycleGAN 網(wǎng)絡(luò)模型結(jié)構(gòu)
我們希望將漢字圖片樣本記為A 轉(zhuǎn)換為手寫漢字圖樣本記為B,于是構(gòu)建了兩個(gè)生成器GAB 和GBA。代表將A 域的圖片轉(zhuǎn)換為B 域的圖片、將B 域的圖片轉(zhuǎn)換為A 域的圖片。
使用預(yù)先處理好的數(shù)據(jù)集,共有1 198 張漢字圖片,包括599 張方正黑體漢字圖片與599 張手寫漢字圖片,作為樣本空間A 和B。將A,B 樣本空間中的圖片各取出500 張為訓(xùn)練集,剩下的為測(cè)試集。
數(shù)據(jù)集準(zhǔn)備完畢后,進(jìn)行網(wǎng)絡(luò)的搭建,定義兩個(gè)生成器和兩個(gè)判別器。將判別器的loss 定義為生成圖片與真實(shí)圖片的差異,假圖判定的概率趨向于0,真圖判定的概率趨向于1。使用Adam 優(yōu)化算法,初始學(xué)習(xí)率定義為0.0002。
經(jīng)過(guò)150 輪訓(xùn)練之后結(jié)果如圖5 所示。
圖5 生成過(guò)程圖片展示
圖5 中其左邊兩列為的inputA 表示生成器GAB的輸入,F(xiàn)akeB 則為生成的樣本空間B 的假圖片。右列的inputB 表示生成器GBA 的輸入,F(xiàn)akeA 則為生成的樣本空間A 的假圖片。
Pix2pix 網(wǎng)絡(luò)模型是基于CGAN,需要一一配對(duì)的數(shù)據(jù)集,在本次實(shí)驗(yàn)中,我們選擇方正黑體作為參考字體,手寫漢字作為遷移目標(biāo)圖片。
在進(jìn)行對(duì)Pix2pix 訓(xùn)練數(shù)據(jù)進(jìn)行處理時(shí),要保證每個(gè)相對(duì)的漢字圖片在輪廓、位置上大致相同。所以需要對(duì)數(shù)據(jù)集進(jìn)行優(yōu)化、檢查。
對(duì)網(wǎng)絡(luò)的基本模型確定之后,我們開始對(duì)基于Pix2pix 的手寫漢字方法進(jìn)行實(shí)現(xiàn)。
定義一個(gè)生成器GTrainer 用與訓(xùn)練風(fēng)格A 向風(fēng)格B 的轉(zhuǎn)換和一個(gè)判別器DTrainer 用于在輸入條件為參考字體的情況下,判斷輸入的圖片是否為真實(shí)圖片。其loss 定義為判別輸入的圖片是否為手寫漢字的二分器,使用Adam 優(yōu)化算法將loss 盡量降低。初試學(xué)習(xí)率設(shè)定為0.0001,batch_num 設(shè)置為1,每200 個(gè)批次的訓(xùn)練固化一次模型[7]。在進(jìn)行200 輪的訓(xùn)練之后,使用固化的模型進(jìn)行預(yù)測(cè),其結(jié)果如圖6 所示。
圖6 Pix2pix 漢字生成圖片
如圖6 所示,經(jīng)過(guò)200 輪訓(xùn)練后其生成的漢字圖片與目標(biāo)漢字各方面都比CycleGAN 模型的效果要好。
綜上所述,本文使用Pix2pix 網(wǎng)絡(luò)模型,在手寫漢字的生成方面具有巨大的優(yōu)勢(shì)。對(duì)于一些筆畫少,簡(jiǎn)單的漢字生成效果與目標(biāo)漢字的相似度較大,而對(duì)于一些筆畫復(fù)雜的漢字生成效果有待改進(jìn)。
本文提出了一種比較有效的使用CycleGAN 和Pix2pix 網(wǎng)絡(luò)模型的手寫漢字生成方法。分別使用配對(duì)的和不配對(duì)的數(shù)據(jù)集對(duì)手寫漢字的生成進(jìn)行了嘗試。分別測(cè)試了CycleGAN 和Pix2pix 網(wǎng)絡(luò)模型,并在使用配對(duì)數(shù)據(jù)集的Pix2pix 網(wǎng)絡(luò)模型上取得了預(yù)期的結(jié)果。