pre
title: SE-GAN: Skeleton Enhanced GAN-based Model for Brush Handwriting Font Generation
accepted: ICME 2022
paper: https://arxiv.org/abs/2204.10484
code: none
亮点:毛笔、书法、skeleton
针对问题
毛笔手写体字体(brush handwriting font)生成
核心思想
简单来说就是通过抽取、生成skeleton,并将其加入损失项来提高模型性能。
具体点,从训练图片X根据非神经网络方法抽取骨架(skeleton),再分别用编码器抽取相应特征,设计一个自关注的精炼注意力模块(self-attentive refined attention module, SAttRAM),融合原图特征跟skeleton特征进而生成字形Y,同时还有个预训练好的SkeletonGAN根据Y生成对应skeleton并拿去跟最初抽取的那个计算损失
相关研究
中国书法(chirography)的风格可以被定义为skeleton结构跟笔画风格。骨架包含字符的基础信息,如笔画的组合跟位置,书写方向等等。而笔画风格代表骨架形变,如粗细、形状、书写力度(writing strength)等。
大部分字体生成研究者都着眼于标准打印字体合成(Standard Print Font Generation (SPFG)),对于毛笔手写体生成(Brush Handwriting Font Generation (BHFG))研究比较少。
![](/i/l/?n=23&i=blog/1593499/202212/1593499-20221217190700958-1568542763.png)
图1 SPFG跟BHFG图解
如图1所示,BHFG难多了。skeleton持有的结构信息对于识别某个字很重要,使得即便风格不同也能认出字来,但大部分SPFG方法都忽视了skeleton的重要性。
Image-to-Image Translation
介绍Pix2pix, CycleGAN,StarGAN。U-GAT-IT验证了注意力模块在image translation任务上的有效性,引导模型更注重于不同域之间更重要的区域。这种用于逐像素转换的,只适合源图跟目标图形变部分很少,无法直接应用于字体生成任务。
Chinese Font Generation
大部分之前的工作都把字符图片生成当做image translation任务。介绍了Zi2zi跟其他几个只标注了论文序号没有名字的模型,而且比较早。
总之介绍了该领域模型的发展,从使用配对数据到非配对,然后加入循环一致性损失,分离分离内容跟风格。还有一些做多风格字体生成、多阶段(multi-stage)模型。
说大部分工作的源/目标风格或形状都非常相似,都集中在处理SPFG问题。
贡献
- 为BHFG提出新的端到端SE-GAN,设计自关注的精炼注意力模块(self-attentive refined attention module, SAttRAM)去抽取并融合来自源图片跟skeleton图片的特征
- 在六种字体上做了大量实验,验证了SE-GAN相对于强baseline的有效性(作者讲的)
- 开源了个大规模字体图片数据集
方法(模型)流程
Overview
作者为BHFG提出了一种新的端到端 Skeleton Enhanced Generative Adversarial Network (记为 SE-GAN),可以处理不同风格中巨大的几何差异。
![](/i/l/?n=23&i=blog/1593499/202212/1593499-20221217190730760-62868696.png)
图2 SE-GAN架构,包括转换网络,两个判别器跟一个辅助skeletonGAN网络
图2展示了带两个编码器的框架:图片编码器\(E_i\)跟skeleton编码器\(E_s\),都由4个残差块组成(图中一开始的渐变橙黄色等腰梯形)。
SRAM, CRAM是SAttRAM的两个变体,顺序堆叠来抽取skeleton增强的(skeleton enhanced)图片表达。
生成器(应该指的是黄色的解码器)接收精炼的图片表达,生成目标风格图片。
上方的第一个判别器\(D_i\)用于判断生成图片跟目标图片(经典款),下方的\(D_s\)判断生成图片的skeleton跟目标图片的skeleton是否一致。
skeleton抽取算法来自论文《A Fast Parallel Algorithm for Thinning Digital Patterns》 (IPCV, Image Processing and Computer Vision, 1984),即Zhang-Suen细化算法 / 张-孙细化算法。
通过对二值字符图片迭代进行腐蚀(erode)和膨胀(dilate),简单有效地抽取出skeleton
Self-attentive Refined Attention Module
CAM在图片生成跟分类任务中,局部化输入图片的重要区域很有效,作者用于抽取字体生成任务中风格明确(style-discriminative)的注意力热力图。
为了获得风格明确的特征\(M(x)\),将源字体x解码的特征图\(F(x)\)喂入分类器做域的分类,分类器是一个带权重\(\Omega\)的全连接层。对所有通道计算线性加权和能得到CAM的注意力热力图:
\[M(x)=\sum_{c=k}^{C}\Omega_{k}F(x)_{k} \tag{1} \]其中\(\Omega_{k}\)表示最后一个卷积层特征图中的第k个通道的权重。
但CAM缺少空间注意力,而且对于特征捕获会有过度We design two discriminators for learning target font s激活的问题(over-activation issues)。而且很难用一个CAM模块融合多模态特征。
![](/i/l/?n=23&i=blog/1593499/202212/1593499-20221217191016898-2138595072.png)
图3 SAttRAM,两个变体的输入不同
因此提出了图3中的SAttRAM,将自注意力用作一种有效的模块,通过捕捉空间依赖来精炼(refine)逐像素的注意力热力图,精炼后的特征图如下:
\[\hat{M}(x)=f(F(x),F(x))g(M(x))+M(x) \tag{2} \]\[f(F(x),F(x))=\sigma(\theta(F(x))^{T})\phi(F(x))) \tag{3} \]f是一种成对的嵌入函数,计算特征空间中点积像素亲和度(affinity)作为自精炼(self-refined)注意力权重,最后通过softmax函数\(\sigma\)归一化。
总之公式3大概指的是图3左上角那两个1x1 conv,最终得到一个特征图
函数g将特征进行reshape,再根据f函数给出的相似度权重重新汇聚。图3中左下角的分支应该是先根据公式1计算M(x),再根据公式2计算出最终的\(\hat{M}(x)\)
俩变体self-refined attention module (SRAM) 和 the cross-refined attention module (CRAM),似乎对应了自注意力跟跨注意力,作者说是为了处理多模态输入特征。
SRAM捕捉输入图片的信息,CRAM捕捉模态间的交互,也就是输入图片特征\(x_i\)跟skeleton特征\(x_s\)之间的,可以进一步精炼特征图:
\[\hat{M}(x_{i},x_{s}))=f(F(x_{i}),F(x_{s}))g(M(x_{i}))+M(x_{i}) \tag{4} \]公式4里字符编码特征被函数g嵌入残差空间,f代表\(x_i,\; x_s\)之间的像素级特征汇聚
通过CRAM将skeleton特征跟原图片特征混合在一起,但怎么知道要把风格变成什么样?(后面一看好像目标风格是固定的,想要其他风格得重新训练)
Discriminators
设计了两个判别器学习目标字体风格,Overview提到的那两个\(D_i,\; D_s\)。由于骨骼化(skeletonization)是不可微的,于是用预训练的skeleton-GAN来生成字符图片的相应skeleton。
这块利用额外的GAN根据字形图片(\(Real Y_t,\; Fake Y\))生成skeleton,判断主生成器生成的Fake Y的skeleton是否正确。整个流程skeleton从抽取、注入,再生成并用于约束生成结果,感觉是通过专门处理skeleton来告诉模型注意字形的内容跟结构。
作者提及skeletonGAN就是一个CycleGAN,没使用SAttRAM,因为骨骼化比生成字形简单。
同时\(D_s\)也能防止SE-GAN过拟合。
Loss Design
内容损失包含两部分:像素损失\(L_{pix}\),迫使生成的图片\(G_F(X_i, X_s)\)相似于目标图片\(Y_t\),以及骨架一致性损失\(L_{sc}\),确保骨架一致性,下面SG是预训练的skeletonGAN:
\[L_{p i x}( G_{F}) = \mathbb{E}_{X} [|| G_{F}( X_{i}, X_{s}) - Y_{t} | |_1] \tag{5} \]\[L_{s c}(G_{F},S G)=\mathbb{E}_{X}[||S G(G_{F}(X_{i},X_{s}))-S G(Y_{t})||_{1}] \tag{6} \]循环一致性损失\(L_{cycle}\)就是CycleGAN论文的原始版本。
然后为了区分图片\(X_i\)属于源/目标风格\(y_{cls}\)并促进精炼注意力模块的风格转换,引入U-GAT-IT里的CAM loss,这里叫作\(L_{adv}\)
对抗损失\(L_{adv}\)自然也是分成字形\(D_{i}\)跟骨架\(D_{s}\)两部分:
\[L_{D_{i}}(G_{F},D_{i})=\mathbb{E}_{Y}[l o g D_{i}(G_{F}(X_{i},X_{s}))] \\ +\mathbb{E}_{X}\,\lbrack{l o g}(1-D_{i}(G_{F}(X_{i},X_{s})))\rbrack \tag{7} \]\[L_{D_{s}}(G_{F},D_{s})=\mathbb{E}_{Y}[l o g D_{s}(Y_{s})] \\ +\ \mathbb{E}_{X}[l o g(1-D_{s}(SG(c_{F}(X_{i},X_{s}))))] \tag{8} \]最终这些损失根据\(\lambda_i\)加权成完整的目标函数:
\[\min_{G_F,G_B,RAM_p} \max_{D_1,D_2} \lambda_{1}L_{a d v}+\lambda_{2}L_{c y c l e}+\lambda_{3}L_{c l s}+\lambda_{4}L_{c o n} \]实验
数据集
提出了个大规模的毛笔手写字体图片数据集,六种字体,15,799张高分辨率图片。每个子集的尺寸从1,419到3,958。
实验中按照8:1:1比例将每个子集分为train/dev/test集。源域选择标准打印字体Liukai,分别将六种字体作为目标域(这样岂不是要训练六次?,无法自由地更换转换目标啊)
指标
内容准确度Acc跟Frechet Inception Distance (FID)
![](/i/l/?n=23&i=blog/1593499/202212/1593499-20221217191054751-1034606295.png)
表1 字体图片生成上的评估 Acc表示字符识别的内容准确率(DF-Font标错了,应该是DG-Font)
实验结果
![](/i/l/?n=23&i=blog/1593499/202212/1593499-20221217191103192-179756254.png)
表2 数据集中六种字体的统计数据
跟四个有代表性的生成模型对比,zi2zi, CycleGAN, StarGAN, 和 DGFont,见表1。
得分其实不算很突出,比较毛笔字还是很难模拟的,对比的baseline并不算强,前两个是很早的东西,StarGAN并非专用于字体生成,DG-Font也更突出可变形卷积的使用,在自己的论文中得分也不算高。
统计数据见表2(文章里讲的是看表1)
Quantitative analysis.
下面吹嘘了一番自己的模型。甚至DG-Font一直拼成DF-Font(本文后续均进行改正),说它内容准确度高,因为生成结果变化不大,跟输入很像,因此FID也比较低。
![](/i/l/?n=23&i=blog/1593499/202212/1593499-20221217191152128-2064248846.png)
图4 不同baseline跟SE-GAN生产的样本比较
Qualitative analysis.
看图4,SE-GAN的样本更好辨认,书法风格更加一致。然后挑了些其他baseline的错误,但总觉得这SE-GAN也就略好一些,还是有很重的原图气息,虽说懂得加上一些连笔。
Ablation Study.
去掉了skeleton输入、skeleton判别器,见表1。去掉这俩准确度有所下降,证明skeleton有用。同时去掉后还能超越CycleGAN,说明SAttRAM有用。
![](/i/l/?n=23&i=blog/1593499/202212/1593499-20221217191210439-1916340480.png)
图5 (a)消融模型生成的样本 (b)不同注意力模块的可视化
如图5(a)所示,缺少skeleton会导致笔画残缺或过分夸大,去掉\(D_s\)一些组件就会混在一起
看图5(b),SRAM 和 CRAM 比 CAM 更少出现过激活(over-activations),同时覆盖范围更完整。CRAM学到的字体形状比SRAM更加准确,验证了skeleton的作用
![](/i/l/?n=23&i=blog/1593499/202212/1593499-20221217191220608-1331355438.png)
表3 不同模型的用户调查结果
User Study.
两种用户调查,跳过DG-Font因为它在表1中表现不好(但感觉还是比zi2zi强吧,甚至觉得是放进去会在用户调查中超越SE-GAN)。叫了60个3年书法经验的美术生参加,表3可以看到本文的模型最好
表3两行分别是那两个实验:用户偏好分数、跟人书写的样本混在一起让受试者挑选好看的(应该是被选中的几率)
总结
提出了毛笔字生成的SE-GAN,加入了skeleton信息,设计两个编码器、新的自注意力模块,还有skeleton判别器。实验表明模型超越了几个强baseline(尬吹,那几个哪能算得上强啊),然后说将来计划探索预训练image tranlation模型的使用(这不早就被人做光了吗,从zi2zi的pix2pix到最近的FUNIT,感觉终归不如专为字体生成任务设计的模型,还是说继续探索替换的是skeletonGAN?也说不通吧,明明说不需要太复杂的)
评价
其实感觉挺水的,看着skeleton点进来的,没有想象中的效果,效果可能不如FontRL,文章倒是挺清晰,有一些细节错误
将skeleton加入自己的模型中加强对连笔的学习
待解明
SAttRAM模块看着跟自注意力真挺像,为什么不能直接用呢?
标签:based,skeleton,Generation,生成,GAN,字体,SE,图片 From: https://www.cnblogs.com/Stareven233/p/16979438.html