[论文阅读] Few-shot Font Generation with Weakly Supervised Localized Representations

1. pre

title: Few-shot Font Generation with Weakly Supervised Localized Representations
accepted: TPAMI 2022 (extension of Few-shot Font Generation with Localized Style Representations and Factorization (AAAI 2021))
paper: arxiv | IEEE
code: https://github.com/clovaai/lffont

亮点:few-shot(8), no fine-tuning, 风格内容插值, 跨语言

2. abstract

介绍FFG任务,定义目的和意义。现有的方法忽视局部特征,不适合复杂的文字系统,如中文,其中的字符character由各种组件components构成(常称为'radical')。本文提出了个新的字体生成方法,学习了局部特征,即组件级风格表示,而不是每种字体一个的统一风格表示。当目标文字(target script)组件太多,就很难从一小撮参考字形学到组件风格。由低秩矩阵分解得到灵感,将组件级风格表示为组件和风格因子(component and style factors)的乘积。因为这种强表达和小巧的分解策略的组合,该方法效果特别好,而且只要8个参考字形,特别是不需要每个组件位置、形状(skeleton)?、笔画等强局部监督都不需要。

3. introduction

韩文包括11,172个字符,至少2,350个常用。

图1 同一字符不同字体风格的自立

本文提出的方法只要8个参考字形,而且不用微调模型。
训练需要配对数据,而生成时只需要一些未知风格的样本。

