[论文阅读] CF-Font@ Content Fusion for Few-shot Font Generation

发布时间 2023-07-16 10:05:16作者: NoNoe

1. Pre

title: CF-Font: Content Fusion for Few-shot Font Generation
accepted: CVPR2023
paper: https://arxiv.org/abs/2303.14017 | https://openaccess.thecvf.com/content/CVPR2023/html/Wang_CF-Font_Content_Fusion_for_Few-Shot_Font_Generation_CVPR_2023_paper.html
code: https://github.com/wangchi95/CF-Font
ref: https://zhuanlan.zhihu.com/p/625468818

关键词: Content Fusion, DG-Font, 高超对比技巧
阅读理由: CVPR2023,看看zju+alibaba的组合,融合内容字体做生成

2. Idea

在DG-Font基础上做增量改进:综合多种字体来抽取内容特征,并增加一个新的重建损失项PCL

图1 本文方法生成的汉字。 (a) Source: 从10个用于特征融合的基本字体中选取的源汉字图片 Weights: 颜色对应左边的Source,环形图面积表示用来混合各Source的权重 Target: 少样本风格参考,这里只展示其中一张 Ours: 使用融合的内容特征和风格特征,由本文方法生成的图片 (b) 生成图片共10行,每行都是一种抽取出来的风格,如 thin, thick, swollen, cuneiform, inscription, or cursive style

3. Motivation&Solution

  1. 以往的工作大多采用了内容风格解耦,由于内容和风格很难完全解耦,它们的源字体又是手动挑的,根据它抽取来的内容特征可能并非最优 —— 提出 content fusion module (CFM) 内容融合模块,缩小源域和目标域的差距,降低转换难度
  2. 风格向量要求是单个的、高质量的、font-level,以便于生成字体里所有字符 —— 提出IST
  3. 大多数字体生成算法用L2或L1来作为重建损失,它们很容易被局部细节的不对齐干扰,无法聚焦于字符的全局形状 —— 提出基于分布的PCL(projected character loss)损失

4. Background

谈到了字体生成的应用:completion for ancient books (古籍修复?)、个人字体生成

很多工作选用宋体或楷体作为源字体,虽然通常有效,但有时候会导致生成的图片带有伪影(artifact),比如不完全或多余的笔画(unwanted strokes)

4.1. Few-shot Font Generation

细数近年来一些模型的不足

  1. mx-font利用多个专家和二分匹配;xmp-font利用跨模态编码器,根据字形图片和笔画标签联合建模;cg-gan有效监督模型在组件级别上对内容风格的解耦;它们仨需要组件类别标签
  2. fs-font学习细粒度的局部风格以及内容和参考汉字的空间相关性,但参考汉字必须精心挑选
  3. dg-font用可变形卷积,不需额外标签,但在源域和目标域相差过大,特别是目标字体没见过的情况下,few-shot生成很困难

5. Method(Model)

5.1. Overview

图2 模型框架 (a) 首先训练DGN(DG-Font的网络)并使用PCL来增强字符骨架的监督性 (b) 模型收敛后,聚类所有训练字体的内容特征,并根据聚类中心取出基本字体。原本的内容编码器换成了CFM,原本的内容特征变为基本字体的融合特征。之后继续训练模型,使它适应融合的内容特征。 (c) 推理时,用ISR来修饰字体风格。提取的平均风格向量作为唯一可训练变量(only trainable variable)去微调几个iter。

CFM:从预先定义的基本字体中取出相应的字符并计算内容特征,通过线性混合来得到目标字体某字符内容特征,混合的权重由设计的font-level距离度量来定义。这样得到针对某个字的内容特征的线性簇,然后探索利用font-level相似度来寻找簇中最优的内容特征。

ISR:提出 迭代的风格向量精炼 (iterative style-vector refinement (ISR))策略,寻找更优的font-level风格向量。对于每个字体,计算参考图片(本文里共16张)的风格向量均值,然后将其作为可学习参数,并根据重建损失去微调。

