AI造字經驗分享

這次的分享,純粹是囫圇吞棗式分享,沒有什麼太難的技術在裡面,只要準備好:

  • 原作者的字型檔(或你的手寫字圖檔)。
  • 免費的思源黑體(或思源宋體)。
  • 整理原作者字型裡有的字。
  • 繪圖軟體:非必要。如果需要微調產生出來的圖檔,建議學習一個繪圖軟體,小畫家也可以,不一定需要會編輯向量圖,如果會的話,是有幫助,我用的繪圖軟體是krita。
  • FontCreator/FontForge 用來產生字型檔。

然後就可以開始做「筆跡」的學習,進階的用法是倒過來做筆跡的鑑定。

在這裡要推薦一部好看的韓劇,剛好就是在做上面這二件事情,劇名是《啟動了》或《Start-Up》(韓語:스타트업),在台灣及港澳的譯名是《Start-Up:我的新創時代》,為韓國tvN於2020年10月17日起播出的週末連續劇,劇中對 AI 的使用,還有商業模式與簡報的展示有非常深入且專業的見解,最後一集我沒看,因為我個人比較喜歡男配角(金宣虎)。在Netflix 上翻譯是「我的新創時代」。

Start-Up的海報。 本海報作品的著作權據信屬於電視的經銷商、電視的出版者或者海報設計者。

這次分享,完全不需要寫程式,而且原作者的程式,我也看不懂他在寫什麼,還好,都用作者放上來的範例參數,只帶入我們收集到的字型檔,就完成了。

針對沒有字型檔的情況,也可以手動先收集筆跡圖片,使用手機拍照或掃描手寫字圖片,先把類比轉數位,手動產生訓練所需要的對應用的paired_images ,就可以讓電腦來學習你的筆跡,用AI造字。

認識 Pix2pix

  • github: https://github.com/phillipi/pix2pix
  • Pix2pix 是一種 Conditional GAN(CGAN),主要用於圖像和圖像之間的映射,或稱為圖像轉譯。
  • cGAN(conditonal generative adversial network),可以自動生成符合某些條件或特徵(condition)的圖像。
  • 由於 Pix2pix 是圖像的一對一映射,我們在訓練時必須採用成對的(Paired)資料進行訓練。

認識 CycleGAN

github: https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix

CycleGAN 是一種將GAN應用於影像風格轉換(Image translation)的非監督式學習演算法。與Pix2Pix不同,CycleGAN的輸入資料不是pair-to-pair的資料,因此CycleGAN演算法可以解決不同domain的成對資料獲取困難的問題。

認識 zi2zi (字到字)

github: https://github.com/kaonashi-tyc/zi2zi

Learning eastern asian language typefaces with GAN. zi2zi(字到字, meaning from character to character) is an application and extension of the recent popular pix2pix model to Chinese characters.

Details could be found in this blog post.

zi2zip 使用上的重點

  • 準備訓練所需資料,先把字型變成圖片。
    font2img.py
  • 一張一張分開的圖片檔案,打包成單一個訓練檔案。
    package.py
  • 在 google colab 上訓練
    train.py
  • 推論出原作者未設計過的字,推論滿快的,不一定需要使用GPU的電腦
    infer.py

Googe Driver 上的 colab 程式碼:

Step 1: 安裝 Google Driver,

Step 2: 把 github 下載的 zi2zip 程式碼放在 Google Driver 同步的目錄裡.

Step 3: 在 Google Driver 裡新增一個 colab, 增加下面的Code, 並按三角型來執行,掛載 Google Driver 到 colab.

from google.colab import drive
drive.mount('/gdrive')

附註: 可以使用下面的範例來測試,有沒有正確地切換到有GPU 的執行環境:

import torch
flag = torch.cuda.is_available()
if flag:
    print("CUDA可使用")
else:
    print("CUDA不可用")

Step 4: 使用下面的指令, 開始算圖.

