跳至主要内容

進階用法

除了基本的使用方法外,WordCanvas 還提供了一些進階的設定,讓你可以更靈活地控制輸出的文字圖像。在這裡我們引入隨機性的設定,這些特性主要被用來訓練模型。

隨機字型

使用 random_font 參數啟用隨機字型的功能。當 random_font 設定為 True 時,參數 font_bank 才會生效,同時,font_path 會被忽略。

你應該要指定 font_bank 參數到你的字型庫中,因為預設值為套件底下的目錄 fonts,為了範例說明,我們預先在 fonts 目錄下放了兩個字型,因此如果你沒有修改 font_bank 的話,就只會隨機選擇這兩個字型。

import numpy as np
from wordcanvas import WordCanvas

gen = WordCanvas(
random_font=True,
output_size=(64, 512),
font_bank="path/to/your/font/bank"
)

imgs = []
for _ in range(8):
text = 'Hello, World!'
img, infos = gen(text)
imgs.append(img)

# 結合所有圖片一起輸出
img = np.concatenate(imgs, axis=0)

sample17

隨機文字內容

你可能不知道要生成什麼文字,這時候可以使用 random_text 參數。

random_text 設定為 True 時,原本輸入的 text 會被忽略。

import numpy as np
from wordcanvas import WordCanvas

gen = WordCanvas(
random_text=True,
output_size=(64, 512),
)

imgs = []
for _ in range(8):
text = 'Hello!World!' # 這個輸入會被忽略
img, infos = gen(text)
imgs.append(img)

# 結合所有圖片一起輸出
img = np.concatenate(imgs, axis=0)

sample18

指定字串長度

當啟用 random_text 時,你可以使用:

  • min_random_text_length: 最小文字長度
  • max_random_text_length: 最大文字長度

這兩個參數來指定文字的長度範圍。

import numpy as np
from wordcanvas import WordCanvas

# 固定生成 5 個字元的文字
gen = WordCanvas(
random_text=True,
min_random_text_length=5,
max_random_text_length=5,
output_size=(64, 512),
)

imgs = []
for _ in range(8):
img, infos = gen()
imgs.append(img)

# 結合所有圖片一起輸出
img = np.concatenate(imgs, axis=0)

sample19

隨機背景顏色

使用 random_background_color 參數啟用隨機背景顏色的功能。

import numpy as np
from wordcanvas import WordCanvas

gen = WordCanvas(
random_background_color=True,
output_size=(64, 512),
)

imgs = []
for _ in range(8):
text = 'Hello, World!'
img, infos = gen(text)
imgs.append(img)

# 結合所有圖片一起輸出
img = np.concatenate(imgs, axis=0)

sample20

隨機文字顏色

使用 random_text_color 參數啟用隨機文字顏色的功能。

import numpy as np
from wordcanvas import WordCanvas

gen = WordCanvas(
random_text_color=True,
output_size=(64, 512),
)

imgs = []
for _ in range(8):
text = 'Hello, World!'
img, infos = gen(text)
imgs.append(img)

# 結合所有圖片一起輸出
img = np.concatenate(imgs, axis=0)

sample21

隨機文字對齊

使用 random_align_mode 參數啟用隨機文字對齊的功能。

import numpy as np
from wordcanvas import WordCanvas

gen = WordCanvas(
random_align_mode=True,
output_size=(64, 512),
)

imgs = []
for _ in range(8):
text = 'Hello, World!'
img, infos = gen(text)
imgs.append(img)

# 結合所有圖片一起輸出
img = np.concatenate(imgs, axis=0)

sample22

隨機文字方向

使用 random_direction 參數啟用隨機文字方向的功能。

建議將這個參數與 output_direction 一起使用,方便輸出影像。

import numpy as np
from wordcanvas import WordCanvas, OutputDirection

gen = WordCanvas(
random_direction=True,
output_direction=OutputDirection.Horizontal,
output_size=(64, 512),
)

imgs = []
for _ in range(8):
text = '午安,或是晚安。'
img, infos = gen(text)
imgs.append(img)

# 結合所有圖片一起輸出
img = np.concatenate(imgs, axis=0)

sample23

全隨機

如果你想要所有的設定都是隨機的,可以使用 enable_all_random 參數。

啟用這個參數,開啟群魔亂舞模式。

import numpy as np
from wordcanvas import WordCanvas

