[论文阅读] Few-shot Font Generation by Learning Style Difference and Similarity

Pre

title: Few-shot Font Generation by Learning Style Difference and Similarity
accepted: arXiv 2023
paper: https://arxiv.org/abs/2301.10008
code: None

关键词:few-shot, 字体生成, 有监督, 对比学习
阅读理由:紧跟前沿新作

Target

现存FFG方法大多对参考字形进行风格/内容解耦,又细分为全局或组件级,效果都不是很好。因为字体风格很难把握,仅凭少许样本,对于缺少艺术知识(artistic knowledge)的人很难定义书写风格,但分辨风格是否一样却是相对简单的。

因此引入了对比学习,学习这个字体风格的差异跟相似(Difference Similarity),即DS-Font。

贡献:

  1. 重新审视字形的风格表示,提出新的FFG方法,而非通用或组件层级的风格表达
  2. 提出MSP模块,CCS损失,多任务patch判别器,充分利用大量的风格信息
  3. 相比SOTA方法有了巨大进步

Idea

在FTransGAN基础上增加multi-task patch discriminator,并提出MSP去编码多尺度风格特征,将每种风格的类别中心特征存入内存字典,用以计算对比损失。

Background

现存FFG方法很难保证准确地解耦风格内容,也就不好保证参考字形跟生成结果在组件层面上风格一致。一些研究(MF-Net, FsFont)使用注意力机制捕获多级风格样式,但这忽略了不同风格字形的差异跟相同风格字形的相似性(the difference between glyphs in different styles and the similarity of glyphs in the same style),导致了局部失真或风格不一致。

Related Works部分有以下几个小节:

  1. Image-to-Image Translation
  2. Many-shot Font Generation
  3. Few-shot Font Generation

Method(Model)

Overview

图2 DS-Font总览。

图3 MSP模块总览。通过卷积提取多尺度特征,再使用projector得到多个风格编码z

算法1 DS-Font训练过程

如图2所示,DS-Font由三个关键成分构成。输入为单个内容图\(I_c\),跟多个风格图\(I_s\),输出结果\(I_{cs}\)。每个epoch首先把所有图片都喂入MSP,得到相应风格编码,并根据风格标签计算每个风格的类别中心,再把该类别中心的编码\(\hat{z}_j\)存进内存字典中。

\(I^+, I^-\)分别是跟\(I_{cs}\)相同、不同风格的图片。然后把\(I_{cs}\)扔进MSP得到风格编码,作为查询\(\hat{q}\)\(\hat{z}^+, \hat{z}^-\)分别是对应字体跟其他字体图片的编码,用作正、负样本,就能计算出 cluster-level 对比风格损失\(\mathcal{L}^G_{contra}\),此外还有对抗损失跟L1损失。

Multi-layer Style Projector

字体风格精细复杂,特征抽取要考虑不同尺度,如 component-level, stroke-level, 和 even edge-leve。如图3,MSP可以将多层特征分别投影到独立的隐风格空间,编码不同粒度的风格。

这里3种尺度分别对应图片 1, 1/2, 1/4 的原始分辨率,然后通过平均池化和最大池化分别获取通道方向的(channel-wise)均值和峰值,但图3画的两个都是 Maximum Pooling。然后再将其分别投影成K维风格编码:

\[z_{i} = M(I_{s}),i\in[1,3], \tag{1} \]

其中M表示MSP模块,\(I_s\)是风格图。

Multi-task Patch Discriminator

之前工作有的是用两个patch判别器分别区分内容跟风格,还有是用多任务判别器去辨别不同的风格/内容。前者只区分是否正确,而不考虑不同类别间的差异,后者分辨整张图取忽略图中每个部分的贡献(没用patch)。

结合二者提出的判别器能够独立判别图片的不同区域,有助于\(I_{cs}\)的局部细节跟groundtruth更一致。后面大致介绍处理流程,最终输出为\(N\times N\)的矩阵。

Generator

基于FTransGAN的 encoder-transformation-decoder 结构,transformation模块的设计灵感来源于《Few-shot font style transfer between different languages》。通过自足毅力跟层注意力模块汇聚风格特征,以此捕捉局部与全局特征。

Loss Function

Cluster-level Contrastive Style (CCS) loss

Cluster Contrast (《Cluster Contrast for Unsupervised Person Re-Identification》) 使用离线聚类方法构建 cluster-level 内存字典,并使用MoCo的动量更新策略思想更新该字典,解决了内存字典中特征不一致的问题,减少了计算开销。用CCS损失训练MSP模块,可以拉近相同字体,分开不同字体。

