[论文阅读] Joint Implicit Neural Representation for High-fidelity and Compact Vector Fonts

Pre

title: Joint Implicit Neural Representation for High-fidelity and Compact Vector Fonts
accepted: ICCV 2023
paper: https://openaccess.thecvf.com/content/ICCV2023/html/Chen_Joint_Implicit_Neural_Representation_for_High-fidelity_and_Compact_Vector_Fonts_ICCV_2023_paper.html
code: None
ref1: https://zhuanlan.zhihu.com/p/372338398
ref2: https://www.zhihu.com/question/493693595/answer/2181734554
ref3: https://zhuanlan.zhihu.com/p/512538748
ref4: https://zhuanlan.zhihu.com/p/536530019
ref5: https://zhuanlan.zhihu.com/p/93901692
ref6: https://www.zhihu.com/question/22608763
ref7: https://zhuanlan.zhihu.com/p/390848839

关键词:Vector Font Synthesis, English Letters, Implicit Neural Representation, Signed Distance Field
阅读理由:接触隐式神经表达这一概念,了解矢量字体生成方法,品鉴清华+Adobe组合

Idea

矢量字体生成,使用两个场分别建模字体的基础形状和拐角,然后通过一定方式结合二者信息将矢量图形绘制出来。

Motivation&Solution

  1. 现有的矢量字体生成方法要么难以保持高频的拐角细节,要么生成的矢量形状带有冗余线段 —— SDF+CF

Background

现有的矢量字体生成方法有两种:直接使用矢量格式、对生成的像素字体图片进行矢量化。前者将字形作为 Scalable Vector Graphic (SVG) 绘制指令序列,并通过真值矢量的监督或可微矢量形状渲染器来学习如何生成该序列。但绘制指令序列与渲染的形状是多对一的关系,会导致生成结果的模棱两可(ambiguity)以及冗余的线段。而后一种方法受益于近年来出现的基于坐标的隐式神经场?(neural implicit fields),倾向于生成高质量的整体形状,然而该网络输出关于输入坐标的天然平滑性会导致无法精确建模高频几何信息,例如拐角。

基于上述观察,本文提出一种隐式神经表示(Implicit Neural Representation)方法,可以建模几何细节并且用于合成高质量矢量字体。

综合ref1, ref2,隐式神经表示(Implicit Neural Representations)希望用神经网络来逼近一个连续函数,该函数描述了某一种具体的信号,比如图片、音频、三维形状等。以图片为例,传统的表示方法是像素,图片有具体的分辨率,即像素的个数,这是一种离散的表示方式;而INR相当于有一个函数,可以将坐标映射到具体的RGB值,由于函数连续,因此可以采样出任意分辨率的图片。

之前的图片生成是利用生成器直接给出所有像素,而INR要求生成函数的参数,再利用该函数去得到图片,函数与图片是一一一对应的关系。不过ref2也提到了INR的一些缺点:1.编码是全局的,缺少局部信息,会导致几何形状过于平滑 2.全连接架构无法利用平移不变性 3.能建模简单物体但无法处理复杂场景

NeRF似乎就是INR的发展应用。

ref3提及:场(field)是为所有(连续)空间和/或时间坐标定义的量(标量),如电磁场,重力场等。因此当我们在讨论场时,我们在讨论一个连续的概念,而且它是将一个高维的向量映射到一个标量。神经场表示用神经网络进行全部或者部分参数化的场。在视觉领域,可以认为神经场就是以空间坐标或者其他维度(时间、相机位姿等)作为输入,通过一个MLP网络模拟目标函数,生成一个目标标量(颜色、深度等)的过程。

ref4,5 简要介绍了Signed Distance Field,SDF的本质就是存储每个点到图形的最近距离,即将模型划出一个表面,在模型表面外侧的点数值大于0,在模型表面内侧的点数值小于0。

SDF表示一个圆

如上图,值为0的位置是圆的边界,内部的值小外部的值大,每个位置的值都是距离圆面的最小距离(也就是到圆心的距离减去半径),结合ref5的内容可推测如果有多个物体,那么一点处的值是到所有物体最小距离中的最小者。也就是说SDF在某点处的值,要选距离该点最近的物体,算点到该物体的最小值,再根据点在物体内外来赋予正负号。这玩意好像很适合来表示矢量图形,根据0来判断边界,进而可以做到无损地放大。