gen = WordCanvas(
enable_all_random=True,
output_size=(64, 512),
)

imgs = []
for _ in range(20):
img, infos = gen()
imgs.append(img)

# 結合所有圖片一起輸出
img = np.concatenate(imgs, axis=0)

sample24

注意

這個參數不會調整 reinit 系列的參數,例如 random_fontrandom_text 等,這些參數都需要自行設定。

儀表板

我們再次回到儀表板。

dashboard

在隨機性的相關參數啟用時,True 的參數會被標示為綠色,False 的參數會被標示為紅色。

我們希望可以透過這個設計,來讓你快速地確認相關設定。

字型權重

提示

本功能在 0.2.0 版新增。

由於每個字型所支援的文字數量不一致,因此在訓練模型時,我們可能會遇到字型權重不均的問題。

簡單解釋一下,就是隨機選擇字型時的機率是一樣的,但某些文字只有少數的字型才能支援,因此你會發現有些文字幾乎不會被訓練到。

為了緩解這個問題,我們引入了 use_random_font_weight 參數。

import numpy as np
from wordcanvas import WordCanvas

gen = WordCanvas(
random_font=True,
use_random_font_weight=True,
output_size=(64, 512),
)

當你啟用這個參數時,WordCanvas 會根據字型支援的文字數量來調整字型的選擇機率,當字型支援的文字愈少,那被選中的機率就會愈低,以達到均勻分配的效果。

但是還是有不足的地方,我們認為應該是統計所有文字出現的頻率後,再給定選擇權重會比較好,我們預期之後把這個功能發佈在 0.5.0 版。

阻擋名單

提示

本功能在 0.4.0 版新增。

我們在使用字型時,發現有些字型表裡不一。

舉例來說,從字型檔案中可以讀取到該字型所支援的文字列表,但是在實際使用時,卻發現有些文字卻無法正確渲染。

對此我們感到很生氣,所以特別開發了一個阻擋名單的功能,讓你可以將這些字型排除在外。

請使用參數 block_font_list 來設定阻擋名單:

import numpy as np
from wordcanvas import WordCanvas

gen = WordCanvas(
random_font=True,
use_random_font_weight=True,
block_font_list=['阻擋名單字型']
)

我們已經預先建立了一個阻擋名單預設值 DEFAULT_FONT_BLOCK_LIST,只要讓我們有找到一個明明不支援,但又出現在字型表裡的字型,我們就會把它列入阻擋名單:

DEFAULT_FONT_BLOCK_LIST = [
"AbyssinicaSIL",
"AdobeBlank",
"Akatab",
"Alkalami",
"Andika",
"AnnapurnaSIL",
"AoboshiOne",
"AppleGothic",
"BM-HANNA",
"CharisSIL",
"DaiBannaSIL",
"FlowCircular",
"GentiumBookPlus",
"Harmattan",
"GentiumPlus",
"IMFeFCsc28P",
"JejuGothic"
"JejuMyeongjo",
"KayPhoDu",
"KouzanMouhitu",
"KumarOne",
"LastResort",
"LakkiReddy",
"Lateef",
"LisuBosa",
"Lohit-Devanagari",
"Mingzat",
"Namdhinggo",
"Narnoor",
"NotoColorEmojiCompatTest",
"NotoColorEmoji",
"NotoSansDevanagariUI",
"NotoSansHK[wght]",
"NotoSansJP[wght]",
"NotoSansKR[wght]",
"NotoSansSC[wght]",
"NotoSansTC[wght]",
"NotoSerifHK[wght]",
"NotoSerifJP[wght]",
"NotoSerifKR[wght]",
"NotoSerifSC[wght]",
"NotoSerifTC[wght]",
"NotoSansOldHungarian",
"NuosuSIL",
"Padauk",
"PadyakkeExpandedOne",
"Ponnala",
"RedHatDisplay",
"RedHatMono",
"RedHatText",
"Ranga",
"RaviPrakash",
"RubikPixels",
"Ruwudu",
"ScheherazadeNew",
"SoukouMincho",
"Walkway",
"851tegaki_zatsu_normal_0883",
]

小結

在開發工具的過程中,我們的目標是創建一個能夠靈活地生成各種文字圖像的工具,特別是為了機器學習模型的訓練。

隨機性的引入旨在模擬現實世界中的各種情況,這對於提高模型的適應性和泛化能力有極大的幫助,希望你會喜歡這些功能。