%cd '/gdrive/My Drive/Colab Notebooks/zi2zi-pytorch'
!python train.py --experiment_dir=experiments \
--experiment_data_dir=/root/data \
--gpu_ids=cuda:0 \
--input_nc=1 \
--batch_size=128 \
--epoch=60 \
--schedule=30 \
--sample_steps=2000 \
--checkpoint_steps=500

如果是接續前一個 checkpoint 來算, 增加 –resume= 參數.

%cd '/gdrive/My Drive/Colab Notebooks/zi2zi-pytorch'
!python train.py --experiment_dir=experiments \
                --experiment_data_dir=/root/data \
                --resume=22 \
                --gpu_ids=cuda:0 \
                --input_nc=1 \
                --batch_size=64 \
                --epoch=100 \
                --schedule=20 \
                --sample_steps=2000 \
                --checkpoint_steps=500

附註: 為了避免 Google Driver 搬檔案到 colab 較慢的問題, 可以把 experiment_data_dir 放到 colab 的本地端的儲存空間裡.

Max造字心得

  • 一定要 GPU 或 TPU
    我曾在自己的筆電上執行過,由於沒有顯示卡的 GPU 支援,跑了 24小時,連 1/40 都沒完成,要執行深度學習,請一定需要在有 GPU 的電腦或伺服器上執行,才能事半功倍。我是多創了一些 google 帳號,依序在不同的帳號裡透過 google colab 來做訓練。
  • 要訓練多久?
    有些字型,才訓練了 12 小時,效果就滿好的,一直重覆還有慢慢餵一些自己精選過,想加強訓練的資料之後,效果會再更好,我 fork 出來的專案,有人在 issue 裡問過這一個問題,上一個作者回答說,這個答案很玄,因為連一開始的原作者都沒有一個答案,最後訓練的結果,可能反而效果會更糟,反正有空就丟著給電腦自己去學,總有一個版本效果會好一點。
  • 製作出一個字型檔,需要花多久時間?
    這個取決於多個因素,如果開發著只有一個人的情況來算,要畫出教育部公告的「常用國字標準字體表」的4808個常用字,每一個字花費5分鐘,一個小時不休息可以畫出20張,一天畫10小時,用 24天就可以達標了。但4808字完全不夠用,大多的字型都是做到 9,000 ~ 12,000 字左右,才會比較不缺字。
  • EuphoriaYan/zi2zi-pytorch 與 xuan-li/zi2zi 的差異
    這個問題有點難懂,原作者的回答是:

zi2zi-pytorch網絡和原版有變動的是在net_D部分倒數第二層加了個1 x 1的卷積,我測試了一下帶或不帶這個1 x 1卷積,感覺和原版差距不大;所以我就沿用了這個帶1 x 1卷積的,可以加快速度減小模型大小,您可以嘗試去掉這個1 x 1卷積試試。
還有一個修改點是我們的數據增強方法是基於Font2Font的,和原版不完全一致,您可以查看一下dataset.py里的DatasetFromObj函數,並嘗試修改回原版的數據增強方法。
此外,我們在測試的時候,確實有時候模型會經歷「學習」->「崩潰」->「重新學習」這種情況,所以我們目前工作的時候是先生成一堆sample然後看哪個checkpoint的sample最好。暫時我們沒時間來修復這個問題,生成效果不佳可能和這個問題也有關係,原作者也說了這網絡相當難以訓練(哭)。您可以嘗試在訓練時不只看last_ckpt_sample,也看看別的ckpt的sample,說不定就有哪個ckpt的sample比較好(玄學)

