[论文阅读] Few shot font generation via transferring similarity guided global style and quantization local style
Pre
title: Few shot font generation via transferring similarity guided global style and quantization local style
accepted: ICCV 2023
paper: https://arxiv.org/abs/2309.00827
code: https://github.com/awei669/VQ-Font
关键词: font generation, quantization
Idea
在经典的风格内容解耦框架上加入了两个风格汇聚器,利用交叉注意力和内容特征相似度来分别聚合局部和全局风格,这俩风格最后跟内容编码拼一起送解码器生成。
Motivation&Solution
- 基于部件的方法通常需要预先定义的特定字形部件,难以应用于不同语言的生成
- 通过计算内容和参考风格的注意力来抽取局部风格并不充足,尤其是目标语言的字很多 —— 粒度粗
Background
略
Method(Model)
Overview

图1 模型架构 生成器由5部分组成:预训练的内容编码器、参考风格编码器、局部风格汇聚器、全局风格汇聚器、解码器。判别器判定真假也判定生成汉字的内容和风格
全局/局部风格各有侧重:intra-style / inter-style consistent ,本文试图结合两种风格
全局风格:计算目标字形和参考样本之间内容特征的距离,然后用作权重去汇聚风格特征
局部风格:先自动学习字形部件,本质上是离散的隐向量编码,对一系列字形进行 vector quantization 而得到
之后使用交叉注意力的Transformer,上述学到的部件特征作为query,参考字形的风格表达作为 key, value
论文贡献如下:
- 用到了互补的全局和局部信息
- 用内容相似度来获得全局风格,考虑字形结构的相似度,对于那些跟参考字有相同部件的字更有效
- 用预训练的 VQ-VAE 自动抽取部件,没有相应标签。局部风格可以通过交叉注意力在一次前向中传送给所有部件,与内容无关,并加入了风格对比损失
Glyph Encoders and Component Decomposition

图2 字形特征分解网络,用于预训练内容编码器并获得部件表征
图1蓝色那一坨E_c使用VQ-VAE来预训练(其实就是预训练的VQ-VAE),得到 \(e_c\) 。预训练如图2所示,基本就是训练一个VQ-VAE的流程,挺小的,训练数据只有内容字的所有图片,估计是当内容编码器用的。风格编码器 \(E_s\) 架构跟 \(E_c\) 一样,但没有预训练。
但是看代码 content_encoder
却是一个单纯的卷积网络,实际上直接复制预训练VQVAE参数而来,编码得到 content_feats。而VQVAE的_vq_vae._embedding.weight
就是后面使用的codebook。
Local Style Aggregator
通过计算内容和参考风格的注意力来抽取局部风格要每个字形都过一遍注意力,实际上是能共享部分笔画的,因此设计了LSA,核心是CAM块,它将风格转换到所有部件级的编码 \(e_c\) 上,而不是输入字形。说局部表征 \(f_{sr-L}\) 是通过汇聚 \(e_s\) 而来,感觉是先为 \(f_c\) 里每个空间元素搜索 \(e_c\) 里最接近的标签n,然后再取相应的 \(e^n_s\) 来替换??
看代码是 learned_components(codebook) 和 reference_feats(参考风格特征) 先做了三次交叉注意力得到style_components(\(e_s\)?),然后 self.cam(content_feats, learned_components, style_components)
得到 \(f_{sr-L}\)?其中 content_feats 充当query, learned_components 充当key,而 style_components 作为value,而且这样一来\(e_s\)就变成CAM模块的输入,跟论文图1不符。
Global Style Aggregator
风格和内容并非完全独立,如果输入字形跟参考的有相同笔画或结构,转换过程中就能参考其风格。因此基于内容特征相似度(内容字形和所有参考字形)来加权每个参考字形的风格,
Training
Adversarial loss. hinge GAN loss 判别器 \(D_{s,c}\) 表示针对风格标签s和字符标签c,说是输出风格和内容的二元分类(binary classification of each character’s style and content category)。结合代码猜测,判别器是判别给定图片真实性,从风格和内容两个方面出发,要求真实图片预测值大于1,生成图片预测值小于-1;而生成器则希望生成图片预测值尽可能地大
Matching loss. 其实就是L1损失,两部分,一个对生成结果g和真实图片gt进行计算;另一个对二者在解码器某一层的特征进行计算;但结合代码看“另一个”是重建结果和真实图片gt的L1损失
Style contrast loss. 没看懂,好像对每个风格s都有相应的codebook\(e_s\)?然后\(e_{s+}\)是正codebook对,具有相同风格但不同内容?一个风格能有多个codebook??;结合代码这玩意竟然是用了两个不同的内容字,具体来说,内容字体固定,但对于每个样本,取两个不同的内容字(可是应该不会影响风格?),然后分别算出图1那坨黄色的 stylized componets \(e_s\),之后这两个\(e_s\)去算对比损失。
Experiment
Settings
首先训练部件级别的codebook,batchsize=256,然后训练整个字体生成模型,batchsize=48。
Dataset
386汉字字体,每个3500个汉字,分辨率128x128,随便抽一个字体来生成字形内容特征,并在后续保持不变。训练集370字体,3000汉字(SFSC);另外分了UFSC、UFUC
Ablation Studies