训练中每个epoch开始,用MSP编码所有\(I_s\),再根据风格标签将其分成不同的类别,然后计算每个类的类别中心,再将其存进内存字典中。每个iteration里把groundtruth(目标字体的字形图片)喂入MSP,抽取K维向量\(z\)的集合作为查询\(q\)。所有向量都会进行normalize,避免坍塌。

通过最大化\(q,\; z^+\)之间的互信息,能学到图片的视觉风格,根据 Cluster Contrast 那篇论文可以定义CCS损失来训练MSP模块:

\[\mathcal{L}_{c c s}^{M S P} = -\sum_{i=1}^{3} \log \frac{e x p(q\cdot z_{i}^{+}/\tau)}{\sum_{j=1}^{N} e x p(q\cdot z_{i_j}/\tau)}, \tag{2} \]

其中\(z_{i_j}\)表示内存字典里的所有样本,包含\(z_i^+, z_i^-\),N为样本数量。\(\tau\)是温度缩放因子,本文所有实验中都被设置为0.05。每个iteration使用动量更新策略去更新内存字典里的向量,动量设为0.1。整个式子看起来是InfoNCE的组合,i代表不同的尺度,希望q能与对应的\(z^+\)更相似/更接近。

该方法也能用于生成器的训练,跟公式2差别在于查询q现在并非groundtruth,而是\(I_{cs}\)

\[\mathcal{L}_{c c s}^{G} = -\sum_{i=1}^{3} \log \frac{e x p(\hat{q} \cdot \hat{z}_{i}^{+}/\tau)}{\sum_{j=1}^{N} e x p(\hat{q}\cdot \hat{z}_{i_j}/\tau)}, \tag{3} \]

其中\(\hat{q},\; \hat{z}_{i_j}\)分别是\(I_{cs},\; I_+\)的编码,\(\hat{z}_{i_j}\)同样代表内存字典的所有样本。

Adversarial loss

\[\mathcal{L}_{a d v}^{D} = \mathrm{E}_{(I_{r},y_{c},y_{s})}\left[\left[1-D(I_{r},y_{s})\right] + \left[1-D(I_{r},y_{c})\right]\right] + \mathrm{E}_{(I_{c s},y_{c},y_{s})}\left[\left[1-D(I_{c s},y_{s})\right]+\left[1-D(I_{c s},y_{c})\right]\right], \tag{4} \]

\[\mathcal{L}_{a d v}^{G} = \mathrm{E}_{(I_{c s},y_{c},y_{s})} \left[D\left(I_{c s},y_{s}\right)+D\left(I_{c s},y_{c}\right)\right], \tag{5} \]

其中\(I_r\)是groundtruth,\(y_s,\; y_c\)分别为风格、内容标签。感觉这个式子怪怪的,说是hinge loss,但公式4里对于 \(I_r,\; I_{c s}\) 的期望不该一样吧,对判别器来说二者应当有相反的判断。

L1 loss

\[\mathcal{L}_{1}=\|I_{r}-I_{c s}\|_{1}. \tag{6} \]

Full Objective

\[\mathcal{L}_{D} = \mathcal{L}_{a d v}^{D}, \tag{7} \]

\[{\mathcal L}_{G}=\lambda_{1}{\mathcal L}_{1}+\lambda_{2}{\mathcal L}_{a d v}^{G}+\lambda_{3}{\mathcal L}_{c c s}^{G}, \tag{8} \]

\[\mathcal{L}_{M S P}=\mathcal{L}_{c c s}^{M S P}, \tag{9} \]

\[\mathcal{L}=\mathcal{L}_{D}+\mathcal{L}_{G}+\mathcal{L}_{M S P,} \tag{10} \]

\(\lambda_i\)用于控制每个损失项的权重。

Experiment

Dataset

用FTransGAN的数据集,847个灰度字体,每个都有近1000个常用汉字跟52个拉丁字母。测试集由Unseen Characters Seen Fonts (UCSF)、Unseen Fonts Seen Characters (UFSC)两部分组成。其中29个字跟字体(characters and fonts,UCSF有29个没见过的字,UFSC有29个没见过的字体?)作为未知的内容与风格,其他部分用作训练数据。

DS-Font基于Pytorch,选用普通字体(微软雅黑)为内容输入,风格输入有6个字。公式8中\(\lambda_{1}=100,\; \lambda_{2}=1,\; \lambda_{3}=0.5\)。模型用Adam训练20个epoch,batchsize为256.