https://github.com/EuphoriaYan/zi2zi-pytorch/issues/3
  • 免費版colab 的限制
    google colab 號稱可以用 12小時,實際上也許 3.5小時,就把 GPU 可以使用的額度用滿了,這時候就把 checkpoint 資料夾裡產生出來的結果,分享給下一個帳號去使用,就可以使用下一個 google 帳號接著做訓練了。參考看看「免費版colab 的限制」:
    https://stackoverflow.max-everyday.com/2021/05/free-colab-resources-limit/
  • 垃圾進,垃圾出
    要拿去訓練的資料,要慎重選擇,這個有另一個講法叫「資料清洗」(Data Cleansing)。我有試過使用 CJK TC(台標體) 的思源黑體,搭配日系的字型,訓練結果大多是很滿意,但由於文字的部件寫法不同,一開始是使用 CJK JP(日本漢字)的思源黑體去推論時,就可能會省下一些後續處理的時間。
    例如:日系的草部都是相連的,所以要AI推論出分開的草部的寫法,就不太可能。
  • checkpoint 中繼檔案的取得
    在 google colab 上訓練的結果,重點就是要取得訓練結果的 checkpoint 檔案,如果資料量有7000筆,使用 batch_size=32 / checkpoint_steps=1000 這2個參數下去訓練,大約每1個小時,可以取得一個 checkpoint 的中續檔案。如果調高 batch_size 為 2倍大,記得降低 checkpoint 的 step 數量為 1/2 ,不然就是 2個小時,才能拿到一個 checkpoint, 萬一在 2個小時內就把 google colab 的 GUP 的額度用完,那就是今天應該是白做工了,會完全無法拿到任何可以產出的檔案,因為只用 CPU 超級的慢,進度幾乎動不了。這時就是改用其他google 帳號,重做一次訓練,並調整參數。心得,這些參數應該都不太需要調整,用預設值就好了。
  • 重覆訓練少量資料的影響
    比如說,有幾個部件在 infer 的結果看起來因為寫法差異太大,所以初期效果很差,會有很明顯的某一筆畫中斷,中間有大面積的白色,剛好上半部是像思源,下半部是要學習的筆跡,如果只取出要加強的學習的某些圖片,重覆地學習,的確就會愈來愈像要學習的筆跡,相對其他沒有去練習的部件,就會明顯被弱化,infer 出來的就會變糊糊的。這個似乎沒有辦法避免,只好再做幾次完整(所有部件)的訓練,在接著使用完整的部件再去訓練個60個epoch,結果剛才加強訓練的成果似乎被稀釋掉,又打回加強訓練前的模樣,有可能是受到其他訓練資料的交互影響,有訓練還是有差別,有些其他部件的小細節有增加的更有連貫性,外型較清晰。

    二個在學習的字跡差異太大,會「大量」增加學習的負擔,所以最好可以選擇在「寫法」或「筆觸」都相近的字體來學習,效率上會好很多,不一定要用思源黑體或思源宋體去學,只是使用思源家族,可以 infer 出來的字集會比較完整。在「選擇要學習的2個字跡」有點難取捨。

    最佳的情況就是要學習的字跡超級的工整,這是最佳、最省時間的情況,但似乎很難遇到。很多手寫字型的部件,會遇到出現的位置不太固定,也會造成學習效果較慢。

    有部份作者的風格有點特殊,相同的部件有時是曲線,有時是直角,也會造成學習上的困難。
  • learning rate decay
    要設多少才開始 decay, decay 的影響是什麼?預設值是 20, 也可以挑戰一直訓練,不要產生 decay, 但這樣就會訓練的較慢,適當的 decay 效果滿好的,尤其是從 1.0 到 0.5, 初期 decay 訓練出來的結果會有大量的波紋與大量的雜訊,但再持續訓練後,線條就會平滑許多,有些多的雜點明顯少掉很多。
    大約訓練到第 30小時之後,每次decay 會很明顯會破壞畫質,會產生大量的雜點或分叉。