这种场景适合于:

  1. 目标风格字形难以获取,但有许多现存字体的数据
  2. 计算资源不足以微调模型(如移动设备

字体生成任务的主要挑战是字体风格经常是局部的,如笔画、衬线、子字符大小(组件/独体字大小?)(strokes, serif-ness, or size of sub-characters),如图1所示

DM-font也抽取组件风格,效果不错,但要求文字彻底组件化?(complete compositional scripts),如韩语跟泰语,每个韩文字符都可以被分解成固定数量的组件和位置,更复杂的文字系统(中文)就没法用了,效果不好。而且DM-Font要求每个组件至少在参考字符集出现过一次,而且同数量参考字符下效果不如别的模型。

注: 每个韩字有2-6个韩文字母组成,至少包含一个辅音和一个元音。这些字母以从左到右、从上到下的顺序排列。辅音偏左上,元音偏右上,收音放下面(如果有的话),位置、数量都相对固定。

本文的模型LF-Font聚焦于组件式语言系统,其字符要能分解成子字符或组件,见图2。组件标签是弱监督,只需要知道字符是否包含该组件,而不用管位置。不用每个组件的像素级监督就能有不错效果。

定义the localized style representation为组件级风格的结合,降低了风格特征数量(组件相比字符,数量少得多)。但这种方法有缺点:参考字符集必须覆盖完整的组件集才能构建完整字体库,这不可行。因此引入一个分解模块,将局部风格特征分解为组件因子和风格因子。

这篇是AAAI 2021的扩展,引入了如下的额外贡献:

  1. 利用弱监督学习问题重构原始局部特征和相关讨论
  2. 额外的分析和消融研究
  3. 更改参考集尺寸的额外对比
  4. 扩展到few-shot韩文生成
  5. 去除测试时的组件条件,在未知语言上展现优秀的few-shot能力(跨语言)
  6. 展示FFG方法对字符识别系统(character recognition systems)的有效性

Image-to-image (I2I) translation,近来也扩展到学习多个不同域之间的映射

本文的应用场景跟内容风格解耦方法相近,例如风格迁移,但还是不太一样,风格迁移捕捉的风格是给定图片的全局艺术纹理或超现实的颜色,而字体风格是局部的,因此直接套用风格迁移方法并不有效。

大多数的图像翻译任务都依赖为了风格迁移设计的AdaIN,也无法很好地用于字体生成,如这之中的FUNIT并不能捕捉复杂局部风格。

基于属性的生成Attribute-conditioned (AC) generation方法,根据给定的属性条件生成图片,如“棕色头发”、“女性”。字体生成也可视为AC生成任务,因为字形基于许多组件。然而这二者有许多不同,首先字形在每个字体中都是独特定义的,而基于属性的图片则可以通过不同视角、背景和灯光映射到不同的图片上。(符合属性即可,创作自由度大,可能的图片有许多,而字形里面每个组件都不可替换,否则字义就变了。) 第二,字体域很容易获得有相同内容但不同风格的字形图片,但给定属性的可能配对图片就不容易获取了。这里就聚焦于字体特定域的知识,如组合性去捕捉复杂的字形图片局部风格。

Few-shot font generation. 主流方法都是风格内容解耦,AGIS-Net提出了字体专用的局部纹理判别器和局部纹理精炼损失。DM-Font将字形分解为多个风格组件,然后再组装成新字形,用到了强组合性先验。DG-Font用可变形卷积做无监督字体生成,不需要配对的不同字体的字形数据。而本文是为了生成标准的truetype字体库,因此假定有现存的大量配对字形图片,根据现有的字体文件渲染出来不同风格的字形图片。

提及以往方法的几个缺点,以及本文的应对措施。

Many-shot font generation.
SCFont和ChiroGAN用I2I框架做,需要大量目标风格的字形图片,约775。不少模型也考虑了组合性,如RD-GAN,使用额外的LSTM架构去捕捉给定字形的组合性compositionality,但它只能产生固定风格的未知字符。CalliGAN用one-hot编码风格,因此需要额外的微调过程。StrokeGAN用one-bit笔画编码来捕捉中文字符在无配对数据上的关键模式信息。StrokeGAN跟本文的方法都是利用了组合性(或笔画信息),只是一个笔画一个用的组件,对应到NLP里的 character bytes 跟 tokenized words。

Weakly supervised object recognition. 本文的弱监督是图像级多标签,没有像素级标注,因此没有每个组件的准确位置。类似场景在许多弱监督视觉识别任务中都有,...,但都是特定领域的,不好用在few-shot字体生成。例如目标定位object localization 要考虑performance bias,为了解决它,就需要扩展定位图localization map.弱监督目标定位里的adversarial complementary learning (ACoL)提出了个双头架构——一个头作对手,抹除其他产生的高分区域。对于同一问题的attention-dropout layer (ADL)被提出通过通道注意力抹除高注意区域。总之就是这些技术、模型都是特定任务依赖特定预训练网络的,因此效果好但不能直接拿来用。

5. few-shot font generation with weakly supervised localized representations

继续重复提出的方法简介,本节内容概要。

5.1. compositionality: a language-specific image-level weak supervision

图2 标注示例


图3 同一组件标签的字符

许多文字系统都有这个属性:compositionality,字符能被拆分为许多子字符或组件。用得最多的30种文字系统里24种都有这种性质,如Chinese, Hindi, Arabic, Japanese, Korean, and Thai。依赖预先定义的分解规则,所有字符都可以被小量的组件覆盖。如韩语68个,中文小几百(本实验用371个)。图2描绘了组件标签的例子跟其他汉字标注。由图可见,一些汉字有重复的组件,如“呵”有两个“口”,那就两个都放进标签里,不会去重。

图3说明组件标签不包含位置信息(应该也没书写顺序),因此同一标签会对应多个汉字。

5.2. problem definition

对一个字形x需要风格、内容和组件标签,风格总数(字体数?)有482,字符总数19514,以及组件数371,换句话说所有19514个字符都可以由371个组件组合而来。

5.3. localized style representations

这种弱监督类似于弱监督目标定位(weakly-supervised object localization (WSOL))或弱监督语义分割(weakly-supervised semantic segmentation
(WSSS))。利用弱监督指导,因为每个组件像素级的监督太过昂贵。

参考字集\(X_r\)的组件标签应该覆盖所有组件,对汉字来说,至少要229个统一风格的参考字才能取得完整的组件级风格表达。下一节介绍了一种办法减少参考图片的数量。(FsFont也是要参考字集)

5.4. completing missing localized style representations by factorization modules

(记号乱飘,粗略猜测,建议结合图4看,认准对应的字符符号上下标:)
\(f_{s, c}\)是局部风格特征表达,由字符c跟风格s定义(应该想说每种字体的每个字的该特征都各不相同)。如果要合成具有风格s的字c`,就需要\(f_{s, c'}\)。(这玩意是风格表达,字符层面的,依赖于具体的字,就是所需合成的目标字,如果有这个字都不用生成器了,所以才有下面的分解)

但测试时拿不到有风格s的字c`,如果将\(f_{s, c}\)分解为\(\Sigma_u f_{s, u}\),u就是c的组件。意思是把字符拆成了组件,只要学组件的特征就好。但因为是8-shot,从参考字只能获得部分组件,因此具有未知组件的\(f_{s, c}\)将无法计算,生成器也就不能生成,也就是说这种方法还是不够好。

为此将FFG视作重建问题,将组件风格组合视作矩阵的一个元素(an entry of the matrix),假定有些元素缺失,目标是用已有元素重建内容样式的新组合。利用分解模块,假设数据矩阵X有低秩k,\(X=A^T B,\; where \; rank(A) = rank(B) = k << rank(X)\),因此每个元素的值(i,j)可以由\(a^T_i b_j\)计算。

这里矩阵分解的例子,应该是说分解模块\(F_s \; 和 \; F_u\)的输出\(z_s, z_u\)这俩因子是 A、B,然后它们两两组合生成的两份\(f_{s,u}\)才对应 X。

传统的矩阵分解MF算法低效,这里根据 classical matrix completion approaches,将组件风格\(f_{s,u}\)分解为两个因子(用两个分解模块各自抽取):组件因子\(z_u\)和风格因子\(z_s\)。似乎还是从8个参考字提取风格向量,源字符提取组件向量,相乘就是组件风格\(f_{s,u}\)

\[z_s = F_s(f_{s,u}; W,b), \; z_u = F_u(f_{s,u}; W,b) \tag{4} \]

Fs, Fu分别是风格和组件分解模块

仅仅用分解模块无法保证不同字形的同风格(或同组件)因子值一样,所以要加一个一致性损失,见公式5,太长忽略,就是上面的\(z_s, z_u\)分别跟各自的平均值计算L2范数再相加

5.5. generation

风格编码
生成的时候参考字源字都放入\(E_{s,u}\),一个字形会被编码成多个组件级风格特征\(f_{s,u}\)(虚线跟实线分别表示参考字跟源字抽出来的特征),随后将它们都放入\(F_s \; 和 \; F_u\),抽取出\(z_s, \; z_u\),然后风格字源字的\(z_s \space z_u\)两两组合,合成两份\(f_{s,u}\),下面那份结合了风格字的风格跟源字的内容,是目标字形的字符级风格特征,因此可以用于生成目标字(图4上半部分绿色的)

另一方面源字放入\(E_c\),抽取出内容表达\(f_c\)(图4下半部分蓝色的)

根据公式2,\(f_{s,u}\)(各组件特征)相加就成了\(f_{s,c}\)(字符特征),跟\(f_c\)一起喂给生成器就能生成目标字形(图4下半部分红色的)。模型架构见图4

图4 LF-Font模型总览图 (原论文中分辨率很高,但限于电脑屏幕,截图出来就糊成这样)

\(E_{s,u}\)是组件级风格编码器,接收组件标签和字形图片,输出多个组件级风格特征\(f_{s,u}\),然后通过\(F_s, F_u\)变为两个因子\(z_s, z_u\),有多个参考样本就对风格因子取平均,得\(z_{\tilde{s}}\),二者结合得组件级特征\(f_{\tilde{s},u}\)

依赖于character labels(不是组件标签??)的弱监督会阻碍测试时表现,因此用一个辅助分类器来预测给定字形图片的character label。似乎就是训练个分类器,自己根据给定图片生成要的标签,测试时也不用依赖额外标注。

内容编码
说他们的\(E_c\)能捕捉复杂的全局结构信息,像是组件间的相对位置,有利于目标字形的生成。

5.6. 训练

源风格固定,再利用多样的参考风格和列下loss更新模型参数

  1. 对抗损失
  2. 生成图片跟groundtruth的 L1损失 + 二者在判别器各层之间的L1损失
  3. 组件分类损失,组件级判别器Cls接收\(f_{s,u}\)预测组件标签,然后与真值计算交叉熵
  4. 总损失,上述损失加权

训练细节 Adam优化器,判别器学习率0.0008,其他的学习率0.0002,分两阶段对模型进行训练。
因为训练分解模块的同时随机初始化特征会使得收敛不稳定,见消融研究。两阶段训练首先学组件级风格表达,再学分解模块。

第一阶段选择mini-batch,使得目标字符组件能被输入字符组件完全覆盖,对于中文要800k,韩文则是200k iterations。粗略解释了这种mini-batch的选择过程,可以参考图5,总之这阶段就是不使用分解模块,\(E_{s,u}\)输出直接给生成器和组件分类器。

然后第二阶段同时训练所有模块,带上所有目标函数跑50k iterations。mini-batch自然也要变。第二阶段也迫使模型用原始的组件级风格特征重建参考图片,因此模型可以处理原始的和重建的组件级风格特征。

5.7. lf-fontmix: font generation as data augmentation

Mixup跟CutMix是常用的图片增强方法,效果好但增强后的图片不自然,限制了它们再复杂精细数据集上的作用。这里提出LF-FontMix,一种新的mix增强,针对字符识别任务。并非在像素域生成混合图片,而在风格因子空间混合两张图片(感觉就是对两张图片进行线性插值)。

\(z_{s,1} \; z_{s,2}\)分别是两张图片\(x1 \; x2\)的风格因子,混合风格如下定义:

\[\hat{f_s} = \Sigma_{u \in U_c}1^T((λz_{s,1} + (1−λ)z_{s,2}) \odot z_u) \]

where \(\lambda \; in \; [0, 1]\)是结合率,从\(\Beta(\alpha, \alpha)\)采样而来。生成混合图像\(x_{mix}(x_1, x_2) = G(\hat{f_s}, f_c)\),因此目标标签和目标字符c一样。

这种策略可以产生复杂多样的字体风格还不用混合标签。
字符混合策略会同时混合图片跟标签,但增强的风格可能有限。
实际训练中每iteration轮流使用风格级跟字符级LF-FontMix去利用这两个策略。

注:关于mixup, cutout, cutmix:
Mixup: 将随机的两张样本按比例混合(线性叠加),分类的结果按比例分配;
Cutout: 随机将样本中的部分区域去掉,并且填充0像素值,分类的结果不变;
CutMix: 就是将一部分区域去掉且随机填充训练集中的其他数据的区域像素值,分类结果按一定的比例分配

mixup, cutout, cutmix对比

CutMix: Regularization Strategy to Train Strong Classifiers with Localizable Features

6. experiments

一张跟较早期模型对比的表格,对后面章节的概述

6.1. datasets and evaluation metrics

从互联网上搜集了482种中文字体,字符集尺寸19514,每种字体的字符数量不定,平均值为6654,可以由371种组件覆盖。
拿467字体跟19234字符训练,剩下的15种字体去评估,分别用2615个已知的和280个未知的字符测量未知字符的泛化性。

用各种指标评估,如LPIPS,评估两张图片感知级相似性perceptual similarity。

从内容维持跟风格吸收两方面评估生成字形,训练了两分类器来了区分测试集的风格内容标签,evaluator单独训练,且用的字符和字体标签也跟训练标签没有重叠、ResNet-50用作backbone架构。利用CutMix增强来构建评估分类器,使得模型可以学习局部、健壮的特征,使用AdamP优化器。CutMix概率跟beta值都是0.5,batchsize、learning rate、epoch数分别是64、0.0002、20。

提出新指标:生成图片反映新字体风格的程度,像LPIPS和基于分类器的那些指标只能间接测量该性质。使用训练过的风格分类器,它能预测482种字体风格包括15种未知的测试风格。用它预测15种新字体风格(也不知道是不是那些测试风格)生成的字形图片。能得到一个指标\(p_{unseen}\),图片被预测为位置风格的比例,如果风格分类器完美,\(p_{unseen}\)能指示给定字体生成方法训练风格过拟合的程度,低的值代表模型对于训练风格过拟合。(没大懂,是说这个分类器在很多字体上训练过,遇到新字体应当也认得,才说明有泛化能力?)

6.2. comparison methods

跟六个 SOTA FFG模型 比较,表1是这些模型按不同标准的分类。

表1 LF-Font跟其他模型进行对比

SA-VAE抽取统一的风格特征并利用字符分类器而非内容编码器的内容编码。无法合成训练时没见过的未知字符。

EMD,AGIS-Net,FUNIT,和DG-Font使用内容编码器,但对给定风格的风格表征统一,实验展示了这种策略的不足。

DM-Font是LF-Font最直接的竞争者,都是组件级风格特征,捕捉局部细节。但DM-Font不能处理包含未知组件的字符,因为他每个组件都要一个可学习的编码本,而不是内容编码器。对于DM-Font,用源风格抽取局部特征来替代未知组件的组件级特征(因为它处理不了未知组件)

总之DM-Font原本无法处理汉字,对它进行大改。

6.3. experimental results

用不同参考字符重复实验50次来消除参考集选取的随机性。字体生成方法要满足两个矛盾目标:保持内容和风格都很好,极端失败的情况下就是恒等映射,内容完全一样,风格完全没学会。因此算内容和风格得分的调和平均值来调查一个方法是否能满足这俩目标。

表2 在FFG场景的性能对比

总之根据表2就是比其他模型好很多,最后一列的未知预测比例更是远高于其他模型,表示LF-Font对新风格具有泛化性,而其他模型不过是记住了训练集中的风格罢了。(不过像FID这种指标,感觉每篇论文的值都不一样,可能具体的计算方法还各不相同,特别是FFG似乎没有一个公认的数据集、指标,导致性能对比上总觉得是各吹各的)。

定性比较结果见图6

图6 生成样本

彩色框里面的都是各个模型有明显缺陷的样本,总体上LF-Font更好,但有些字其实跟GT也只是比较接近罢了。

6.4. module and parameter analyses

这边开始就是一系列的消融实验,挑重点写,不放图

  1. 证明局部风格表达比统一的有效,表3
  2. 内容编码器能提取字符结构信息,表4
  3. 弱监督组件标签有效,主要是一致性损失\(L_{consist}\)跟组件分类损失\(L_{cls}\),特别是后一个很关键,因为能给模型提供充足的组件监督信息(这点跟CG-GAN的表达很像),表5
  4. 分解模块,表5、表6,并讨论了factor size为8最优,但这玩意之前没出现过不知道干嘛的,难道是分解后的向量长度?
  5. one-shot生成参考字得选有丰富局部细节的(屁话),图8(最左边一列是reference字,但提供给各列的应该是有对应风格的)
  6. 对风格跟内容都进行了插值,效果不错比较平滑,图9a,b
  7. 跟端到端训练设置进行对比,两阶段的更加稳定,因为分解模块能从稳定的特征中学习,表8

6.5. reference size study

图10、图11展示了参考字数量从1~256变化时各模型的性能对比,LF-Font风格学得不错,但依赖参考字的正确选取,同时参考字少的时候对内容结构的保持不如FUNIT它们。

图10 改动参考字数量时的性能变动

图11 改动参考字数量时的生成样本

6.6. extension to other languages

参考字4个,训练测试和分类器都与Cha et al.一致,同样多次实验取平均值,还有生成样本的展示,图12,就不贴出来了。

表9 few-shot韩文字体生成对比

6.7. generation with pseudo-character labels

LF-Font在训练、测试都需要字符/组件标签,因此这里比较了基于伪字符标签的预测策略跟真实字符标签。
pseudo-character labels / prediction-based strategy: 感觉说的是所需的组件标签直接由分类器根据输入图片生成,不必要求groundtruth

域内转换场景,即汉字数据集训练完在汉字样本上评估。两种策略差不多,伪标签的风格好些,gt的内容好些,见表7,同样不贴出来。

zero-shot 跨语言场景,汉字数据集训练完在韩字样本上评估。表11展示该场景的生成任务使用prediction-based strategy能得到较大提升,因为汉字与韩字没有共通组件,因此LF-Font无法发挥局部风格表达的效果。

6.8. font generation as data augmentation

将LF-FontMix跟无增强、CutMix等方法用于训练一个字符分类器,训练细节先跳过,总之LF-FontMix可以帮助分类器取得更好的分类准确度。

7. discussion and limitations

较低的内容准确度和low-shot的失败样本 内容准确度低因为LF-Font聚焦于学习多种局部风格,能泛化,换句话说这是字体生成任务上内容保持跟风格转换的权衡问题。
如果参考组件太简单,LF-Font无法把握源字符的复杂结构;字体风格太过新奇的也不行,比如图14那样有各种装饰的。作者认为组件频率的严重不均等也阻碍了组件级编码器的训练,如图13,似乎是想说明超过50%的组件仅有不超过50个字具备

图13 19,234个汉字上的组件频率

图14 LF-Font在超新奇字体上的生成结果

跳出字体生成任务 本文的核心思想局部风格表达可以被扩展到基于属性生成那样的生成任务,但还是有一些挑战。正如第二节 related works 说过的,字体生成跟通用基于属性的生成任务有一些差别。(几乎复述了一遍差别)。其他视觉域构建一个同一风格(同一个identity)但不同属性(不同性别或不同头发颜色)很困难,因此不少基于属性的生成方法都会制定非配对图片生成问题,而本文要求配对数据。如何将LF-Font扩展到非配对数据生成任务跟通用图片域会是一个有趣的未来研究方向。

8. conclusion

LF-Font只需要少样本就能产生高质量复杂的字形。分解模块在已知字符级风格表达上训练,但是嗯那个很好地泛化到未知的字符级风格表达,通过将字符集风格解耦为风格和组件因子。为了缓解测试时对组件标签的需求,就是用那个辅助字符分类器。LF-Font还能被用在字符识别系统的数据增强上。

9. Critique

这b代码真是一坨。看了代码才发现风格图片每个batch会取 kshot+1 张,多的一张是内容图片,疑惑,而且在collate的时候似乎会根据风格参考每个字形的部件个数去复制风格图:in_imgs.unsqueeze_(1).repeat_interleave(in_comp_lens, dim=0),导致风格图片多了非常多。

posted @ 2022-10-15 16:34  NoNoe  阅读(576)  评论(0编辑  收藏  举报