pre
title: Diff-Font: Diffusion Model for Robust One-Shot Font Generation
accepted: arxiv 2022
paper: https://arxiv.org/abs/2212.05895
code: none
ref: https://www.zhihu.com/question/545764550
关键词:one-shot,字体生成,扩散模型
阅读理由:扩散模型在字体这边的第一次应用(大概),对其性能跟训练开销很感兴趣
针对问题
图1 跨字体(cross-font)和复杂字符问题的示例。a跨字体例子,源/目标风格差异巨大,基于I2I框架的方法会丢失局部细节(第三第四列);b微小的跨字体差异,应该是说对于相似的不同字体,MX-Font跟DG-Font生成结果过于接近,而Diff-Font就能区分二者;c复杂字符错误生成的例子,I2I框架处理不好复杂结构
- font gap:巨大的cross-font差异,理解为源字体跟目标字体差异过大
- font variation:微小的cross-font变化,应该是两个目标字体较相似不好区分
- complicated characters:无法正确生成复杂字符
提到的这3个问题可以参考图1。
大多数已有方法基于GAN,因为对抗损失而难以收敛,还有模式坍塌问题。广泛使用的I2I框架(image-to-image translation framework)容易忽视潜在的cross-font变化(第2点)。他们生成结果太粗糙,面对微小差异无法产生高质量结果。
对于第1点,将一个源字体映射到多种目标字体很容易因为差异太大而导致生成质量很差,这个倒是真的,因此也想过自适应挑选源字体...
于是基于扩散模型提出one-shot的Diff-Font,能够在大数据集稳定训练并收敛。为了解决问题1,2,模型将内容风格视为条件,基于他们它生相应字符,而不是学习两个字体域的映射。构建大的笔画级(stroke-aware/stroke-wise)数据集,用笔画数量的表示编码每个字符的所有基础笔画。用这种笔画级扩散模型,能够保持每个生成汉字的结构,解决问题3
核心思想
代码可能是基于 DG-Font 和 DDPM,论文书写基于DG-Font
用字符属性编码器编码内容c、笔画sk、风格sty并简单拼接作为条件z,其中sk的编码改进于StokeGAN里的方式。
训练分两阶段,第一阶段跟DDPM一样用z进行多属性条件式训练,第二阶段利用随机策略结合c跟sk修正预测的噪声并对模型进行微调以生成目标字符
贡献
- 提出Diff-Font,one-shot,基于扩散模型的第一次尝试,训练稳定
- 用条件生成扩散模型而非I2I框架处理字体生成问题(事实上大多数都是条件生成的),构建了个笔画级数据集。
- 在大、小数据集上跟SOTA比较,验证了Diff-Font在one-shot字体生成的有效性(但比较的这俩好像都不是one-shot方法,虽说那个号称one-shot的XMP-Font没放出代码来)
相关研究
各语言字符数 中文 (>60K glyphs), 日语 (>50K glyphs), 韩语 (>11K glyphs)
大多数现存的字体生成方法都用基于GAN的I2I框架,Rewrite、zi2zi通过学习两个风格间的映射来产生字体库,EMD分离内容风格表达,可以产生新风格的字体。DG-Font采用无监督的I2I框架,并设计特征可变形跳跃连接以取得更好性能。MX-Font使用多头编码器捕捉多个局部细节。FS-Font(百度那个吊东西)用一个特殊编码器跟跨注意力机制来学习细粒度的局部风格。
同时一些其他工作利用辅助信息(auxiliary annotations),如笔画、skeleton、组件使模型关注字形的特定结构跟细节。基于组件的如DM-Font,LF-Font,CG-Font(然而应该叫CG-GAN),它们抽取组件特征来维持局部组件信息。
这部分跟DG-Font写得实在太像,肯定有借鉴
Image-to-Image Translation
Image-to-Image Translation是学习源域到目标域的图片风格转换,在Pix2Pix首次提出,基于cGAN那样的思想用条件指导生成过程。后面只列举一些论文标号,懒得去查了...Pix2Pix后续有些论文将这种1对1域转换扩展到多对多域转换。然后部分论文加入了循环一致性损失。
UNIT结合CoGAN跟VAE去学习各个域之间的共享隐空间。FUNIT通过两个编码器实现内容和风格的解耦,并使用AdaIN将其结合。GMM-UNIT使用高斯混合模型(GMM)建模内容属性。
注:GMM是k个不同的高斯分布的加权和,体现混合的含义,作为一个生成模型,它根据混合成分的概率密度函数进行采样,从而生成相应的样本。
进来有些方法基于DPMs处理图像到图像任务。Palette使用多种多样的条件信号,用同一个DPM解决4个不同的图像到图像子任务。Wolleb对每个任务额外训练特定模型,对于特定任务它不需要重新训练扩散模型,可以使用任务特定的模型的梯度去指导扩散模型每步的采样。
Few-Shot Font Generation
Few-Shot Font Generation就是凭借少数参考风格图片就产生有数千字符的完整字体库。然后说大部分都依靠I2I框架,还有解耦风格内容的,其中一些用到额外信息(笔画那些)。
DG-Font通过替换无监督框架TUNIT中的传统卷积为可变形卷积,实现高效的风格迁移。ZiGAN将不同风格的同一个字投影到希尔伯特(Hilbert)空间,学习粗粒度的内容知识。MX-Font使用多头编码器负责给定图片的不同局部子概念。FS-Font提出风格汇聚模块SAM跟辅助分支去学习参考字的局部风格,以及内容跟参考字形之间的空间联系。
SC-Font跟StrokeGAN(还能看到这吊东西啊)使用笔画级数据改进结构准确性,并降低生成图片中的笔画错误率。SE-GAN通过抽取并学习skeleton知识实现笔刷手写体生成BHFG。DM-Font使用双存储器架构将字形拆分为风格化的组件并重新将其组合为新字形。其改进版LF-Font设计组件级的风格编码器和分解模块来捕捉富文本(rich text design)中的局部细节。CG-GAN提出更加精细化的判别器来监督生成器在组件级解耦内容跟风格。
这篇文章的相关研究算是比较详细而且比较新的了,不过真要整理的话还是有部分(基于RNN、强化学习、矢量图形那些)没被提到,感觉大家都只是挑几个讲一讲,只能说这破领域太零散了,或许很需要一篇综述?
Diffusion Models
扩散模型是一种新型生成模型,由扩散跟反扩散组成。使用马尔科夫链将高斯噪声分布转换为真实数据分布。
《Deep unsupervised learning using nonequilibrium thermodynamics》 首先明确了扩散概率模型的定义, 去噪扩散模型DDPM改进其理论,并提出使用UNet预测每个扩散时间步加入图片的噪声。
《Diffusion models beat gans on image synthesis》 提出分类器指导的机制,它采用预训练分类器为目标类别的图片生成提供梯度信息作指导。 《Classifier-free diffusion guidance》 提出联合训练条件式和非条件式扩散模型的技术,无需使用分类器。
DDIM将原始DDPM扩展到非马尔科夫的情况,能够使用大步长(step size)做出准确预测,将采样步数减少到十几分之一(one of the dozens)。实际应用中ILVR在采样中的每一时间步使用一张参考图片指导生成。Glide、DALL-E2和Imagen引入预训练文本编码器来生成语义隐空间,并在文本到图片任务上取得非凡结果。
其他一些工作探索用多个条件指导扩散模型的生成。SDG设计一种采样策略,为无条件扩散模型的采样步骤添加多模态语义信息,可以实现语言引导和图片引导生成。Diss使用笔画图片和草图(sketch image)作为多条件去训练条件式扩散模型,以便根据手绘图(hand-drawings)生成图片。《Compositional visual generation with composable diffusion models》将扩散模型看作一些基于能量的模型(energy-based)的组合,并提出两个复合运算符(compositional operators):连接和取反(conjunction、negation),可以实现大量物体的zero-shot组合式生成。《Image generation with multimodal priors using denoising diffusion probabilistic models》通过计算多个模式的综合条件分数来指导扩散模型的生成,以解决多模态图片生成的问题。
本文方法基于多属性条件扩散模型,通过使用字符的多个属性,它训练稳定且结果质量高,同时生成步骤里用DDIM。
扩散模型这部分就不确定了,没玩过,而且作者讲得比较简短,如果没看过论文估计前两个领域也看不懂吧...
方法(模型)流程
Overview
图2 所提模型的综述。扩散阶段逐步为图片x_0添加噪声,使之在时间步T之后接近高斯噪声。反向扩散阶段使用隐变量z,它包含x_0的内容、笔画和风格语义信息,将其作为条件去训练DDPM(UNet架构),以预测每个扩散阶段添加的噪声
Diff-Font框架如图2所示,它由两个模块组成,一个是字符属性编码器f,负责将字符属性(内容c、风格sty、笔画sk)编码为隐变量\(z = f(c,sk,sty)\);另一个是DDPM,将隐变量作为条件从高斯噪声中生成字符图片。
之前大多数依赖I2I的方法从源域的图片去提取内容表达,而这里将不同内容的字看作不同的类别,使用嵌入层将字符的不同类别转换为不同的内容表达。
图3 a展示用到的32个汉字笔画 b展示StrokeGAN中编码笔画的方式 c展示本文方法编码笔画的方式,区别在于加入了笔画数量的考虑
笔画方面则跟StokeGAN一样用32维的笔画变量,但每一维不是0/1,而代表这个笔画在对应字里面的数量,看图3。好家伙真让我说中了。这种计数编码更能代表字的笔画属性,随后将该笔画向量扩展为跟内容嵌入维度一致。
风格表达由预训练的风格编码器抽取,就是DG-Font训练的那个,这个编码器在DDPM训练时冻结参数。总之这样就拿到了3个属性编码,拼接在一起就成了喂入扩散模型的条件z
扩散阶段逐步给真实图片\(x_0\)添加高斯噪声,使其成为噪声\(x_T\),由此得到了一条长的马尔科夫链。使用UNet架构的DDPM学习反向扩散过程,通过使用多属性的条件隐变量z从高斯噪声生成字符图片。这种条件生成用于缓解 ## 针对问题 中提到的font gap 和 font variation。
Multi-Attributes Conditional Diffusion Model
像分子的热运动,这里给图片添加成千上万次高斯噪声,逐步将其从稳定态转换为混乱态,这称为扩散过程,记作如下公式:
\[q(x_{1:T}|x_{0})=\prod_{t=1}^{T}q(x_{t}|x_{t-1}), \tag{1} \]其中
\[q(x_{t}|x_{t-1})=N(x_{t};\sqrt{1-\beta_{t}}x_{t-1},\beta_{t}{\bf I}),\quad t=1,\ldots, T, \tag{2} \]\(\beta_{1} < \ldots < \beta_{T}\)是DDPM用的variance schedule,表示不同step使用的方差序列,可以看到step越后面的方差越大。根据公式2,\(x_t\)可以写作:
\[x_{t}=\sqrt{1-\beta_{t}}x_{t-1}+\sqrt{\beta_{t}}\epsilon_{t-1},\epsilon_{t-1}\sim\mathcal{N}(\mathbf{0},{\mathbf{I}}) \tag{3} \]\[=\sqrt{\bar{\alpha}_{t}}x_{0} + \sqrt{1-\bar{\alpha}_{t}}\epsilon,\bar{\alpha}_{t} = \prod_{i=1}^{t}\alpha_{i},\epsilon \sim \mathcal{N}(\mathbf{0, I}) \tag{4} \]\[\sim\mathcal{N}(x_{t};\sqrt{\bar{\alpha}_{t}}x_{0},\bigl(1-\bar{\alpha}_{t}) \mathbf I) \tag{5} \]其中\(\alpha_t = 1 - \beta_t\),并且\(\alpha_t\)与\(\beta_t\)负相关,有\(\alpha_1 > \ldots > \alpha_T\)。当\(T \rightarrow \infty,\; \bar{\alpha}_T \rightarrow 0\),\(x_T\)近似服从\(\mathcal{N}(0, I)\),\(q(x_{t-1}|x_{t})\)也是高斯分布。因此反向过程可以从各向同性高斯分布中采样一个噪声图片\(x_T\),通过在长长的马尔科夫链中对\(x_T\)降噪来生成指定的汉字图片,这一过程会用到那个多属性条件z。
由于后验概率\(q(x_{t-1}|x_{t})\)难以估计,用\(p_\theta\)近似后验概率分布:
\[p_{\theta}(x_{0:T}|{z}) = p(x_{T})\prod_{t=1}^{T}p_{\theta}(x_{t-1}|x_{t},{z}), \tag{6} \]\[p\theta(x_{t-1}|x_{t},z)=\mathcal{N}(\mu_\theta(x_{t},t,z),\Sigma_{\theta}(x_{t},t, z)). \tag{7} \]跟DDPM一样,将\(\Sigma_{\theta}(x_{t},t, z)\)设为常数,那么要学习的就是\(\mu_\theta\)。但DDPM发现预测均值并不是最好的选择,因此扩散模型\(\epsilon_{\theta}(x_{t},t, z)\)学习预测扩散过程中加给\(x_0\)使之变为\(x_t\)的噪声,z是为了训练能更简单。通过这些简单的操作,可以用标准MSE损失来训练多属性条件式扩散模型:
\[L_{s i m p l e}=\mathbb{E}_{x_{0}\sim q(x_{0}),\epsilon\sim \mathcal{N}(0,I),z}[||\epsilon-\epsilon_{\theta}(x_{t},t,z)]|^{2}]. \tag{8} \]算法流程,来自DDPM论文《Denoising Diffusion Probabilistic Models》
实际上跟DDPM好像一样,训练过程见上图算法1部分:
- 随机选择一个训练样本
- 从1~T随机抽样一个t
- 随机产生噪声并给样本加噪声
- 输入网络预测噪音
- 计算产生的噪音和预测的噪音的L2损失
- 计算梯度并更新网络
Attribute-wise Diffusion Guidance Strategy
为了实现属性级别的生成,采用两阶段训练策略。除了第一阶段的多属性条件式训练,还有个第二阶段的微调策略,就是按30%概率随即去掉内容或笔画属性向量。若二者同时被去掉,就把风格向量也扔了。该略略使得模型对这三种属性更加敏感,这里使用0向量替代被丢弃的属性向量,记为\(\mathbf{0}\)
采样时将预测的噪声\(\epsilon_\theta\)修改为\(\hat{\epsilon}_\theta\):
\[\hat{\epsilon}_{\theta}(x_{t},t,f(c,s k,s t y)) = \epsilon_{\theta}(x_{t},t,\mathbf{0}) \\ +\ s_{1} \ast (\epsilon_{\theta}(x_{t},t,f(c,\mathbf{0},s t y))-\epsilon_{\theta}(x_{t},t,\mathbf{0})) \\ +\,s_{2} \ast (\epsilon_{\theta}(x_{t},t,f(\mathbf{0},s k,s t y))-\epsilon_{\theta}(x_{t},t,\mathbf{0})), \tag{9} \]其中s1, s2是内容和笔画的引导缩放,于是利用上面修改过的噪声可以从\(x_t\)得到\(x_{t-1}\):
\[x_{t-1}={\frac{1}{\sqrt{\alpha_t}}}(x_{t} - {\frac{(1-\alpha_t)}{\sqrt{1-\bar{\alpha}_t}}}\hat{\epsilon}_{\theta})+\sqrt{(1-\alpha_{t})}\omega,\omega\sim N(\mathbf{0,I}). \]通过不断应用上式,可以生成给定风格跟内容的字符图片\(x_0\),本实验使用了DDIM来加速生成过程。
实验
用本文提出的数据集重新训练 FUNIT, MX-Font 和 DG-Font,再跟Diff-Font以one-shot方式进行比较,即只使用一张参考图片,源字体选宋体。
数据集
搜集了410个字体,包括手写跟印刷体,每个字体6625个字,涵盖几乎所有常用汉字。而数据集又分large, small两个。small训练集有400字体,每种字体随机挑选800字,测试集含有剩下10种字体,字跟训练集一致。large数据集就是搜集的完整的数据集,训练集含400字体跟所有6625个字,测试集含有剩余10个字体跟复杂又笔画多的800个字。
实验中小数据集的数量跟DG-Font保持一致,公平比较起见,图片大小同样设置为80x80,这部分跟DG-Font也超级像
指标
- SSIM(tructural Similarity): 模拟人类视觉从3个方面比较图片的结构相似度,亮度对比度跟结构
- RMSE(Root Mean Square Error): MSE开根号,计算两张图片像素值的均方根误差来衡量相似度
- LPIPS(Learned Perceptual Image Patch Similarity): 感知级指标,衡量图片在深度特征空间的距离
- FID(Fr ́echet Inception Distance): 衡量生成图片跟真实图片在分布上的不同
实验结果
表1 图片质量的指标比较
图4 在large测试集上每个方法的生成结果
定量结果看表1,Diff-Font大幅超越了第二的方法,尤其是在FID指标上
定性结果看图4,定义简单风格为跟源字体相近的书写风格,其他则是困难风格。定义笔画小于等于10的字为简单内容,笔画大于等于15的为困难内容。最终在3种设置下完成定性比较: ESEC (easy styles and easy contents), ESDC (easy styles and difficult contents), and DSDC (difficult styles and difficult contents)。
FUNIT生成汉字经常不完整,结构一复杂就会产生扭曲的结构,MX-Font能维持字符形状,但结果经常模糊且背景不清晰。DG-Font在ESEC任务上表现好,但笔画多了就会丢失重要细节。
Ablation Study
表2 笔画感知条件模块的有效性
表3 笔画计数编码形式比起one-bit笔画编码的有效性
图5 消融研究的定性结果,最后一行的ce stroke表示count-encoding stroke
这部分主要探究的是笔画,其他实验设置不变,用small的测试集。
Effectiveness of the strokes condition. 如表2,添加笔画条件(strokes condition,大概指笔画信息的使用)会提高所有评估指标。根据图5的第4/5列,去掉笔画条件的Diff-Font在生产复杂结构字符时会出现笔画错误。
Effectiveness of the strokes count encoding form. 进一步探究笔画计数编码的作用,比较表2表3,添加one-bit编码反倒降低了模型性能。看图5第2/3列,使用one-bit编码会生成有相同基础笔画的其他字。特别是第4列,one-bit编码由于没限定笔画数,导致生成结果笔画数量错误。
总结
提出了基于扩散模型的新方法:Diff-Font,实现one-shot字体生成。其具备稳定训练过程且能在大数据集上训练,将字体生成作为条件式生成任务解决前两个问题。引入笔画级信息改进生成质量。用两个不同规模数据集的结果展示方法有效性。
Limitations. Diff-Font基于降噪扩散模型,推理速度慢,将来计划改进生成质量跟推理速度,也要把Diff-Font用去其他具有挑战性的字体生成数据集/任务上。
评价
之前就在想扩散模型应该也能用在字体生成,没想到这就有人做出来了。单说生成质量的话实际上不见得特别好,也是常见的合成结果形似源字体的问题,连笔没把握好,而且有的样本笔画不够直,不过字形结构都很完整。不过生成图1a那种艺术字体效果倒是蛮好的。
比较可惜的是论文中提到LF-Font、FsFont、CG-GAN,但没有做实验进行对比,甚至没提到号称one-shot的XMP-Font。而且没有放出代码,也没给出训练环境跟设置,确实很好奇所需的设备跟训练时长。论文最后提到推理慢,也没说具体多慢,实际上80x80的图片分辨率已经很小了,一般都是用128或者256的。
还有一点是文中数据集的构建描述得太简单,主要是好奇6625个字的笔画监督信息是怎样得到的,感觉工作量不小。
总体来看挺好的,第一个吃到了扩散模型这个螃蟹,模型性能不错,也验证了对笔画编码的猜想,挺有意义的。
待解明
- 挺多模型都是基于解耦内容风格的思想,这种应该不算用I2I模型吧,是不是故意想以此作为卖点呢。