level set

ref6则介绍了level set的内容,也就是水平集,应该就是后文中提到的 zero-level set 吧。 level set 就是想要表示的低维目标的更高一维的函数,比如想表示曲线,就可以使用三维物体+一个z轴值,也就是物体的一个平面,其轮廓就是要表达的曲线,当z=0就对应了 zero-level set。很显然,这个z取什么值应该都不影响,都能转化为0的情况。这个方法可以轻松地控制曲线的变形,实现复杂的转换效果,也能够结合SDF使用。

Pixel Font Synthesis 许多工作用了GAN,但训练不稳定又有模式坍塌。除了GAN,基于SDF的表征利用隐式场(implicit
field)也取得了有竞争力的结果。

Vector Font Synthesis 提到一些生成矢量字体的工作,Im2Vec将像素字体转换为矢量字体,LIVE将更复杂的图片转换为SVG同时保持图片的细节和拓扑结构。SVG-VAE序列自编码器架构抽取SVG指令来重建字体。DeepSVG利用Transformer来获得SVG指令。DeepVecFont在SVG-VAE结构基础上引入多模态学习,并基于像素图片来精炼SVG以获得更准确的重建结果。Reddy提出了多曲线的(multi-curve)隐式表达来复现锋利的边角。DualVector利用无监督学习通过多个隐式双组件(implicit dual components)来获得字体形状,之后在学到的像素图片上精炼这些组件以得到准确的矢量轮廓。VecFontSDF利用抛物线基元?(parabolic shape primitives)结合更准确的SDF监督信号,达到了高度重建和合成质量。此外,DiffVG使得矢量曲线可微,在矢量图形和位图之间建立联系,允许用网络来优化它们,逐渐成为了许多矢量形状生成工作的理论基础。

Neural Implicit Representation 隐式神经表达在视角合成例如神经辐射场(Neutral Radiance Field, NeRF),和形状表达(shape representation)例如 Distance Field 和 Occupancy Field 上都取得了很好的效果。NeuS结合前两个,通过体积渲染(volume rendering)来估计物体的几何形状,能够修复物体的表面纹理。比起卷积,隐式表达有更好的位置表达和插值属性。通过编码坐标而不是像素值,能缓解纹理粘黏?(texture sticking)。对于一个 Signed Distance Field (SDF) 表达,能通过 marching cube, marching tetrahedra 或 dual contouring 来轻易地抽取它的轮廓或表面。

本文通过两个隐式场:SDF和CF,以及超网络来表示字体。SDF以ReLU未激活函数,CF使用正弦(sine)作为激活函数。

Method(Model)

Overview

图1 本文的矢量字体生成结果总览。本文方法重建的字体形状拐角更锐利(sharper),轮廓更紧凑,同时能做平滑插值

本文的想法是通过对拐角位置的显式建模来增强隐式神经表示,并且设计一个过程将该表示转换为向量源语(vector primitives),具体来讲,本文使用二维 signed distance field (SDF) 来建模整体字形,并建模随机拐角场?(probabilistic corner field, CF)指示每个位置是角点的概率

图2 网络架构和矢量化过程。对任一矢量形状,网络输入其字体和字形的隐编码,然后输出相应像素坐标处的SDF和CF值。之后通过SDF的0级集合(zero-level set)抽取形状轮廓,并用CF的峰值提取拐角的位置,最后将二者结果结合去生成矢量字体。

SDF网络以像素p的坐标、整数 \(I_{glyph} \in [0,N_{char}],\; I_{style} \in [0,N_{font}]\) 为输入,输出相应字体的SDF值,其中 \(N_{char} = 52\) 表示了52个字母A到z,\(N_{font}\)是训练数据中的字体风格组(font style groups)数量。

CF网络同样是这三个输入,输出CF值和辅助SDF值,记为SDFlow。这俩网络是以不同的训练目标各自独立训的。

