小样本字体生成

本文介绍 Few-shot Font Generation 的基本概念和两篇论文。

两篇论文为:

也可参考整理的 slides

1. 背景

不同于英语,由 ASCII 码(8 位二进制,且仅使用其中 7 位)即可表示绝大多数常用字母和符号。中日韩语言由上万个字组成,因此,想构建一个新字体往往涉及大量的工作,需要专业字体设计人员一个字一个字地设计。小样本字体生成(Few-shot Font Generation, FFG)就是在这样的背景下提出的,它希望在给定标准内容字体(通常为宋体或楷体)的情况下,使用少量的风格字(如自己的手写体或新设计字体),就可以由模型自动生成目标风格的其他字。这样,我们仅需花费少量精力设计几个风格字体,其余字由模型自动生成即可,大大降低劳动量。

在 GAN 提出后,FFG 领域取得了许多不错的进展。目前的方法也大多基于生成对抗模型进行字体生成。此外,FFG 领域的一个核心问题就是如何将文字的内容(content)与风格(style)解耦合,模型的不同分支能够分别学习到内容和风格的特征表示。在推理时,给定几个风格字体(称为:reference),风格编码器基于这些 reference 提取特征并进行平均,作为目标字体的风格特征向量。在已有的内容字体上的每个字轮流使用特征编码器提取内容特征,将内容特征与风格特征融合,输入解码器,即可生成目标字体。

下面,分别介绍两篇已有的工作。

2. DF-Font

本文的 motivation 是:不同的字体之间,其笔画、偏旁等常常不在相同的位置,而是有一个区域变换。传统的卷积只能感知固定区域的像素并逐层提取语义信息;而变形卷积能够自动学习偏移量(offset),使卷积核的感受野不再局限于固定的区域,进而能够学习到更好的内容特征表示。下面介绍具体做法。


由上面论文主图可以看出,模型整体分为生成器和判别器两个部分,即典型的 GAN 结构。具体地,生成器包括两个分支:

  • 上面为 style encoder,给定字体图片,将生成图片的风格特征向量
  • 下面为 content encoder,给定字体图片,将生成图片的内容特征图;同时,后面紧跟着 decoder,将内容和风格表示融合,生成目标字体图片
  • 下面的内容表示及生成分支还有两个 FDSC 模块,其应用了变形卷积,图示和具体介绍如下:

可变形卷积实际上由两个卷积核构成:

  • 第一个卷积核输入是 content encoder 的特征图 \(K_c\) 以及后面 mixer 的特征图 \(K_s\);生成 offset 和 mask,即: \[ \Theta=f_\theta\left(K_s, K_c\right) \] 其中,\(f_\theta\) 表示卷积层, \(\Theta=\left\{\Delta p_k, \Delta m_k\right.\) \(|k=1, \cdots,| \mathcal{R} \mid\}\) 为卷积层输出的 offset 和 mask,\(\mathcal{R}=\{(-1,-1),(-1,0), \cdots,(0,1),(1,1)\}\) 表示普通卷积的 offset;

  • 输出 offset 和 mask 后,后续的卷积层 \(f_{DC}\) 将输出特征图 \(K_c^{\prime}\) \[ K_c^{\prime}=f_{D C}\left(K_c, \Theta\right) \] 此时,变形卷积 \(f_{D C}(\cdot)\) 每个像素的计算公式可表示为: \[ K_c^{\prime}(p)=\sum_{k=1}^{\mathcal{R}} w\left(p_k\right) \cdot x\left(p+p_k+\Delta p_k\right) \cdot \Delta m_k \]

然后,介绍损失函数设计,共有 4 个部分:

  • 对抗损失:即 GAN 的损失,用来保证生成逼真的图像:

  • 内容一致性损失:

  • 图像重构损失:

  • 偏移量归一化损失:

总损失表示为:

然后是实验结果:


相比之前方法,本文方法在 unseen fonts 上所有指标表现最好;在 seen fonts 上,感知性指标表现最好,像素性指标则一般。

3. CF-Font

本文是对上篇论文的改进,其主要贡献在于:提出了内容融合模块(Content Fusion Module),让模型学得更好的内容表示。此外,在 loss 及风格特征向量的表示上也有改进,下面具体介绍。


首先是主图,可以发现和前篇文章的确差不多。多出的是 Content Fusion Module 和 Iterative Style-vector Refinement,下面分别介绍。

传统的内容字体选取由两种方式:

  • 对所有目标字体,都选取宋体作为 content font(下图黄色线)
  • 对给定目标字体,从候选集合中选择与目标字体最接近的字体作为 content font(下图红色线)

本文则提出了一种新方法,其从可选的 \(N\) 个字体中提取特征图,进行聚类,聚类中心设置为 \(M\) 个,选择距离聚类中心最近的 \(M\) 个字体作为基字体(basis font);然后,对于给定的目标字体,计算其与 basis fonts 的相似度,经过 softmax 函数后赋予权重;权重与基字体相乘并求和,得到全新的内容特征图表示方式,公式表示如下:

  1. 聚类 \[ \begin{aligned} \boldsymbol{C}_i & =f_{c e}\left(\boldsymbol{I}_i\right),{ }^1 \\ \boldsymbol{d}_i & =\left(d_{i 1}, d_{i 2}, \ldots, d_{i N}\right), \quad d_{i j}=\left\|\boldsymbol{C}_i-\boldsymbol{C}_j\right\|_1, \\ \boldsymbol{e}_i & =\sigma\left(\boldsymbol{d}_i\right), \\ \mathcal{B} & =\operatorname{Cluster}\left(M,\left\{\boldsymbol{e}_1, \boldsymbol{e}_2, \ldots, \boldsymbol{e}_N\right\}\right), \end{aligned} \]

  2. 计算权重 \[ \begin{aligned} \boldsymbol{d}_t^{\prime} & =\left(d_{t 1}, d_{t 2}, \ldots, d_{t M}\right), \quad d_{t m}=\left\|\boldsymbol{C}_t-\boldsymbol{C}_m\right\|_1, \\ \boldsymbol{w}_t & =\sigma\left(-\boldsymbol{d}_t^{\prime} / \tau\right), \end{aligned} \]

  3. 得到新特征表示 \[ \boldsymbol{C}_t^{\prime}=\sum_{m \in \mathcal{B}} w_{t m} \cdot \boldsymbol{C}_m \]

示意图如下:

此外,提出了一个新的 loss,用来在 generated image 和 ground-truth image 的投影分类后的分布施加限制:


公式表示为: \[ \mathcal{L}_p(\boldsymbol{Y}, \hat{\boldsymbol{Y}})=\frac{1}{P} \sum_{p=1}^P \mathcal{L}_{1 d}\left(\phi_p(\boldsymbol{Y}), \phi_p(\hat{\boldsymbol{Y}})\right), \] \(\mathcal{L}_{1 d}\) 表示两个分布之间的差异,可选用推土机距离或者 KL 散度,分布表示为: \[ \begin{aligned} \mathcal{L}_{p c-w d l}(\boldsymbol{Y}, \hat{\boldsymbol{Y}}) & =\frac{1}{P} \sum_{p=1}^P\left\|\frac{\Lambda\left(\phi_p(\boldsymbol{Y})\right)}{\sum \phi_p(\boldsymbol{Y})}-\frac{\Lambda\left(\phi_p(\hat{\boldsymbol{Y}})\right)}{\sum \phi_p(\hat{\boldsymbol{Y}})}\right\| \\ \mathcal{L}_{p c-k l}(\boldsymbol{Y}, \hat{\boldsymbol{Y}}) & =\frac{1}{P} \sum_{p=1}^P \mathbf{K L}\left(\frac{\phi_p(\boldsymbol{Y})}{\sum \phi_p(\boldsymbol{Y})}-\frac{\phi_p(\hat{\boldsymbol{Y}})}{\sum \phi_p(\hat{\boldsymbol{Y}})}\right), \end{aligned} \] 其余损失与上文相同,总损失函数表示为: \[ \begin{array}{r} \mathcal{L}=\mathcal{L}_{a d v}+\lambda_{\text {img }}\left(\mathcal{L}_{\text {img }}+\lambda_{\text {pll }} \mathcal{L}_{\text {pcl }}\right) \\ +\lambda_{\text {cnt }} \mathcal{L}_{\text {cnt }}+\lambda_{\text {offset }} \mathcal{L}_{\text {offset }}, \end{array} \]

在推理阶段,初始化风格特征向量为已有的几个 reference image 特征向量的均值: \[ \boldsymbol{s}_t^{\prime}=\frac{1}{Q} \sum_{q=1}^Q f_{s e}\left(\boldsymbol{I}_t^q\right) \] 然后,设置该特征向量为可学习的,并冻结模型其他部分的参数,使用重构损失微调大约 10 个 epoch:

使用最终微调后的特征向量作为推理时使用的风格特征向量。

最后是实验:


在绝大多数指标上,本文方法均超过已有方法。


小样本字体生成
https://arcsin2.cloud/2023/07/01/小样本字体生成/
作者
arcsin2
发布于
2023年7月1日
许可协议