Pre
title: Neural Transformation Fields for Arbitrary-Styled Font Generation
accepted: CVPR 2023
paper: https://openaccess.thecvf.com/content/CVPR2023/html/Fu_Neural_Transformation_Fields_for_Arbitrary-Styled_Font_Generation_CVPR_2023_paper.html
code: https://github.com/fubinfb/ntf
关键词: NeRF, neural transformation field, 晦涩
阅读理由:CVPR 2023, 中国科学院深圳先进技术研究院
Idea
把NeRF用来做字体生成,具体没看懂,同样要风格内容图片分别过网络,然后采样多个点,代入复杂的公式就成了?
Motivation&Solution
图1 本文动机 (a) 字体风格间的差异主要来自形状变化和源字体的转变?,例如笔画粗细以及字形书写模式(writing pattern of glyphs) (b) 将字体生成视为源字体到目标字体的连续转变过程,涉及源图片字体像素的生成和消散
- 大多数方法通过寻找更强的风格表示方法来提高生成能力,而缺乏建模转换风格时的空间变换(spatial transformation) —— 将字体生成建模为连续转换过程(continuous transformation process)
Background
认为基于风格表示能将方法分类两类:
- 早期的,风格是全局且静态的
- 近来的,风格更细粒度,如组件级
图2 (a). NeRF的方法。 (b). 将字体生成期望的转换嵌入到 neural transformation field,风格估计器 E_\theta 预测每个字体风格的位置 \theta,字体生成就能看成字体像素从原始点到该位置的转变过程 (c). 因为每个 NeRF 只对应一个特定场景(每个字得单独构建一个?),不适合FFG任务。通过引入结构嵌入将NTF用于建模所有字符的转变。 (d). 最终考虑字体风格的局部特征,进一步把NTF用于局部风格表示(localized style representation)
受 Neural Radiance Field (NeRF) 在3D视角合成上进展的启发,将空间转换嵌入到 neural transformation field。如图2,NeRF构建神经辐射场,将特定的3D场景表示为5D函数,输入是三维空间点的坐标和视角方向/观察角度,而输出是RGB颜色以及volume density(不透明度?)。该函数用MLP近似,场景信息通过优化过程嵌入到参数里。为了生成新的视角,每个像素的颜色根据穿过场景的彩色光线通过 volume rendering 技术绘制(?)。
由上面的方法启发,并不直接预测像素级别的形变偏移,而是引入像素的 creation intensity \(\varphi\) 和 dissipation rate \(\tau\),将这种形变嵌入到NTF里。
如图2c,NTF的每个位置都代表一个特定的结构相关的转变,每个与期望的转变有关的字体风格都有一个特定的位置,用以在NTF里生成字体图片,使用estimator估计位置。图2d引入了局部风格表示。
关于NeRF:https://zhuanlan.zhihu.com/p/390848839
不懂NeRF,看着好像是说图2a用一个物体很多视角的图片去训练模型,然后就可以产生各种不同的新视角图片,而图2b根据这一灵感,用同一个字不同风格的图片去训练模型,辅以一个估计位置的estimator,这样每种风格有个固定的位置,根据位置就能取出想要的风格的字体?
Method(Model)
Overview
?
Representing Font Generation as the Transformation Process of Font Pixels in NTF
继续上面图2c的推论,源字体定义为原始点,从原始点到目标点 \theta 代表一系列期望的转变,最终的字体图片可以表达为这种转变(像素的产生和消散)的累加,而该过程在本文定义为字体渲染过程。
图2c中NTF的输入是3D位置 \theta 和源汉字的结构嵌入 \(F_c\) ,输出则是该位置的 creation intensity \(\varphi\) 和 dissipation rate \(\tau\)。风格estimator \(E_\theta\) 是CNN,整个NTF函数也用CNN \(F_\Theta\) 近似:
\[(\varphi,\tau)=F_\Theta(\theta|F_{c}) \tag{1} \]Font Rendering with Neural Transformation Field
不同字体风格的转变可以划分为两类:字体像素生成和消散过程。\(\varphi\) 代表非字体像素变为字体像素,或字体像素增强了密度;反之 \(\tau\) 表示字体像素在位置 \(\omega\) 的密度减弱。位置 \(\omega\) 的密度可表示为:
\[{\frac{d I(\omega)}{d\omega}}=\varphi(\omega)\tau(\omega)-\tau(\omega)I(\omega). \]第一项表示生成过程,而第二项代表像素的消散过程(?)该微分方程有解:
\[I(\theta)=\int_{0}^{\theta}\varphi(\omega)\tau(\omega)T(\omega)d\omega. \]这就是NTF的字体渲染公式,\(T(\omega)\) 表示沿路径(\(\omega \rightarrow \theta\))的累计转变,表示为:
\[T(\omega)=\exp\left(-\int_{\omega}^{\theta}\tau(x)d x\right). \]基于公式3,生成风格化图片需要估计积分,从源点到未知 \(\theta\) 的间隔进行N等分,每个段i在位置 \(\theta_i = \frac{i}{N} \theta\) 取一个样本,这样公式3的积分就可以近似为:
\[I=\sum_{i=1}^{N}T_{i}\left(1-\exp\left(-\tau_{i}\xi\right)\right)\varphi_{i}, \]而 \(T_i\) 为:
\[T_{i}=\exp\left(-\sum_{j=i+1}^{N}\tau_{i}\xi\right), \]其中 \(\xi\) 是每个段i的长度,\(\xi = \frac{\theta}{N}\)。
Overall Framework
图3 所提模型的整体框架,包含...遵循之前的方法,使用一个多头投影判别器,但没画出来。
根据源图片I_c得到结构嵌入\(F_c\),根据风格参考估计3D位置\(\theta\),生成0到\(\theta\)路径的N个采样点 \(\theta_1,\ldots, \theta_N\),将每个采样路径与 \(F_c\) 结合(图3右边两种结合方法)作为NTF的输入。根据公式1可知当前结果不依赖于上一步的输出,因此可以并行计算不同位置。
最终得到所有采样位置\(\theta_i\)的\(\varphi,\; \omega\),利用公式5生成字体图片。两种不同的结果好像就是一个把风格特征压成向量,另一个还留有空间结构,以及跟F_c的结合方式不同?
NTF for Universal Style Representation: 利用AdaIN在NTF的中间层融合两个特征
NTF for Localized Style Representation: 此时预测的\(\theta\)跟\(F_c\)尺寸一样,直接拼接,无需AdaIN
Optimization Process
Reconstruction loss: 使用L1损失,约束生成图片跟gt以及重建源图片:
\[L_{r e c}=E\left[||y-\tilde{y}||_{1}+||I_{c}-\tilde{y}_{0}||_{1}\right]. \]Adversarial loss: 对抗损失,\(\hat{y}\)试生产的图片,c,s是相应的内容和风格标签
\[\begin{align*} {\cal L}_{a d v}^D = &-E_{(y,s,c)\sim p_{data}} max\left(0, -1+D_{s,c}(y)\right) \\ &-E_{(\hat{y},s,c)\sim p_{data}} max\left(0, -1+D_{s,c}(\hat{y})\right) \\ L_{a d v}^G = &-E_{(\hat{y},s,c)\sim p_{gen}} D_{s,c}(\hat{y}) \end{align*} \]Overall objective loss: 实验中\(\lambda_{a d v}=1.0,\; \lambda_{r e c}=0.1\)
\[\min_{G}\max_{D}\lambda_{a d v}(L_{a d v}^{D}+L_{a d v}^{G})+\lambda_{r e c}L_{r e c}, \]Experiment
Training Detail
图片尺寸H=W=128,推理阶段需要8张风格参考图片
Dataset
403个字体,其中353个做训练,剩余50个测试;随机采样800个用以优化模型,另214个汉字取作测试集(Unseen Fonts Unseen Contents (UFUC) testing set,),800字里再抽200个做 Unseen Fonts Seen Contents (UFSC)
Ablation Study
Ablation Study on Style Representations
表1 两种风格表征的消融研究(不是单纯的对比实验?),标粗的是最好的。
公式5里的N取15,NTF-Loc更好,后面的实验也用它来
The Number of Sampling Points for Font Rendering
表2 采样点数量的消融研究
图4 对应表2的可视化结果,框出的是异常像素或结构
base是传统的字体生成过程(诶不是NTF在N=1的情况吗),采样点要多,但也不能太多,否则会受到字体渲染过程中噪声积累的影响(公式3的积分)
图5 沿积分路径从原点到估计的位置的中间渲染过程可视化
如图5所示,生成的字体图片逐渐从原风格转变为目标风格,源图片中不相关的像素会消散,目标图片需要的像素会产生,观察生成过程,首先产生字体骨架,然后增加细节,汉字结构逐渐变得平滑与完整
Comparison with the Stateoftheart Methods
用于比较的一些模型都用作者自己的数据集从头训练,并且在推理阶段用的参考图片也是一样的
表3 FFG上的性能比较
可以看到表3是本文模型效果最好,可惜的是没有跟CG-GAN进行对比,比较有意思的是这里 FsFont > DG-Font,现在看来也就只有隔壁那个CF-Font的结论是反过来的,很难不怀疑它有精心的cherry-picking。
图6 NTF-Loc 与其他SOTA在自己数据集上的可视化比较
图6的实验用的UFUC,也就是完全没见过的数据,看起来NTF-Loc效果很好,亮眼的是能把连笔也学到。其他结果见附录。
Conclusion
构建了NTF,其中每个位置表示一个特定结构相关的转换,从源点(内容图提取的)到该位置(风格图提取的)对应源字体到目标字体的转换过程。然后用了风格估计器(style estimator)来估计参考图片字体风格的位置,结构编码器则用于抽取源图片的结构信息。有了估计的位置,就可以采样一系列点去计算中间转变,把中间结果累积起来就能产生最终字体图片。
Critique
写作不行,内容编排有问题,概念先出现再引入介绍,看着难受,而且一句话到处反复一遍遍无休无止地讲,搁这水字数呢。虽然不是很清楚NeRF,但感觉本文在把一件简单的事情复杂化。兜圈子到最后总结都还是没看明白,也可能是对NeRF的前置知识要求较高。
总体感觉是方法新奇了一些,没有其他创新点,结果还行,但至少分辨率比今年其他俩CVPR都大!。
Unknown
- I表示生成的目标字吗?
- 怎么生成目标字的还是没懂
- 为啥中间要采样一系列点?
- 找不到附录啊?