依然需要每个字形解耦,分为字体风格和字符结构两种编码,分别对应可学习隐编码 \(\alpha_{SDF}, \alpha_{CF}\)\(\beta_{SDF}, \beta_{CF}\)

Signed Distance Field

为了增强模型能力,使用两个超网络 \(\Psi_S, \psi_S\) 来使用隐编码 \(\alpha_{SDF}, \beta_{SDF}\) 然后生成SDF网络 \(\Phi_S\) 的参数 \(\theta\),其实就是两个超网络输出的逐元素和:

\[\theta=\Psi_{S}(\alpha_{\mathrm{SDF}})+\psi_{S}(\beta_{\mathrm{SDF}}) \tag{1} \]

这个 \(\Phi_S\) 负责根据输入的坐标p返回相应的SD(signed distance)值,SDF重建使用L1损失:

\[\mathcal{L}_{\mathrm{SDF}}=\|\bar{s}-\Phi_{S}(p;\theta)\|_{1} \tag{2} \]

其中 \(\bar{s}\) 是坐标p处的SDF真值。这种基于超网络的方式比直接用固定参数的MLP来预测 signed distance 能学到更好的隐空间,并且实验证明也有更好的拟合结果。

由于法向量值?(normal value) \(\bar{n}\) 可以通过参数曲线(贝塞尔曲线或lines)获得,使用轮廓约束损失来监督 normal,也就是SDF值相对于输入坐标的导数:

\[{\mathcal{L}}_{\mathrm{Nomal}}=1-\langle\nabla_{p}\Phi_{S}(p;\theta),{\bar{n}}\rangle \tag{3} \]

其中\(\nabla\)是SDF的空间梯度,\(\langle\cdot,\cdot\rangle\)表示余弦相似度,正如其他使用隐式SDF的工作,本文也用程函损失(Eikonal Loss)来约束SDF的正确性:

\[\mathcal{L}_{\mathrm{Eikonal}}=|\|\nabla_{p}\Phi_{S}(p;\theta)\|_{2}-1| \tag{4} \]

\({\mathcal{L}}_{\mathrm{Nomal}}\)\(\bar{n}\)似乎表示某点SDF值的梯度(法向量),那么就是点到曲线距离的导数,通过坐标p和参数曲线确实很容易能得到,也能提供足够的信息来训练SDF。而\(\mathcal{L}_{\mathrm{Eikonal}}\)约束了导数趋近于1,粗浅了解了一下,好像是根据SDF推导的结论。

SDF网络的总训练目标:

\[{\cal L}_{\mathrm{SDF}}=\lambda_{\mathrm{SDF}}\mathcal{L}_{\mathrm{SDF}}+\lambda_{\mathrm{Normal}}\mathcal{L}_{\mathrm{Normal}}+\lambda_{\mathrm{Eikond}}\mathcal{L}_{\mathrm{Eikonal}} \tag{5} \]

Corner Field

SDF难以建模高频细节,例如拐角,为此需要 Corner Field (CF) ,不过它难以编码极端稀疏的信息,例如二元图片中只有少数几个黑像素,这要求拐角不能只有1个像素点。为此作者将拐角场设置为概率场,例如DARK[38]中用到的高斯分布,反映了查询点p附近拐点存在的概率。不同于DARK分离每个联合部位然后独立表示,本文使用一个拐角场对所有拐角建模,定义为:

\[\bar{c}(p)=\operatorname*{max}_{i}\exp\left(-\frac{\|p-c_{i}\|_{2}^{2}}{\xi^{2}}\right) \tag{6} \]

其中\(\xi\)控制该概率场的范围,\(c_i\)是该字形中第i个拐角的位置,必须引入全局表示,因为每个字形的拐角数量都是不确定的,拐角多的有超过20个,也有的没有拐角,这种情况下\(c(p) = 0\)

但如果已经知道\(c_i\)也就不需要这个场了,因此公式6是CF场的定义,是一个连续函数,但没法直接得到,因此需要隐式神经表示,通过网络来逼近它,就能得到各个坐标点属于拐角的概率\(\bar{c}(p)\)