PCL:将字形图片的一维投影视作概率分布,然后计算两个分布间的距离来作为重建损失(projected character loss, PCL),这样能更注意到字形的全局属性,对于转换结果的骨架拓扑(skeleton topology)有巨大改进

对图2题注的补充:DGN学到东西后,原本的内容编码器固定,CFM接在它后面,继续训练风格编码器,FSDC和mixer几个epoch。ISR只在推理的时候用

5.2. Base Network

介绍了下DG-Font

5.3. Content Fusion Module

图3 内容融合的可视化。黄色和红色的箭头分别表示宋体和距离目标最近的字体。蓝色箭头表示基本字体内容特征的插值(线性组合)以近似目标。

16个few-shot汉字将内容特征串联,聚类,离中心最近的是基本字体,一旦选取就固定下来。然后根据与目标字体的相似度计算L1-norm的内容融合权重。然后微调来适应融合的内容特征,即图3蓝色的圈圈(作者写的,没看懂)

Basis selection. 假设要从N个训练字体里选出M个基本字体,可以将内容特征 \(\{C_i\}^N_{i=1}\) 聚类,然后根据中心选。(C_i由字体i的几个字符的特征拼合而成)但考虑到 \(C_i\) 维度太大,而N相对小,根据《The exploitation of distance distributions for clustering》的办法将它映射到跟其他字体直接的距离 \(e_i\)

公式1

其中 \(\sigma(\cdot)\) 是softmax,d是两字体之间的L1距离,Cluster表示经典的K-Medoids算法,\(\mathcal{B}\) 是选取的字体的下标。

