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