[论文阅读] VQ-Font@ Few-Shot Font Generation with Structure-Aware Enhancement and Quantization
Pre
title: VQ-Font: Few-Shot Font Generation with Structure-Aware Enhancement and Quantization
accepted: arXiv 2023
paper: https://arxiv.org/abs/2308.14018
code: https://github.com/Yaomingshuai/VQ-Font
关键词: font generation, quantization, recalibrate
阅读理由: null
Idea
在FS-Font基础上改进,只是不直接解码出图片,而是用交叉注意力结合两路输入,并预训练VQGAN来建模字体图片,使用Transformer根据编码结果预测对应的indices再由VQGAN解码器解码出图片来。
Motivation&Solution
- 当前的方法合成的字形图片经常存在笔画缺失或变形的问题 —— 预测vqgan的indices再解码
- 生成的字形经常与参考字形风格不一致 —— 对应部件计算加权注意力,然后加到原注意力图上进行修正
Background

图1 左边是缺失的细节和变形的笔画 右边是codebook中靠token prior封装的精炼过程
汉字又多又复杂,但都是由基本笔画组成的,因此能够直接在不同粒度级别上吸纳其他参考字形的风格来创造新字形。嫌弃FS-Font粒度太粗(patch-level),然后说现在的方法都是从头学习汉字表征,会遇到图1左边那种笔画缺失变形的问题
提到之前的方法会在抽出的特征上进行平均操作,弱化局部信息,并导致细节的缺失。FS-Font开始避免明确地分离内容风格,它利用交叉注意力机制匹配 patch-level 的内容-参考字形关联,本文遵循FS-Font的设定,并尝试解决细节缺少和笔画变形的问题。
提到 codebook 可以用于图像修复任务去重建图片细节,如 RIDCP 用不包含 青蛙/雨 信息的codebook去做图片去雾(image dehazing);FeMaSR用来做超分,Codeformer和VQFR用存储高质量面部纹理的codebook来做 blind face restoration ...
受此启发,作者弄了个 font codebook,含有丰富的笔画先验。但后面也没展示怎么实现图1这个精炼
Method(Model)
Overview

图2 汉字中的结构部件划分
利用了汉字的笔画部件,能提高结构级别的风格匹配和融合。如图2,几乎所有汉字都能分成12种结构,根据这种划分,当内容字形的部件出现在参考字形中,就能将其作为一个整体来处理。
预训练一个 VQGAN ,让它能生成真实的字体图片,再用Transformer预测相应token,
结构级的风格增强模块(Structure-level Style Enhancement Module, SSEM)
Self-Reconstruction for Font Token Prior

图4 本文VQGAN的细节。
公式略,跟原VGGAN似乎一样,有非常好的泛化能力。
Token Prior Refinement
利用vqgan的codebook和解码器,将字体生成任务转换为indices预测任务。
Styles aggregation. 跟FS-Font一样,VQ-Font也用了交叉注意力模块来捕捉细粒度风格,以内容字 I_c 为query,以k个参考字形 I_s 为key,value,然后从风格特征\(f_S\)提取汇聚特征\(f_{cs}\)。作者称该特征为patch-level汇聚特征,容易生成变形的笔画。
Vector-Quantized font generation. 接下来为了借助VAGAN的 token prior 希望把 \(f_{cs}\) 根据codebook变为 \(f_{q}\),然而特征不一致,无法直接进行 nearest neighbor lookup。于是用了Transformer来预测 \(f_{cs}\) 所有 patch token 的indices,它有15层自注意力。给定目标字形 \(I_g\),作者认为 \(f_{cs}\) 的indices应该近似 \(I_g\) 编码并量化而来的indices,此外还能靠 \(I_g\) 算一下重建损失。训练中固定codebook,只微调decoder的前几层。
Structure-level Style Enhancement (SSEM)

图5 structure-level风格增强模块(SSEM)总览
虽然用上 learned priors,但仍然有些细粒度的风格不一致,如图7里倒数第二行。比起RGB图片,单通道的few-shot字体生成的图片更可能出现不相关的 patch-level 风格,主要原因是原注意力权重 \(A_{patch}\) 主要基于几何(mainly based on geometry)。作者的方案是使用图2里的汉字内在结构以进一步校准注意力权重(further recalibrate)
基于图2,分别将内容字形和参考字形都分解为结构部件 \(p^c_i,\; p^r_j\) ,它们表示 patch 位置的集合(set of patch positions),然后计算 structure-level 注意力权重 \(A_{stru}\),如图所示,该权重通过汇聚 patch-level 权重得到:
然后将结果加回相应的 patch 位置:
公式7可重写为:
这样可使得注意力图更专注于相应结构部件,减少无关笔画的影响。但 \(p^c_i,\; p^r_j\) 不知道是什么勾八,怎么来的,看起来似乎是利用结构信息强化了对应位置的权重?
A.3 Chinese Character Partition in SSEM
附录内容(明明很重要)

图10 不同结构的汉字样例