类似SDF,CF也有两个超网络 \(\Psi_C\), \(\psi_C\),负责形成CF网络\(\Phi_C\)的参数:

\[\omega=\Psi_{C}(\alpha_{CF})+\psi_{C}(\beta_{CF}) \tag{7} \]

\(\Phi_C\)是正弦激活的MLP,接受坐标p为输入,输出p处的CF(corner field)值c(即\(\bar{c}(p)\))和一个辅助的SD值 \(s^{\prime}\)

\[c,s^{\prime}=\Phi_{C}(p;\omega) \tag{8} \]

由于CF使用概率表达,可以用二元交叉熵作为重建损失:

\[\mathcal{L}_{\mathrm{CF}}=\mathrm{BCE}(\Phi_{C}(p;\omega).c,\bar{c}) \tag{9} \]

其中\(\Phi_{C}().c\)表示取\(\Phi_{C}\)输出的c,然后跟真值\(\bar{c}\)算交叉熵,以此训练CF识别拐角。通过公式6能知道场的极值就是拐角,作者用峰值损失(peak loss)来增强峰值:

\[\mathcal{L}_{\mathrm{Peak}}=\bar{c}(p)^{2}\mathcal{L}_{\mathrm{CF}} \tag{10} \]

直观上完全可以合并\(\mathcal{L}_{\mathrm{CF}}\),通过拐点真值概率为损失设定权重,让模型更关注峰值处的预测。

总损失:

\[{\cal L}_{\mathrm{CF}}=\lambda_{\mathrm{CF}}\mathcal{L}_{\mathrm{CF}}+\lambda_{\mathrm{Peak}}\mathcal{L}_{\mathrm{Peak}}+\lambda_{\mathrm{SDFlow}}\mathcal{L}_{\mathrm{SDFlow}} \tag{11} \]

其中 \(\mathcal{L}_{\mathrm{SDFlow}}\) 是坐标p处SDF值的额外监督,对插值很关键,后面一节会介绍。

Alignment of SDF and CF

SDF具备插值属性,而CF则不行,因此需要辅助SDF监督来约束CF的参数:

\[\mathcal{L}_{\mathrm{SDFlow}}=\|\bar{s}-\Phi_{C}(p).s^{\prime}\|_{1} \tag{12} \]

对于\(\Phi_{C}\)最后一个线性层,有:

\[s^{\prime} = W_sh \\ c = \sigma(W_ch) \tag{13} \]

其中\(\sigma(\cdot)\)表示sigmoid函数,两个W是不同的权重,h是倒数第二层的隐层输出,作者希望通过这种方式将\(s^\prime,\; c\)联系起来,图4展示了这种对齐方式的合理性。插值时,对于不使用\(\mathcal{L}_{\mathrm{SDFlow}}\)的CF,其中间结果(插值结果)的峰值会消失(无法辨认拐角),但最终结果(另一种字体)里是存在的。

图4里中间那列应该是左右字体的插值结果,说明CF原本是不支持插值的,会丢失拐角,但如果加上\(\mathcal{L}_{\mathrm{SDFlow}}\),让CF与SDF产生联动,就能解决这个问题。

图4 是否使用SDFlow损失的插值情况,字体的相应拐角如果在CF中存在差异的会被圈出

Vectorization Process

图3 矢量化过程。首先找出 角点场(corner point field) 的峰值作为可能的拐角位置,再从SDF得到的轮廓点(0水平集)中找出距离每个峰值最近的点,并且用这些点来分割轮廓。每个集合(包括先前的两个角点和一系列轮廓点)通过曲线拟合来矢量化,矢量曲线的开始和结束控制点确保是拐点。最后把矢量曲线拼一起就得到矢量字体了。

Extract contour points. 矢量化第一步是把SDF的0水平集转换为字形轮廓上的有序点集,首先将场转换为二元像素图片I:

\[I(p)=\left\{ \begin{aligned} 0, \Phi_{S}(p/R)\ge 0 \\ 1, \Phi_{S}(p/R)\lt 0 \\ \end{aligned} \tag{14} \right.\]

其中\(p=(x,y)\in\{1,2,...,R\}^{2}\)是图片的像素坐标,R是将要渲染的分辨率,其实就是根据分辨率去采样一些点,然后根据SDF将内部的点赋值为1,外部为0。之后执行如下的边缘检测算法:

\[M=(1-I)\cdot(I\otimes \bold{1}) \tag{15} \]

其中\(\otimes\)是卷积,\(\bold{1}\)是全1的3x3卷积核,当且仅当\(M(x,y)=1\)\(p(x,y)\)才出现在轮廓上,然后就定位角点,最后使用增量曲线拟合,根据给定的轮廓点和角点来矢量化

图5 通过 dual contouring 从CF中定位角点

Locate corners with Dual Contouring. CF是概率场,峰值处未必就是角点,因此要在峰值周围去定位,类似 dual contouring [13],以峰值附近轮廓上两点切线交点作为角点,如图5所示。累了,具体公式略。图5里 \(\mathbf{p}^{\prime},\mathbf{p}^{\prime\prime}\) 是两边轮廓上的像素坐标, \(\mathbf{n}^{\prime},\mathbf{n}^{\prime\prime}\) 是前者相应的轮廓法向量,总之最终的角点就是 \(\mathbf{L}_1, \mathbf{L}_2\) 的交点。

Incremental Curve Fitting. 现在有了角点和轮廓,首先将它们分成图3所示的多个集合:\(\{{\bf c}_{s},{\bf c}_{e},\{{\bf p}_{i}\}\}\),每个p应该是轮廓的一个点,对每一组,找到以\(c_s\)为起始点,\(c_e\)为终点的曲线或线段,然后最小化\(\{{\bf p}_{i}\},i=0,\ldots,n\)的拟合误差。

具体的方法有点麻烦,以后有用到再说吧 >_<

Experiment

Settings

Im2Vec: 从像素图片中学习的矢量形状生成算法
DeepVecFont: SOTA矢量字体合成方法,直接学习绘制指令序列
Multi-Implicit: SOTA矢量字体合成方法,使用隐式神经场建模字体形状,并利用等值面(isosurface)抽取方法获得矢量输出。
Attr2Font: 图片域上的字体生成方法

Dataset

使用DeepVecFont的测试集数据来训练所有方法,包含1425个字体,每种都有52个A到z的字符

Reconstruction

表1 不同分辨率的重建结果(128/256/512)

图1还加上了去掉CF的结果,细节会缺失,拐角会过平滑

Interpolation

表2 不同分辨率的插值结果(128/256/512)

图7 插值中的拐角维持

从数据集采样1000个字体,分为500组,组内两两之间按0.5系数去插值,对每个插值结果从原始数据集里找出能算出最优指标的字体,其与插值结果计算的指标作为最终指标。正如表2所示,本文方法取得了总体最优性能(感觉优势不是特别大?),图7表示本文方法能在插值过程中维持锋利的拐角。

图6 拐角场迁移的多个对应

由于采用的是自解码器(auto-decoder)架构,每个字体的隐编码都是在冻结的网络参数上优化而来,然而为拐角场(CF)表达拟合隐编码会造成模糊不清,如图6所示:有两种方式可以将拐角场从(d)转换到(e),即从a到c或f到h,a和f处的CF共享不同的隐编码,但CF是一样的,因此像Im2Vec那样,作者通过插值来生成不同的字体形状。(没看懂,CF模糊不清跟插值有什么关系?还是说反而将其作为优势,可以生成各种不同风格的插值结果?)

虽然有这些限制,SDF网络仍能做少样本风格迁移和形状补全(shape completion)任务。通过冻结网络参数,使用从目标形状导出的SDF值来优化风格编码,结合预训练模型的字形编码一起作为超网络的输入,细节见附录。

表3 指令数量(CMDs)和控制点数量(CPs)。c是Im2Vec的颜色参数,实验仅使用黑色(c=1)

图8 不同方法紧凑程度(compactness)的比较,本文方法使用较少的曲线,因此没有冗余和曲线的交叉。

Compactness of Vector

不同方法生成矢量字体的方式不同,不过都用了一系列路径序列,包括SVG中由MLQC四种指令构成的路径,其中ML只有1个控制点,Q有两个,而C有三个,但这些指令的数量也不同,如表3所示。可以看出DeepVecFont和Im2Vec使用的指令和控制点较少,但作者说它们会生成错误的结构,如图8红框所示,但本文明明用的曲线更多,怎么又没有冗余了。用一个隐式表达矢量化0水平集的方法并没有这些问题,同时具备紧凑的表面。

Ablation study

表4 网络预测拐角的数量误差,分是否使用Peak损失两种情况,各自与真值比较。

Peak Constraint. 当两个拐角太靠近,CF的峰值会黏在一起,导致只有一个峰值存在。表4展示了网络输出和真值拐角数量的L1误差。level是一个阈值,像素的值必须大于level且大于其8个邻居像素,才会被判定为拐角。本文的重建和插值实验用的是0.5,可以看到不使用peak损失的话误差会增大。

SDF Constraint. SD(signed distance)流可以用于约束CF的插值结果,因为缺少CF插值的中间结果(无法直接监督),因此也无法使用L1或SSIM来测量是否使用SD流的插值质量。通常情况下,形状的变化会导致拐角的转换,如图6图4所示。使用倒角距离(chamfer distance)来测量原本拐点和插值结果的拐点之间的散度,期望这是一个相对大的值。

\[\mathrm{Div}(\uparrow)={\frac{1}{\|c_{I}\|}}\min( \sum_{i=0}^{c_{I}}\min_{j=0}^{c_0}(\|C_{I}[i]-C_{0}[j]\|), \sum_{i=0}^{c_{I}}\min_{j=0}^{c_1}(\|C_{I}[i]-C_{1}[j]\|)) \tag{18} \]

其中 \(c_{0},\,c_{1},\,c_{I}\)\(C_{0},\,C_{1},\,C_{I}\) 中的拐角数量, \(C_x[y]\) 表示\(C_x\)里的第y个拐角。结果显示不用 \(\mathcal{L}_{\mathrm{SDFlow}}\) 的话\(Div=971.7\),用上能到988.6。真是连表都懒得画了,似乎确实有效,但到底是多有效呢?

图9 不同方法的重建比较。青色框标记每种字体的开始字形

表5 是否使用超网络的不同网络配置下的结果

HyperNetworks. 后面不要超网络的那四个,直接将\(\alpha_S, \beta_S\)拼一起,加上p一起做SDF网络的输入。表5展示了512分辨率下的重建结果。HN指超网络,就是图2上面那两个橙色的,IN指的是SDF网络,HN下面那灰的。L/F指HN和IN的MLP中 layers/feature 维度的数量。结果显示超网络能极大增强字体表示的准确性,第6行跟第1行的训练时间接近,但是性能更弱,最后一行需要第一行1.5倍的时间,但效果更差。但参数也不是越多越好,第3行就比第1行好,因此超网络的架构设计上还有很大的改进空间。

Conclusion

dubbed as: 称...为
in conjunction with: 与...一起
disparity: 不平等,差异
there’s ample room for improvement: 有很大的改进空间

提出了一种新的字体表示,由 signed distance field (SDF) 和 probabilistic corner field (CF) 构成,然后提出一种矢量化过程将二者结合以生成高质量的矢量字体,同时具有紧凑的轮廓。作者希望自己的工作对于融合高频细节的领域,例如3D形状建模和生成能启发一些新的方向。

该工作最大的限制是无法从网络中随机采样一组相应的SDF和CF,这可以引入一个更强力的编码器,用它混合两个领域的模态,然后将其嵌入到相同的隐空间就能解决。

Critique

只考虑英文字母,而且输入需要确定的字符数量和字体数量,感觉很笨而且没有泛化能力?看下来感觉跟那些基于像素的字体生成很不一样,这里不能生成给定风格的字体,新字体似乎只能通过插值来获取。不过行文还行,特别是借此机会了解了一下这些“场”相关的概念,其实并没有那么的难。

posted @ 2024-01-19 11:22  NoNoe  阅读(94)  评论(2编辑  收藏  举报