使用 Glyph GAN 生成缺字並補全 Zen Maru Gothic

Glyph GAN是一種專門用來補全字型缺字的生成對抗網路(GAN)。


📌 Glyph GAN 是什麼?

Glyph GAN 是一種基於 生成對抗網路(GAN) 的字型補全技術,能夠學習一組字型的風格,然後根據另一個字型的結構來補全缺字。它的工作流程通常包括:

  1. 輸入已知字型(Noto Sans) → 學習其輪廓特徵。
  2. 學習 Zen Maru Gothic 風格 → 讓模型學會這種圓潤的筆畫。
  3. 生成缺字(如罕見漢字) → 補全 Zen Maru Gothic 風格的缺字。

🛠 Glyph GAN 的訓練步驟

這裡我們將 Noto Sans → Zen Maru Gothic 作為字型風格轉換的主要目標。

1️⃣ 準備數據集

我們需要一組 對應的字型數據

  • 輸入字型 (Source):Noto Sans(作為結構參考)。
  • 目標字型 (Target):Zen Maru Gothic(作為風格學習)。
  • 訓練數據:兩種字型的對應字母/漢字,存成圖片格式。

你可以使用 Python fontTools 來提取字型並轉換為圖像:

from fontTools.ttLib import TTFont
from PIL import Image, ImageDraw, ImageFont

# 讀取 Noto Sans 和 Zen Maru Gothic 字型
noto_font = ImageFont.truetype("NotoSansJP-Regular.otf", 128)
zenmaru_font = ImageFont.truetype("ZenMaruGothic-Regular.ttf", 128)

# 產生字型圖片
def generate_glyph_image(char, font, img_size=(128, 128)):
img = Image.new("L", img_size, color=255) # 白底黑字
draw = ImageDraw.Draw(img)
draw.text((10, 10), char, font=font, fill=0)
return img

# 測試:生成 "漢" 字的字型圖片
char = "漢"
noto_img = generate_glyph_image(char, noto_font)
zenmaru_img = generate_glyph_image(char, zenmaru_font)

# 保存圖片
noto_img.save("noto_sans_漢.png")
zenmaru_img.save("zen_maru_漢.png")

這樣,你就有了一組對應的字型圖像,可以用來訓練 Glyph GAN。


2️⃣ 訓練 Glyph GAN

Glyph GAN 需要 兩組對應的字型圖片 作為輸入:

  • X(結構參考):來自 Noto Sans 的字型。
  • Y(目標風格):來自 Zen Maru Gothic 的字型。

這裡我們使用 pix2pix GAN(條件 GAN) 來訓練:

import torch
from torchvision import transforms
from torch.utils.data import DataLoader, Dataset
from PIL import Image
import os

# 影像轉換
transform = transforms.Compose([
transforms.Grayscale(num_output_channels=1), # 轉灰階
transforms.Resize((128, 128)),
transforms.ToTensor(),
])

# 自定義 Dataset
class FontDataset(Dataset):
def __init__(self, noto_dir, zenmaru_dir, transform=None):
self.noto_files = sorted(os.listdir(noto_dir))
self.zenmaru_files = sorted(os.listdir(zenmaru_dir))
self.noto_dir = noto_dir
self.zenmaru_dir = zenmaru_dir
self.transform = transform

def __len__(self):
return len(self.noto_files)

def __getitem__(self, idx):
noto_img = Image.open(os.path.join(self.noto_dir, self.noto_files[idx])).convert("L")
zenmaru_img = Image.open(os.path.join(self.zenmaru_dir, self.zenmaru_files[idx])).convert("L")

if self.transform:
noto_img = self.transform(noto_img)
zenmaru_img = self.transform(zenmaru_img)

return noto_img, zenmaru_img

# 設定數據路徑
noto_dir = "/root/AI/datasets/noto_sans"
zenmaru_dir = "/root/AI/datasets/zenmaru"

# 建立數據集
dataset = FontDataset(noto_dir, zenmaru_dir, transform=transform)
dataloader = DataLoader(dataset, batch_size=16, shuffle=True)

然後,使用 pix2pix GAN 來訓練:

from pix2pix_model import Pix2Pix  # 需要下載 pix2pix 的 PyTorch 實作

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

# 初始化 pix2pix 模型
model = Pix2Pix(input_channels=1, output_channels=1).to(device)

# 訓練
num_epochs = 100
optimizer = torch.optim.Adam(model.parameters(), lr=0.0002, betas=(0.5, 0.999))

for epoch in range(num_epochs):
for noto, zenmaru in dataloader:
noto, zenmaru = noto.to(device), zenmaru.to(device)

loss = model.train_step(noto, zenmaru, optimizer)

print(f"Epoch {epoch + 1}/{num_epochs}, Loss: {loss:.4f}")

這樣,模型就會學習如何將 Noto Sans 結構 → Zen Maru Gothic 風格,並能夠自動補全缺失的字!


3️⃣ 生成缺字

當訓練完成後,你可以使用 Glyph GAN 來生成新的 Zen Maru Gothic 缺字:

# 讀取 Noto Sans 缺字
noto_missing = Image.open("noto_sans_missing.png").convert("L")
noto_missing = transform(noto_missing).unsqueeze(0).to(device)

# 生成 Zen Maru Gothic 風格的缺字
model.eval()
with torch.no_grad():
generated_zenmaru = model(noto_missing).squeeze(0).cpu()

# 轉換為圖片並保存
generated_img = transforms.ToPILImage()(generated_zenmaru)
generated_img.save("zen_maru_generated_missing.png")

這樣,你就能得到 Noto Sans 缺字補全後的 Zen Maru Gothic 版本


🚀 與 Stable Diffusion Inpainting 的比較

方法優點缺點
Stable Diffusion Inpainting可以用 prompt 調整風格,適合一般圖像補全可能產生不穩定的筆畫,字型變形
Glyph GAN精確保留 Noto Sans 結構,生成更穩定的 Zen Maru Gothic 風格需要訓練模型,資料準備較繁瑣

如果你的目標是 大量補全缺字Glyph GAN 更適合,因為它的結果更一致,而且能精確模仿字型風格!


📌 結論

Glyph GAN 可以透過 學習 Noto Sans → Zen Maru Gothic,來生成缺字的 Zen Maru Gothic 字型。
比 Stable Diffusion 更精確,不會隨機變形筆畫。
可以大規模補全 缺失的漢字或特殊符號。

如果你的目標是 自動補全 Zen Maru Gothic 缺字,並保持字型一致性,Glyph GAN 會是更理想的選擇!🚀

發佈留言

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