图11 不同颜色表示特种图中不同结构部件的位置集合,每个小方块代表特种图的一个patch
首先如图10,每个汉字都能分配一种结构。再如图11,基于汉字的结构信息将16x16的特征图划分成结构部件,其余10种结构也如法炮制,可获得不同结构部件patch的位置集合(position sets,这到底tm是什么勾八)。总之利用得到的位置集合,能定位 \(A_{patch}\) 中内容和风格字形的结构部件,那么对内容和风格的特征图相应位置集合的权重取平均,就得到了 \(A_{stru}\)。
还是不太清楚,但看起来是最简单粗暴的一种,定死了12种结构的划分方式,根据每个汉字所属的结构,划出对应部件所在的位置,代码验证了这点
但结合图5理解,\(A^{(i,j)}_{stru}\) 应该是一个标量,针对内容字形的部件i和风格字形的部件j之间的加权注意力?
其实看了代码发现就是一个交叉注意力,跟另一篇vqfont一样,照搬FsFont的代码,将风格特征变为k, v,内容作为q进行注意力的计算。
最终输出扔给Transformer的自注意力层,编码结果经过mlp直接预测indices,再使用vqgan解码为图片。
看代码,它用的vqgan加载 vqgan/1024_16*16_vaecoder.ckpt
权重,然后冻住了解码器的一些层,然后其余都参与训练,想必训练开销不会小,也是一种偷懒的办法吧,不然indices再解码为图片可就不好传播梯度了。
Training Objective
Cross Entropy loss. 分为主分支以及利用 \(I_g\) 计算的重建分支两部分
L1 loss. 计算生成图片 \(I_q\) 和 \(I_g\) 之间的L1损失
Adversarial loss and Perceptual loss. 加上对抗和感知损失,使用多头投影判别器,将汉字的unicode编码作为标签
\(\Phi\) 表示VGG16
Overall objective loss.
其中超参数如下:\(\lambda_{m a i n}=\lambda_{1}^{f}=2,\lambda_{s e l f}=\lambda_{p e r}^{f}=1 and \lambda_{a dv}^{f}=0.002.\)
Experiment
Settings
预训练阶段图片会被编码到16x16,codebook大小设为1024,vqgan以4e-5学习率训练2e5个iter。交叉注意力模块的注意力头数量为8,每个汉字取3个参考字,还有个 token prior refinement 阶段??(训练主体模型的阶段?),VQ-Font部分层训练300K,学习率2e-4,Adam优化器,batchsize=32,A6000 GPU(48GB 显存)。
Dataset
382字体,每种3499汉字,分辨率128x128。汉字划分:2841:158:500=已知:参考:未知。跟FS-Font一样,每个汉字选3个参考字,覆盖其大多数结构部件。内容字体取楷体,在371种已知字体上训练模型。
Comparison Methods

表1 与SOTA比较结果

图6 在UFUC数据集上比较
Quantitative evaluation. 表1展示在L1上本文模型对于第二好的,在 SFUC,UFUC 分别有高达 7.99%, 6.76% 的提升...指标降得都很低,推测是是不是由于损失函数里直接存在 L1,LPIPS 导致的?而且SFUC的结果只有些微好于UFUC,是否说明该方法只要能找到有对应部件的参考字,效果就会很好,换言之,如果找不到呢?
Qualitative evaluation 图6前两行红框是一些 stroke artifacts,DG-Font 和 CF-Font 在第二第三列都有一些笔画缺失和扭曲,FS-Font有一些模糊跟细节缺失(第五第六列)
User study. 30志愿者,挑10字体,每个10汉字,考虑内容准确和风格是否一致,数据在图1右侧
Ablation Study

表2 不同VQ-Font变体的定量结果。C, S分别表示codebook和SSEM

图7 不同VQ-Font变体的定性结果。参考字形里出现的部件用蓝色框出
光看表2数字确实降了,但好像没降很多?

图8 不使用&使用 SSEM 的注意力图

表3 冻结和微调解码器的比较
图8表示SSEM可以去掉无关区域的注意,如红框所示。表3表示微调的重要性,decoder应该是说vqgan那个。
Conclusion
提出了VQ-Font,创新点就是用了预训练的vqgan(token prior refinement)和SSEM
Critique
文中提到图片的顺序有点乱,表达能力差,阅读体验不好。
代码一个函数12条if,还多次出现,可能是对应12种结构,但看着很难受,其余部分写得也挺随便。
代码的数据读取是一点优化都没有,全是循环读取,而且用了对比损失还需要两倍的参考图片(测试时不需要),更加缓慢。显卡占用率从9~45%不断震荡。VQVAE还好,但训练时8G显存只塞得下14个batch,2天只能跑将近30%
才发现代码中有一个是获取全局风格,其实就是参考字跟目标算相似度然后加权参考特征,然而限死了用的参考图片必须大于等于3
Unknown
- SSEM原理
本文作者:心有所向,日复一日,必有精进
本文链接:https://www.cnblogs.com/Stareven233/p/17677273.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
2023-12-12 [论文阅读] Replacing softmax with ReLU in Vision Transformers