表1 codebook消融

图3 latent code 可视化
部件codebook大小能看出目标语言的复杂度,看表1超过100时提升有限,说明100个部件足以表示汉字(看到这才发现它这玩意是把VQVAE用来编码汉字,codebook的每个元素当做一个部件的向量)。作者说建模英语的时候只要设为15效果就不错。后续汉字实验将size统一设置为100。
图3是从codebook抽取某一个code来展示,第32号code主要是竖直部件,而44号主要抽取水平部件,这表示VQ-VAE能自动生成“部件”

图4 GSA/LSA消融结果。红框是完整模型生成得更好的地方

表3 GSA/LSA在UFUC数据集上的消融结果

图5 参考样本数量的影响(LPIP?)
Comparing with SOTA Methods

表2 定量比较

图6 红框表示比别人好的地方
所有模型都按他们各自原超参和策略重新训练,数据集统一为本文所用的,所有方法的参考样本都设置为3。作者认为各模型表现不好的原因:LF-Font需要更多的参考样本;DG-Font要求目标风格跟原风格接近;AGIS-Net反而稳定;MX-Font的结果比其他方法更好,但比起本文模型在细节上有缺陷的概率更大;FS-Font是随机挑选的内容-参考对,所以效果很差;
Applying to Other Languages

图7 日语的FFG结果。每种风格,上面的是生成的,下面的是groundtruth

图8 跨语言推理。a日本文字。b朝鲜文字 cfew-shot的汉字生成结果和zero-shot的日文生成结果
选了125种日本文字的60个字体,100个字形+50字体来训练,结果如图7,日本假名比汉字结构简单,效果也好。
Appendix

图9 用不同参考图片来生成相同的目标汉字

图10 使用不同数量的参考图片来生成
Conclusion
主要就LSA和GSA这俩模块的创新,但也有不足:只给一个参考图片或字体很花哨,生成结果就烂,但这也正常,信息不足,基本都这样
Critique
首先图1虽然画得挺清晰的,但看着真的蛮廉价,而且和论文似乎不匹配,看起来很难受。代码明显基于LF-Font的,细看的话主要模型又是FsFont(LF-Font?)的。主要创新在于两种风格汇聚模块,VQVAE的部分感觉讲得不够多,用得好像也不够多。
2023-12-11 10:30:13
代码部分跟FsFont一样难受,先存下所有字形的图片,然后读取再转成lmdb,基本一致。难受的部分同样是不给完整的环境配置,每次报错才知道缺什么没装,也不给指标计算部分代码,同样依赖低版本numpy的np.int,同样写死了训练dataset的kshot,(真是屎山传三代),写死还装模作样整个函数。预训练的VQVAE其实挺小,反倒是相似度是 \(n_ch ^ 2\) 这个量级,所有用到的字两两之间都必须有个相似度。而且好像是对比损失的影响,它训练时需要 num_Positive_samples
个目标字,一共要 num_Positive_samples * kshot
个参考字,而非kshot个。
Unknown
- Style contrast loss 很迷惑
本文作者:心有所向,日复一日,必有精进
本文链接:https://www.cnblogs.com/Stareven233/p/17684150.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步