Weight calculation. 目标字体t和它的内容特征 \(C_t\) (根据参考图片抽取),测量跟基本字体的相似度\(d'_t\),权重\(\omega_t\)

公式2 \tau是softmax的温度

Content fusion. 按自己的理解,编码器还是DG-Font那个,然后基本字体跟参考图片一起过,提取特征,算相似度,然后得到权重,根据权重把基本字体的内容特征融合起来。

\[C_{t}^{\prime}=\sum_{m\in \mathcal{B}}w_{t m}\cdot C_{m}. \tag{3} \]

5.4. Projected Character Loss

图4 PCL示例。将 binary characters 投影到多方向的一维空间(以颜色区分)然后每个计算归一化直方图。显然对于不同字体的同一个字,投影后的分布随骨架变化(同一个字之间相似),对纹理或颜色较不敏感。

PCL使用边缘分布距离(marginal distribution distances)在多个一维投影上测量图片的差距,如图4所示。因为分布对相对关系不敏感,因此PCL能给字符的全局形状更多注意力。

\[\mathcal{L}_{p}(Y,\hat{Y})=\frac{1}{P}\sum_{p=1}^{P}\mathcal{L}_{1d}(\phi_{p}(Y),\phi_{p}(\hat{Y})), \tag{4} \]

两个Y分别代表生成的和gt图片,P是投影的数量,\(\phi_{p}(\cdot)\) 表示第p个方向的投影函数。有多种度量可以测量一维分布之间的对齐,例如KL散度和Wasserstein距离,因此 \(\mathcal{L}_p\)有多种形式:

公式5

公式5里面KL就是KL散度,\(\Lambda\)代表cumsum函数,可以将概率密度函数转为累积分布函数
[注] 关于cumsum:https://zhuanlan.zhihu.com/p/137159373

图5 L1跟PCL的对比 使用L1,PC-WDL,PC-KL在所有训练字体中挑出跟左上角最接近的前10个字,从左到右上到下来排列。可以看到L1提取的字其骨架变化非常大,而PCL的就稳定得多。

把PCL加到DG-Font的损失里得到总体损失:所有\(\lambda\)都是超参数,生成器最小化损失,判别器最大化

\[\mathcal{L}=\mathcal{L}_{a d v}+\lambda_{i m g}(\mathcal{L}_{i m g} + \lambda_{pcl}\mathcal{L}_{pcl})+\lambda_{c n t}\mathcal{L}_{c n t}+\lambda_{o f f s e t}\mathcal{L}_{o f f s e t}, \tag{6} \]

5.5. Iterative Style-vector Refinement

对于目标字体t,取一系列字符图片用\(f_{se}\)输出的平均值作为t的鲁棒风格向量。 \(I_{t}^{q}\) 表示字体t的字符q的图片,Q表示参考字符数量。

\[s_{t}^{\prime}={\frac{1}{Q}}{\sum_{q=1}^{Q}f_{s e}(I_{t}^{q})}, \tag{7} \]

推理时,\(s'_t\) 首先由公式7初始化,然后使用给定的几个风格参考作为监督样本,根据重建损失的反向传播对 \(s'_t\) 进行大约10个epoch的精炼,最终的向量用于推理,而且它可以存下来,后面生成同一种目标字体时可以重复使用,使ISR策略在真实系统中很有效率。

6. Experiment

6.1. Training Detail

8卡V100服务器训练而成,Implementation Details部分有一些训练的参数,其中提及PCL是正交地将字形投影到12条直线上,他们在图片中心交叉均匀地划分2D空间。

图片分辨率为80x80,batch size为32,总训练时长为15小时。首先DGN训 180k iterations。聚类选基本字体后模型跟CFM再训 20k iterations。公平起见,消融时没有CFM的模型一共训 200k iterations

6.2. Dataset

搜集了300个汉字字体作为数据集(含印刷字体和手写字体),字符集共6446个汉字(GB/T 2312标准一共6763个字),其中317个汉字由于比较方法不支持被去掉了。

训练集240个字体,每个有800汉字。
测试集(a)229个已知字体跟5646个未知汉字,(b)剩余60个未知字体跟5646个未知汉字来验证泛化性
其中11个(10基本字体(包括宋体)+楷体)从240个里排除构成229,因为宋体楷体多是常用的源字体。

本文是few-shot生成,其目标字体参考图片是训练及部分随机抽的16个汉字图片。

6.3. Metrics

像素级:L1,RMSE,SSIM
感知机:FID,LPIPS

6.4. Comparison with State-Of-The-Art Methods

表1 跟SOTA方法比较。粗体的是最好的,下划线的是次好的,每列最下面的百分数是本文方法相对于次优的提升。

图6 跟SOTA的定性对比。本文同时用了多个源字体,但公平起见其他方法则是从所有源字体的生成结果中挑最好的来展示,而方便起见Source一行都用宋体示例。红框是骨架错误,蓝框标记风格问题(笔画,连笔,body frame)

作者说略微修改了CG-GAN的大小来适应输入图片尺寸跟few-shot设置,公平起见作者分别用11个(10基本字体(包括宋体)+楷体)字体给这些被比较的方法生成,取最好的结果。细节说是看附录,你这也没附录啊?

表1里FUNIT的FID最低,但其他指标不行,也反映出FID的不足。图6作者解释参考汉字是随机选取的,并且对于所有源汉字都固定不变,组件覆盖率很低,因此Fs-Font效果不好。

经典User study.部分,细节略过,20个志愿者每人选一个最好的生成方法

6.5. Ablation Studies

表2 不同组件的消融。第一行是DGN的结果(baseline),P,C,S分别代表PC-WDL,CFM和ISR。N表示用了检索策略,也就是从基本字体里取最接近的(表星号的是从除了自身外整个训练集去找)作为源字体

图7 消融的定性结果。字母含义跟表2一样,红圈是错误骨架,蓝圈为错误风格

Effectiveness of different components. 感觉这个消融研究挺勉强的,表2看下来PCL几乎没用,加了检索策略反而更差,然后加大检索范围大多数指标都好了一点点,说明10个基本字体远远不够?虽然作者嘴硬不能光看数字,也得结合图7看实际效果,但你肯定是挑最好看的样本吧,而且C跟S也没单独消融呀 光看表2 CFM 作用最大,ISR有些许作用。

图8 在内容融合和检索策略之间的比较。B表示baseline(DG-Font),其他记号跟表2一样

Comparison between content fusion and retrieval strategy. 所有模块里CFM最有效,这里通过比较检索策略来进一步研究其原因,也就是表2里N打钩的那两栏。结果显示只用最接近的基本字体比进行内容特征融合效果差得多,甚至比一直用宋体(没有挑选/融合)的baseline还差,如果从整个数据集去挑选就能跟CF-Font在已知字体上效果接近,未知的不如。

如图8所示,最接近的字体仍可能跟目标很不相似,而且会引入噪声(部分跟target skeleton不匹配),因此内容融合更好。这里也没看懂,图8应该展示的是各种模块加入后生成结果吧,哪里有“最接近的字体”的展示?

表3 PCL变体的定量评估

Variations of PCL. 表3能看到俩方法菜鸡互啄属于是,只是PC-WDL在FID上更好,PC-KL在LPIPS上更好,作者将其归因于字符投影的功劳。

6.6. Evaluation of Basis Selection

图9 基本字体权重可视化。左边是十种基本字体,上面是目标字体,每列表示一组权重

十个基本字体互相差别很大,可以手动选取;权重分散而不是聚集在某一个字体上(需多字体配合),解释了为什么上面提到的检索策略不行

6.7. Failure Cases and Limitations

图10 Failure case

选了一些复杂的字,笔画多而且紧凑,作者说自己的方法尽管不错,但还是有一些结构或笔画的错误。

7. Conclusion

巴拉巴拉总结一下

将来可以尝试矢量字体生成,试一下能不能把CFM再套上去

8. Critique

  1. 图1(b)能看到右下角皎皎两个字一模一样,如果能加点随机性应该也能是一个新方向
  2. 图2跟题注配合得不是很好,一股廉价水刊的味道
  3. 风格是整个字体级别的,似乎不如另一篇SDT来得精细
  4. 图4画得也不清晰
  5. 实际上它进行内容融合结果就跟target相似,最理想的情况下岂不是直接得到target?

看下来本文的卖点就一个内容融合,而且工作得似乎不是很好,没有单独的消融,都依靠着PCL,反而PCL更有用一点?自适应内容字体以前也想过,但实现起来太麻烦,没想到真有人发出来了。

又是 80x80 分辨率,跟DG-Font一样大,至少比隔壁的SDT大一点点,怎么今年两篇CVPR都是这种小分辨率。而且很怪的一点是看表1图6图10,本文的模型跟DG-Font都薄纱去年CVPR的Fs-Font跟CG-GAN,应该不至于吧。Fs-Font姑且有个解释,CG-GAN论文中效果很好,而且也跟DG-Font做了对比,是明显超越的,这里得到矛盾的结果不是很奇怪吗,是不是本文分辨率太小不利于他们发挥?还是作者“略微”的魔改整废了模型?感觉是选了一个十分巧妙的对比角度。

综合看下来感觉想法比较有意思,但效果持疑,此外issue回复得很及时也很认真,好评。

9. Unknown

  1. 图4两个字左边跟下边的两个直方图啥意思
  2. ISR要精炼10 epoch,可具体怎么做?作为参数根据PCL反向传播的梯度来优化吗?但是推理时哪来的groundtruth给它算损失呢?
  3. Dataset部分谈及标准中一部分字不被比较方法支持,但怎么会不支持呢?
  4. 测试集为啥取这么多汉字,多一些训练不是会有更好的效果吗,难道是想训练集跟DG-Font保持一致?
  5. user study CG-GAN排第二,但看图6不是应该DG-Font效果更好吗??
  6. 内容融合岂不是要求这个字一定是训练集有的?没有泛化能力?但训练集又只有800个字?但它10图那么难的字也能跑?