python生成手写汉字字体_「zi2zi」:用AI生成自己的手写字体
導(dǎo)讀
如果想要自己做一套字體,無(wú)論是電腦軟件FontCreator還是網(wǎng)站flexifont都為我們帶來(lái)了極大的便利。
但是最低的國(guó)標(biāo)字體數(shù)量近7000個(gè),若采用傳統(tǒng)的方法則需要手寫相同數(shù)量的漢字,這個(gè)過(guò)程費(fèi)時(shí)耗力。那有沒有辦法可以快速生成自己的手寫字體?本文將介紹開源項(xiàng)目zi2zi,只需要你的部分手寫字體樣本便可生成完整字庫(kù)。教你用深度學(xué)習(xí)的方式打開制作手寫字體的大門。
本系列文章
Part1:導(dǎo)讀與相關(guān)介紹
part2:程序化或?qū)⑴c手寫模擬器擦出火花
zi2zi
zi2zi是作者Rewrite項(xiàng)目的后續(xù)工作,其為處理類似中文字體轉(zhuǎn)化的問(wèn)題。Rewrite項(xiàng)目獲得了相當(dāng)多的關(guān)注和興趣,但是項(xiàng)目結(jié)果不佳。仍然存在一些嚴(yán)重的問(wèn)題:生成的圖像通常是模糊的
無(wú)法使用更多風(fēng)格的字體
限于一次僅學(xué)習(xí)和輸出一種目標(biāo)字體樣式
為了解決上述問(wèn)題,zi2zi誕生了。本項(xiàng)目的論文中是將之前的三篇paper合在一起又加入了作者的構(gòu)想形成的一個(gè)條件生成對(duì)抗網(wǎng)絡(luò)。
zi2zi模型和其名字一樣,來(lái)源于pix2pix模型并有所改進(jìn)。其網(wǎng)絡(luò)結(jié)構(gòu)如下:
我們可以知道,現(xiàn)實(shí)世界中的設(shè)計(jì)師需要經(jīng)過(guò)多年的培訓(xùn),起碼了解字母/字符的結(jié)構(gòu)和基本原理才能自行設(shè)計(jì)字體。基于此,其重要的是使模型不僅意識(shí)到自己的樣式,而且也能意識(shí)到其他字體的樣式。因此,使模型能夠同時(shí)學(xué)習(xí)多種字體樣式是極為重要的。同時(shí)對(duì)多種樣式建模有兩個(gè)主要好處:編碼器能接觸更多字符,不僅僅限于目標(biāo)字體,也包括所有組合的字體;
解碼器還可以學(xué)習(xí)從其他字體寫相同的部首的不同方法。
通過(guò)一起訓(xùn)練多個(gè)字體,它可以強(qiáng)制模型從每個(gè)字體中學(xué)習(xí),然后利用所學(xué)的經(jīng)驗(yàn)來(lái)改善其他字體。
現(xiàn)在有一問(wèn)題是同一個(gè)漢字會(huì)出現(xiàn)在多種字體當(dāng)中。作者受《谷歌的多語(yǔ)言神經(jīng)機(jī)器翻譯系統(tǒng)》的啟發(fā),想出了「類別嵌入」,將不可訓(xùn)練的高斯噪聲作為風(fēng)格嵌入與漢字嵌入串聯(lián)起來(lái),之后再一并進(jìn)入解碼器。這樣,解碼器仍舊將同一個(gè)漢字映射為同一個(gè)向量,但是,解碼器會(huì)同時(shí)考慮漢字和風(fēng)格兩個(gè)嵌入來(lái)生成目標(biāo)漢字。
有了類別嵌入,現(xiàn)在就有了一個(gè)能夠同時(shí)處理多種風(fēng)格的GAN。但作者發(fā)現(xiàn)又出現(xiàn)了一個(gè)新的問(wèn)題:模型開始將各種風(fēng)格弄混淆并且混合在一起,生成的漢字什么也不像了。于是,他又借鑒了 AC-GAN模型中的 multi-class category loss,把這個(gè) loss 加到判別器上,一旦出現(xiàn)混淆或者風(fēng)格混合,就“懲罰”判別器。
上圖為zi2zi 生成中文字體的實(shí)際效果。共有5列,左邊是源字符,右邊是系統(tǒng)自動(dòng)生成的。可以看到,生成的漢字不會(huì)“花”,對(duì)于某些字來(lái)說(shuō),系統(tǒng)生成的和真實(shí)文字幾乎一樣。同時(shí)也能處理更多樣、更復(fù)雜的字體風(fēng)格。
此外,通過(guò)具有連續(xù)的嵌入,我們可以在不同樣式之間進(jìn)行插值,并得到介于兩個(gè)字體之間的狀態(tài):
下面是多對(duì)字體之間過(guò)渡的動(dòng)畫,這些演示了在更動(dòng)態(tài)的上下文中的插值過(guò)程:
使用方法
運(yùn)行環(huán)境可參考鏈接內(nèi)給出的條件。
軟件地址:「IamZLT」開發(fā)中
為了避免IO瓶頸,必須進(jìn)行預(yù)處理,以將數(shù)據(jù)轉(zhuǎn)化為二進(jìn)制數(shù)據(jù)并在訓(xùn)練期間保留在內(nèi)存中。首先運(yùn)行以下命令將字體文件轉(zhuǎn)化為數(shù)據(jù)集:
python font2img.py --src_font=src.ttf
--dst_font=tgt.otf
--charset=CN
--sample_count=1000
--sample_dir=dir
--label=0
--filter=1
--shuffle=1
之后會(huì)生成一一對(duì)照的圖片,其中左邊為希望系統(tǒng)生成的目標(biāo)字體,右邊為系統(tǒng)參照字體,可以使用網(wǎng)上字體較全的字體庫(kù)。
如果你的目標(biāo)字體沒有ttf格式文件的話,也可以使用圖片編輯軟件來(lái)拼接圖片,以達(dá)到以上的效果。然后通過(guò)以下命令進(jìn)行封裝,轉(zhuǎn)換為二進(jìn)制格式。
python package.py --dir=image_directories
--save_dir=binary_save_directory
--split_ratio=[0,1]
運(yùn)行此命令后,將在save_dir下找到兩個(gè)對(duì)象train.obj和val.obj,分別用于訓(xùn)練和驗(yàn)證。然后便可以開始訓(xùn)練。需運(yùn)行以下命令:
python train.py --experiment_dir=experiment
--experiment_id=0
--batch_size=16
--lr=0.001
--epoch=40
--sample_steps=50
--schedule=20
--L1_penalty=100
--Lconst_penalty=15
經(jīng)過(guò)長(zhǎng)時(shí)間訓(xùn)練,最后會(huì)生成矢量SVG文件,導(dǎo)入FontCreator等軟件中便可生成自己的字庫(kù)。
總結(jié)
以上是生活随笔為你收集整理的python生成手写汉字字体_「zi2zi」:用AI生成自己的手写字体的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 奶爸日记12 - 小鱼儿
- 下一篇: pythoncad标注教程,AotuCA