左邊是第21 checkpoint, 右邊是第22 checkpoint。
  • 中文/英文/符號要一起訓練嗎?
    如果筆跡的規則簡單,一起訓練滿省事,但是一般的情況下,建議分開訓練會好一些,變數較少,問題會較少。而且部份有風格的字型,中文字套用的風格跟英文不太一樣。
  • 訓練資料「多對一」的問題
    手寫字型每個字都是獨特的存在,如果使用思源黑體,比如”女”的部件,在工整的思源黑體或宋體,女出現的位置幾乎會相同情況下,拿來訓導的資料卻都是不一致的寫法,如此,預測難度變的極高,產生的結果會偏向平均值,且較模糊。

    有曾經遇到一個字型,規則明明就很簡單,應該很容易可以訓練出來,例如「斥」部件,很奇怪,餵了很多「斤」與「斥」部件的資料,訓練了6小時,某一些部件就是訓練不出來,筆畫會中斷,推測應該是先使用思源黑體CJK JP去學習,但對「點」的寫法遇到不一致的情況,然後再改用思源黑體CJK TC去推論,CJK JP與TC 剛好在 刃、斥、凡、丸系列的寫法不剛,造成AI在訓練初期的障礙。
  • 訓練出來的結果比原作者對齊位置更準確,規則更一致
    有些成功訓練出來的字,會比原作者的規則更明確,也可能是因為AI學習到的統計值偏向平均值,所以套用出來的規則沒辦法很多個,以下圖來說,黑色是原作者,套用圓角的時間點有特定的規則,有時是圓角,有時是直角,AI訓練出來是紅字部份,幾乎都是套出圓角風格,如果把特定規則的字與一般規則的值,都一起訓練時,就會產生特定規則的字的權重被一般規則同化掉。這個解法,需要把這種有特殊規則的字挑出來,增加訓練次數,就可以增加特定規則的權重。

    就是對齊、中宮緊與鬆的配置比例,AI訓練出來結果常常優於對空間感較遲鈍的我們一般人。

Youtube 影片

AI造字經驗分享
https://youtu.be/-2V5H_4kSg4


深度學習崛起,企業擁抱AI

科技大廠們,紛紛押寶AI,也帶動一般企業投資AI,但企業要如何運用科技,促成商業發展?企業在使用AI 要來解決什麼問題?要使用什麼演算法?要套用那一個模型?會遇到什麼資安或相關法規。這些問題,我都沒有答案,但google 一下,似乎很多文章都有回答這類問題。

相關法規最近的新聞報導:麥當勞被指控違反伊利諾伊州的BIPA( Biometric Information Privacy Act,生物識別資訊隱私法),在使用語音識別技術接受訂單、收集聲紋資訊之前,沒有經過他的同意,也未告知這些資訊的處理方式、儲存時間等內容。

反正,AI 是趨勢,有空時多接觸看看。也許,有一天用的到,而且萬一將來真的要去學的話,會比較好理解。


相關文章

苦累蛙圓體 Kurewa Gothic
https://max-everyday.com/2021/06/kurewa-gothic/

馬路口圓體 Maruko Gothic
https://max-everyday.com/2021/07/maruko-gothic/

github – zi2zi-pytorch
https://github.com/max32002/zi2zi-pytorch

學習字體的筆記
https://codereview.max-everyday.com/font-readme/

Facebook網友回應

您可能也會感興趣的文章...

自製澆水器

生活小事

WOW,太神奇了吧!小狗的喝水碗應該也可以用。室內的花盆有了這個應該會方便很多… 買一支膠槍才NT$89元耶,而且會送到家裡。 http://24h.pcho […]

Read More

常見的「台灣閩南語常用字」整理

生活小事

針對再幾十年後可能會消失的台語,Max想幫台語做點事情,整理一下台語常用字,對其他字型的開發者會有所幫助。如果有了不缺字的字體,對於在使用字體的創作者或接收訊息的民眾,也 […]

Read More

How to make the world’s sneakiest greeting card

生活小事

哇!好好玩哦!像是魔術~,原理在透明的塑膠板。   Video: https://www.facebook.com/BabyFirstTV/videos/101 […]

Read More

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *