[论文阅读] FontTransformer Few-shot High-resolution Chinese Glyph Image Synthesis via Stacked Transformers

pre

title: FontTransformer: Few-shot High-resolution Chinese Glyph Image Synthesis via Stacked Transformers
from: Pattern Recognition 2023
paper: https://arxiv.org/abs/2210.06301
code: none

亮点:high-resolution, 两阶段Transformer, Zhouhui Lian

针对问题

现存方法合成的字形大多分辨率低下(多为128x128, 256x256),同时常有结构错误、笔画不完整的问题

核心思想

使用parallel Transformer避免预测错误的积累,且利用serial Transformer增强合成笔画的质量。同时设计了一种新的编码体系将更多字形信息跟先验知识喂给模型,更促进了高质量、赏心悦目的字形生成。

相关研究

提及已有不少DL-based的字体合成方法,其中又分为CNN-based跟RNN-based,跟FontRL介绍的差不多,但更简洁
现存方法需要大量数据训练,同时字形的质量也不够好,而且受限于指数增长的内存需求跟回归困难字形的分辨率低,

Chinese Font Synthesis

提到当今字体设计可借助软件FontLab,但人工工作还是很重,

提到俩非深度学习的方法,一个还是他们实验室的EasyFont,挺有意思
后面从Rewrite开始讲到DCFont,锐评FontRL为训练集每个字符手动标注字形skeleton过于费时,虽然效果不错。
提到一个自动抽取skeleton的方法,ChiroGAN,它似乎用的是I2I模型,提出的时间早于FontRL。

说SA-VAE用到更简便的先验知识做指导,用的是网络抽取的内容特征跟133位向量的字符编码。类似地,Stroke-GAN用one-bit笔画编码精炼标签,ChinFont引入知名的五笔编码表示汉字内容信息来合成向量字体。

再就是介绍基于RNN的办法,主要是FontRNN。

Few-shot Chinese Font Synthesis

英文数字字体的few-sot合成方法有许多,用在汉字上效果不理想。
提了一嘴EMD,介绍RD-GAN把输出图片切成许多组件(radical)图片,然后喂入multi-level discriminator以确保全局结构跟局部细节。

令人感动的是看了这么多篇总算有篇介绍较新的模型。
首先讲的猜测是LF-Font,371个组件跟分解模块,只给了作者名,没用模型名介绍...
然后提了XMP-Font,加入笔画级特征,更好地处理笔画间间距跟连笔,但这吊玩意吊人胃口建了仓库好几个月一直不放代码。

ZiGAN用许多未配对字形图片对齐特征分布。DG-Font提出Feature Deformation Skip Connection模块,吸收可变性卷积在低阶特征上实现几何变换。

因为大部分书写系统字符数量都不多,比如英语和孟加拉语,一个类似任务的是利用少样本将其他语言文字的风格迁移到中文上。FTransGAN利用多级注意力抽取英文样本全局跟局部的风格特征。MX-Font用上多个局部专家抽取风格特征,对未知语言泛化性强

Vision Transformer

将Transformer用在CV任务,可以用注意力模块替换某些CNN成分,通过添加自注意力模块,SA-GAN可以用所有位置的特征合成图片细节。也有将CNN模块/结构添加到Transformer里的,比如BoTNet、LocalViT,CvT等等

VQGAN将Transformer跟GAN结合,用于生成高分辨率图片,它利用Transformer推断长序列,用于合成高分辨率图片,但会造成指数增长的计算开销,为此本文提出分块字形图片编码方案。

大部分基于Transformer的模型都需要大规模数据(如ViT跟DETR),而本文的FontTransformer只需要少量online训练样本即可,结合后文看作者的意思好像是online样本用于微调,以适应目标字体生成任务,需要100张图片,应该是标题的few-shot。

但细想字体生成确实不易,相近的字体太多,而且同一字体难以用统一的风格表示,光凭几个字很难得到好效果

贡献

  1. 用堆叠的tranformer合成高分辨率(256或1024)字形图片,第一个高效地将transformer用于few-shot汉字合成上
  2. 提出分块编码方案将字形编码为token序列,可以合成任意分辨率的字形,同时保持token序列长度为常数
  3. 做了大量实验验证模型性能超越SOTA

方法(模型)流程

Overview

图1 (a)方法总览 (b)基于少样本学习,FontTransformer的分辨率更高

方法如图1所示,本模型可以通过少许样本学习目标字体的画笔和布局样式,基于字形图片有许多重复的块这一事实,设计了分块字形图像编码方案,可以合成高分辨率图片而不过多增加计算开销

图2 FontTransformer架构。由parallel Transformer跟serial Transformer两部分组成,编码器解码器细节见附录B

图3 FontTransformer字形编码过程。

如图2,第一阶段用一个Transformer并行地生成图片块,先得到一个粗略转换了风格的字形\(I_{Tp}\),然后用第二阶段的Transformer连续地产生图片块,根据\(I_{Tp}\)合成更为精细的\(I_{Ts}\)。这里字形图片会先被编码为序列,然后在每个阶段加入风格、内容跟五笔编码嵌入去转换风格。

图3中将图片从左到右从上到下分割,每块Block再细分为小块的Patch,展平之后用codebook取对应的嵌入向量。最终将每个patch的向量连接,然后跟风格嵌入\(x_s\),内容嵌入\(x_c\)以及五笔嵌入\(x_w\)一起组合为每块的token嵌入\(x_t\)

Chunked Glyph Image Encoding

类似其他vision Transformer方法,将字形图片编码为序列作为FontTransformer输入,因为字形是二元位图,可以分割成频繁重复出现的块(应该指的是块的种类有限,具体可见图3,每块可以用固定长度的01序列唯一表示),这样可以用紧凑的序列代表整个字形,而不用像ViT里的线性投影或VQGAN里的CNN一样,去学习复杂的映射。

见图3,将二元单通道2D字形图片划分为边长B的正方形块(block),每块进一步划分为\(\frac{B^2}{P^2}\)个边长为P的patch,每个patch展平,看作一个二进制数\(b \in [0,\; 2^{P^2}-1]\)

之后初始化codebook,这玩意是可学习的,共\(2^{P^2}\)个嵌入向量\(x_{t_i}\),从标准正态分布\(\Nu (0, 1)\)初始化,每个跟一个二进制数相对应。

然后将每个patch对应的嵌入向量拼接为块\(x_t \in R^{B^2 L_c / P^2}(L_c \le P^2)\)的嵌入向量(这里\(L_c\)应该是patch对应的二进制数长度,因此小于等于patch边长平方)

通过调整\(B, P, L_c\)的值,可以将上述方案用于编码任意高分辨率的字形图片,同时约束codebook大小跟token长度,并保持全局结构跟局部细节的信息。

实验中设置patch边长为4,因此可学习codebook中有65536个元素,对于256x256图片,\(B, L_c\)等于16, 16,如果是1024x1024图片,二者就分别等于64和2。

然后要加更多信息,作者添加风格嵌入\(x_s \in [0, 300]\)跟内容嵌入\(x_c \in [1, 6763]\)到token嵌入向量\(x_t\),还加了五笔嵌入\(x_w \in [0, 25]^4\),其粗略描述了一个字形的结构信息。类似地,从\(\Nu (0, 1)\)采样风格,内容跟五笔嵌入。总之这样就拼成了一个字的向量表示,如图3右下角所示。

FontTransformer

Transformer 普通Transformer由编码器跟解码器各一个构成...简单介绍了Transformer跟注意力机制,说FontTransformer基于普通的Transformer跟掩码注意力机制。

\[A t t e n t i o n(Q,K,V)=s o f t m a x(\frac{Q K^{T}}{\sqrt{d_{k}}})V, \tag{1} \]

Stacked Transformers Transformer按顺序解码产生token,如果错误积累问题很严重,笔画第一个patch错了后面的就很难改正,就需要这个堆叠transformer

紫色的\(T_p\)输入有三个,源、风格跟空白字形图片序列,空白应该是配合图片编码里风格、内容、五笔三个,同时也能保持跟serial transformer一样的架构,占位用的,像第二阶段那个绿色的\(T_s\)需要回归地(按序)生成patch,就需要这第三个输入。

第一阶段合成的图片\(I_{Tp}\)有噪声跟伪影,于是在第二阶段用\(T_s\)来改进合成结果的质量。\(T_s\)基于上一阶段的结果按序产生,这个阶段会有积累错误,但很小,忽略。

这俩Transformer架构相似,差别在于推断时同时还是按序生成patch。

猜测\(I_{Tp}\)作为二阶段的风格输入,或许要求第一阶段需很好地捕捉到风格,内容则可以缓缓到二阶段优化。总之本文将字体合成分成这样两阶段:风格迁移跟精炼

Masked attention 模型中计算注意力函数时加了个mask过滤掉无用信息,masked attention定义为:

\[A t t e n t i o n(Q,K,V)=s o f t m a x(\frac{Q K^{T} \odot\;m a s k}{\sqrt{d_{k}}})V, \tag{2} \]

其中\(x \odot y\)\(-\infty\),如果y为0,否则值是x

如图3,图片一大半都是空白,而这些空白patch对应的嵌入向量\(x_t\)为0向量,没有什么信息,因此将它们对应的mask设为0,其他的设为1。

这种简单的策略对去掉信息少的token有效,且能保持序列长度相同,因此保留了每个图片patch的位置信息。类似地,\(T_p\)里那个空白图片的mask就设为0

Loss function 方法生成的是图片patch而不是token,可以直接用视觉任务里的loss函数,比如 perceptual loss 或 contextual loss。但作者实验发现它们对合成结果的质量没什么影响(约束不够强?)于是用了MSE。

\[L o s s_{T_{p}}=||I_{T_{p}}-I_{t a r g e t}||_{2}^{2}; \tag{4} \]

\[L o s s_{T_{s}}=||I_{T_{s}}-I_{t a r g e t}||_{2}^{2}; \tag{5} \]

实验

数据集和指标

跟一些较有代表性的模型对比,如zi2zi, EMD, DG-Font,以及两个 SOTA few-shot 模型 AGIS-Net 和 MX-Font。这篇在arxiv上发表于今年10月份,这里挑的模型确实都经典,可惜的是没能跟较新的工作对比,不过今年的模型确实少有开源,而且对训练也不友好

表1 FontTransformer跟其他方法的定量结果

构建300个字体的数据集,每个有6763个字, Arial Regular 作为源字体。离线地(offline)用251个字体,约170万个字形图片预训练模型。在线地(online),只用100个字形图片去微调这些预训练模型,并在30个未知字体上测试其他5988个字。如表1所示。

指标使用平均绝对误差(MAE),FID跟分类精度。MAE (or L1-Loss) 反映像素级图片质量,FID用的是pytorch官方实现

像DM-Font跟LF-Font那样,通过内容感知跟风格感知两个方面评价图片质量。确切来说,在300个字体上训练俩VGG-19去分类字体风格跟字符内容,分别获得99.56%跟99.87%的分类准确度。

然后用分类器去分类不同方法合成的字形图片,获得俩指标Acc(style) 和 Acc(content),以及二者的调和平均数Acc(Hmean) 。

作者说希望合成结果不仅相似于目标字体,还得与其他字体作出区分,因此用300个字体训练VGG而不是只用测试集里的30种。(可能是想说,测试集字体共30种,用它们去训练只能学会分辨合成结果最像30种里的哪一个,但如果用300种去训练,可能就知道合成结果最像的是并不是目标字体,而是其他的某一个,说明模型并没有很好地学习到风格)

实验细节

为了跟其他模型比较,输出尺寸选择256x256,块大小为16x16,每张图片表示为256个token组成的序列。俩Transformer的编码器解码器由6个MHSA层和6个feed-forward层构成,详见附录。优化器用adam,微调学习率1e-4,预训练时

\[L e a r n i n g R a t e(s t e p)=f a c t o r\times d_{t o k e n}\times m i n(s t e p^{-0.5},s t e p\times w a r m u p^{-1.5}), \tag{6} \]

其中factor设置为1,\(d_{token}\)表示token的维度,定为448,warmup取400,batchsize取64,预训练10 epoch,微调100 epoch

这里offline、online预训练微调并没详细说明,特别是微调100张图片需要100epoch吗?

实验结果

图4 字体风格的三种属性

图5 FontTransformer跟其他5个方法的合成结果对比

如图4,作者将风格粗略分为笔刷brush、布局layout(理解为组件间相对位置、相对大小?)跟比例scale,认为两张风格一样的字形图片这三者应一致。这个分类感觉有些太粗糙了,比如brush最左边的例子很明显就是精心设计的,那种笔画间的留白并非笔刷就能概括
如表1所示,本文的方法比大多数其他方法都来得好,这也是今年模型的共性,风格准确度都有很大提升。

图5是一些定性结果,当只用100个样本微调时,zi2zi捕捉到brush但合成结果模糊,EMD比它好一些,但有笔画缺失。AGIS-Net结果不错,但又许多噪声跟伪影,部分笔画缺失。MX-Font...总之就看图说话。注意这里被比较的模型最新的是去年的MX-Font,但它主打跨语言风格转换,或许用LF-Font比较更有说服力

消融实验

图6 Ts Tp不同组合的合成结果。

Stacked Transformers 如图6,堆叠Transformer比单个的来得好。结论是Tp解决笔画错误问题,Ts有助于去除噪声跟伪影。

图7 分块字形图片编码跟掩码注意力的消融研究

Chunked glyph image encoding 用分块的编码方式,当分辨率高的时候通过调整patch跟block的尺寸就可以控制token长度。如图7,不用提的这套编码体系,将字形图片展平直接作为输入很难合成正确的字形。

Masked attention 在模型的编码器中使用掩码注意力,能够过滤掉大部分地信息的图片patch。如图7,没有这项机制,合成结果会有断裂/不正确的笔画。

图8 online数据数量对FontTransformer性能的影响。当few-shot数量为50,本模型的结果就已经不错,few-shot数量主要影响layout风格

The number of online data 如图8,展示了使用不同数量online数据的模型性能,当size为10模型对于brush跟scale风格掌握得就不错,但layout风格还是源字体的。当输入增加到200或775,模型就能“看见”更多的组件,见红框,也就是生成的结果更接近target。

作者认为size为100跟200都可接受,并且layout风格最难迁移。原因有两个:

  1. 没办法从字形图片里抽取layout特征
  2. 同一个字体的layout也并不一致,一些字体对不同字形结构(上下/左右)有两个及以上的layout风格。

事实上,像图8中第6列“称”字那样,风格比较复杂(或者说没有规律)时,即便size=775,合成结果跟目标仍然有一定差距

作者这里的online 微调似乎指的是用目标字体去微调模型,那这样100个样本也能叫few-shot?跟那FsFont一样。总之作者说用少量样本且尽量合成相似组件跟layout风格的字形仍然是一个值得探索的问题。

Text Rendering

图9 用本方法合成的字体渲染的文本。红框是机器渲染的,其他是人写/设计的

作者试图用图9说明方法的有效性,因为很难区分模型生成的跟人类设计的。

User Study

设计在线问卷...表2是受试者的精度,接近50%,略。问卷在附录。这部分其实没啥好看的,而且总觉得跟FontRL的做法好像,毕竟同一个团队,可以理解。

Fonts in Dataset

图10 字体风格分布 红点是测试集字体,其他是预训练阶段的字体,展示了测试集字体一些最近邻

用VGG抽取每个字体特征,以此展示数据集字体分布,该VGG也用于评估Acc(style)。然后用T-SNE减少特征空间维度,并在图10中画出来。为了表示模型不会简单地过拟合预训练集,也展示了一些评估用的字体最近的邻居。能看到邻居字体的brush, layout, 或 scale 都跟目标字体不同。(??邻居的风格差异那么大不正是说明模型过拟合吗?)

Limitations

FontTransformer还有不少问题,主要由于Transformer的复杂性。推理时Tp可以迅速产生图片,但Ts必须一个一个来产生patch。即便用分块编码限制序列长度,在GTX1080Ti上仍然要将近两个小时才能合成一个含有6763个汉字的字体。

更糟的是,Transformer参数更多,但这个可以用更有效的Transformer变体解决。同时也还有一些失败的例子,见附录。

总结

提出了一个新的端到端few-shot汉字字体合成模型,FontTransformer。复述核心思想。复述模型二阶段实现。做了大量实验验证...提到将来工作是降低使用的Transformer复杂度,提高合成图片的质量。

总体来说本文比较简单易懂,idea不复杂同时也挺有效,限制或许是:

  1. 看流程图应该是需要配对paired数据去训练
  2. 需要100个样本的few-shot
  3. 速度似乎很慢,1s只能合成不到1个图片

启发

二阶段的堆叠Transformer有点意思,先并行合成一个差不多的,再用另一个Transformer去提高质量。不过问题是第二个Transformer是串行的,生成缓慢,或许可以改为基于CNN的模型?比如最近那个号称超越 ConvNeXt、ParC-Net 和 Swin Transformer 的MogaNet

待解明

  • Fonts in Dataset 图10 那里怎么就能说明不过拟合?
posted @ 2022-11-22 17:29  NoNoe  阅读(616)  评论(2编辑  收藏  举报