Metrics

L1 loss ↓ ; LPIPS ↓ ; RMSE ↓ ; Acc(C) ↑ Acc(S) ↑ FID(C) ↓ ; FID(S) ↓

Acc(C), Acc(S) 由两个分类器分类得到,分别负责内容跟字体标签的准确度

Results

图1 DS-Font生成的结果

表1 测试集上的定量评估。加粗的是最好的,下划线标出的是第二好的结果

图4 测试集上的定性评估

Quantitative comparison. 表1里UCSF、UFSC的结果分别来自29个字、字体的平均值。L1 loss跟LPIPS这种指标关注图片间的平均差异,对局部细节不敏感,会忽略整体特征分布相似度。而FID (S)、Acc (S)上面,DS-Font远好于其他模型,说明本文模型抽取的风格表示更好,生成的字形与参考风格更加一致。

其实也算不上远好于其他模型吧,分数都蛮接近的,除了UCSF上的Acc(S), FID(S),而内容相关的指标则十分接近,尤其是Acc(C)甚至好多0.999,这是否说明该数据集的字比较好辨认但风格难学,会不会是艺术字体较多。

Qualitative comparison. 结果看图4,DS-Font学到了笔画末端的细节风格样式,尤其是前两列,很明显,效果很惊艳。LF-Font无法维持源字符的全局结构(第3/4列),MX-Font无法生成复杂字体(最后两列),DG-Font生成的结果仍然有形状不对的(第7/8列),FTransGAN用上下文感知注意力网络捕获全局跟局部特征,却忽略了细粒度的局部风格(第11/12列),MF-Net会出现伪影跟黑点(第10/11列。而且这里虽然给了source,但不知道风格字是什么,不过附录里的图8是有给出的,风格参考跟内容参考可以不是同一个字

Ablation Study

图5 DS-Font不同变体的视觉质量比较。(a) 原图 (b) 用两个 patch discriminators 且不使用 CCS loss. (c) 用一个 multi-task discriminator 且不使用 CCS loss. (d) 用一个 multi-task patch discriminator 且不使用 CCS loss. (e) 用一个 multi-task patch discriminator 且使用 CCS loss. (f) ground truth.

表2 DS-Font里不同部分的作用。第四行的CCS loss是在第三行的基础上加入的。

Multi-task patch discriminator. 比较 patch discriminator, multi-task discriminator 跟本文提出的 multi-task patch discriminator。在 patch discriminator 的设置中,需要两个,一个负责内容另一个负责风格。看图5跟表2,multi-task patch discriminator(图5第3行)在几乎所有指标上都优于另两个,作者认为在Acc(C)上只是略低,而且大家都超过了90,差距很小,生成的字形具有足够的内容辨识度。

Cluster-level contrastive style loss. 表2的最后两行可以看到CCS loss极大促进了风格跟内容的分类准确度,FID也有所降低。从图5也可看出加入后有助于捕获局部细节。

Conclusion

设计了MSP模块,提出 cluster-level 对比分格损失,借一步提出 multi-task patch discriminator,同时做了大量实验证明DS-Font超过了SOTA

Critique

文中引用的论文并非使用方括号跟数字的组合([23]),而是作者姓氏跟年份[Zhang et al., 2019b],过长的内容影响阅读,也不方便查找相应参考文献。

Related Works总体而言比较简短,是从比较抽象的层面概述相应领域的发展,而不会具体到每个模型/方法。不过介绍模块时会介绍借鉴的方法,并作比较,可以说将内容分散到各小节中。这也是跟之前的论文不大一样的地方。

图2画得很清晰,尤其是图注描述了模型流程,仅看这张图大概能理解整个方法,行文也比较流畅,少有冗余,附录给了更详细的架构跟流程伪代码,整体观感好。不过虽然附录说会开放完整代码,然而似乎还没有。

图4中DS-Font生成结果特别好,我觉得会不会是L1 loss这种一对一强监督的效果,但没有相关消融实验,比较可惜。直接在像素级上约束 \(I_r,\; I_{c s}\) 一致,效果应该很好,不过需要训练时数据一一对应地进行,而且应该是做不了跨语言的转换。

Unknown

  • 不理解## Background里本文的研究动机,为什么说之前的工作都缺少different/similarity?难道之前没有做对比学习的?
posted @ 2023-05-26 14:56  NoNoe  阅读(403)  评论(1编辑  收藏  举报