《StylizedNeRF: Consistent 3D Scene Stylization as Stylized NeRF via 2D-3D Mutual Learning》
主页:http://intelligentgraphics.net/StylizedNeRF/
论文:http://intelligentgraphics.net/StylizedNeRF/paper.pdf
BV1Sr4y1x7Hm
方法整的花里胡哨的,风格化效果看起来却远没有ARF好,而且还步骤还麻烦得多。
关于 align :
我认为这篇在 align 上的原理和 ARF 差不多,也是靠 无视角输入 的训练去 微调 现有NeRF,相当于把风格化问题转化为类似点云上色的问题。这样必然是 align 的吧。
他在已经是 无视角输入 的情况下,仍然需要靠一个用 NeRF深度估计 做warp 来预训练的 2D风格化模块 来辅助 align ,但是看起来效果还是不好。
我认为这是因为这篇实际上就是想靠蒸馏来抽取三维一致性,但是蒸馏的方法太低效了,而且他还蒸馏了两次,先从原NeRF蒸馏到2D风格化模块(预训练),再从2D风格化模块蒸馏到 NeRF风格化模块(相互学习),所以效果很难做好。
(前略)
先预训练一个标准的NeRF,然后把 颜色预测模块 替换为一个 风格网络,我们就得到一个 Stylized NeRF 。
然后,通过引入一致性损失,将NeRF的 空间一致性 的 先验知识 蒸馏到 2D风格化网络中。
我们还引入了一个模仿损失来监督NeRF风格模块(与2D风格化模块)的相互学习,并且对 2D风格化 decoder 进行微调(2D风格化模块包括VGG特征提取器、一个AdaIN层和一个 decoder ,只有 decoder 是需要训练的。事实上, decoder 在相互学习之前还需要预训练)。
为了更进一步的使 模型 能够处理 2D风格化的歧义,我们引入了可学习的隐编码,这些编码服从于以风格为条件的概率分布。他们被附着在训练样本上作为条件输入,以更好地训练风格化模块。
实验结果表明,该方法在视觉质量和长期一致性方面都优于现有的方法。
{ S j } \{S_j\} {Sj} 为风格图片,经过VGG,提取出特征 { F j S } \{F_j^S\} {FjS} ,然后用 Enc 编码。
Enc 是一个预训练的 VAE 编码器(别忘了,VAE 是靠 自监督重建 任务训练的,只需要大量图片(的VGG特征)就能训练)
下半部分就是正常的2D风格化流程,先用NeRF渲染出正常图片 { J i } \{\mathcal{J}_{i}\} {Ji} ,用VGG抽特征 { F j C } \{F_j^C\} {FjC} ,再和风格特征一起输入到一个 AdaIN层 和一个 解码器,得到风格化后的图片 C a \mathcal{C}_{a} Ca 。(解码器需要预训练,并且在风格化训练过程中继续微调)
上半部分是把NeRF的颜色模块换成了自己的风格模块,就成了Stylized NeRF。风格化模块输入输入坐标和一个可学习的编码,输出颜色,原 NeRF 输入坐标 输出体密度,两者结合,经过体渲染,得到风格化后的图片 C n \mathcal{C}_{n} Cn 。(注意,这里没有输入视角,所以该方法也是一个类似点云上色的方法)
分为两部分,风格化NeRF 和 2D风格化网络,两部分相互学习。
虽然 风格化NeRF 天生具有空间一致性,但是由于 2D风格化网络 通常不能保证空间一致性,所以相互学习往往会导致 风格化NeRF 变得模糊。因此,我们提出将不一致的二维风格化结果视为服从风格条件分布的不同样本,并引入服从这种条件分布的 隐编码 来处理不一致的问题。
2D风格化网络由三部分组成:VGG编码器、一个AdaIN层、一个CNN解码器。
注意 AdaIN 只是一种具有代表性的方法,可以被其他更先进的方法取代。
先用VGG编码器从内容图和风格图中抽取特征图,再用 AdaIN 把内容特征图的均值方差修改成风格特征图的均值方差,最后再用CNN解码器解码出风格化后的图像。
整个过程中,只有CNN解码器是可学习的。
我们还对CNN解码器进行预训练。我们使用一致性损失 L c o L_{co} Lco 、风格损失 L s L_s Ls 、内容损失 L c L_c Lc ,从NeRF中蒸馏出3D一致性知识对解码器进行预训练。
一致性损失 L c o L_{co} Lco 计算如下:
L c o = ∥ O i , s − M i , j W i , j ( O j , s ) ∥ 2 L_{c o}=\left\|O_{i, s}-M_{i, j} W_{i, j}\left(O_{j, s}\right)\right\|^{2} Lco=∥Oi,s−Mi,jWi,j(Oj,s)∥2
其中 O i , s O_{i, s} Oi,s 表示在视角 i i i 和风格 s s s 下,风格化的输出。
W i , j W_{i,j} Wi,j 表示从视角 j j j 到 视角 i i i 的 warp 操作(用NeRF做深度估计得到)。
M i , j M_{i,j} Mi,j 表示 warp 和遮挡的 mask 。
简而言之就是,把不同视角下的风格化结果,利用NeRF的深度估计,warp 到同一个视角,然后计算他们的 L2 损失,计算损失时只计算能够 align 的像素。、
(你他妈,我怀疑这个式子有问题, mask 应该还要乘在 O i , s O_{i, s} Oi,s 上吧?而且为啥没有说 风格损失 和 内容损失?)
我们固定已经训练好的 NeRF,把颜色预测模块替换为我们自己的MLP(也就是风格化模块),就得到 Stylized NeRF。
风格化模块输入输入坐标和一个可学习的编码,输出颜色。
首先,我们训练一个 VAE 去编码风格图的 VGG特征,这样,我们可以得到每种风格的编码的均值方差。
每个视角使用不同的可学习编码。使用 L d L_d Ld 将可学习编码约束到 VAE 得到的均值方差。
也就是说,我们认为同一风格不同视角的可学习编码都是从同一风格的VAE编码采样得到的,我们训练可学习编码的过程其实是在反解具体的采样结果。
L d L_d Ld 就是高斯分布的负对数似然损失:
L d ( l i , j ) = ( l i , j − μ j ) 2 2 π σ j 2 L_{d}\left(l_{i, j}\right)=\frac{\left(l_{i, j}-\mu_{j}\right)^{2}}{2 \pi \sigma_{j}^{2}} Ld(li,j)=2πσj2(li,j−μj)2
其中 l i , j l_{i,j} li,j 表示在视角 i i i 和风格 j j j 下的可学习编码。
在推理阶段,使用被编码的分布的均值 μ \mu μ 作为输入(这个均值指的是该风格下VAE编码的均值还是该风格下训练过的可学习编码的均值?)
讲道理,看图片,这个可学习编码就稍微减少了一丢丢模糊吧……
相互学习的第一步是把NeRF的空间一致性知识蒸馏到 2D风格化网络(也就是前面说的预训练CNN解码器的步骤),然后就是相互学习
模仿损失 L mimic L_{\text {mimic }} Lmimic 计算如下:
L mimic = ∑ i , j , r ∥ C n ( r i , l i , j ) − C a ( I i , S j ) r i ∥ 2 L_{\text {mimic }}=\sum_{i, j, r}\left\|\mathcal{C}_{n}\left(r_{i}, l_{i, j}\right)-\mathcal{C}_{a}\left(\mathcal{I}_{i}, \mathcal{S}_{j}\right)_{r_{i}}\right\|^{2} Lmimic =i,j,r∑∥ ∥Cn(ri,li,j)−Ca(Ii,Sj)ri∥ ∥2
其中 C n ( r i , l i , j ) \mathcal{C}_{n}\left(r_{i}, l_{i, j}\right) Cn(ri,li,j) 由 风格化NeRF 得到,表示用风格 j j j 在视角 i i i 像素 r r r 处的风格化后的颜色。 C a ( I i , S j ) r i \mathcal{C}_{a}\left(\mathcal{I}_{i}, \mathcal{S}_{j}\right)_{r_{i}} Ca(Ii,Sj)ri 由 2D风格化模块 得到,其中 I i \mathcal{I}_{i} Ii 表示 原NeRF 在视角 i i i 下渲染的原图, S j \mathcal{S}_{j} Sj 表示风格 j j j , r i r_i ri 表示视角 i i i 下渲染出的像素 r r r 。
简单来说,就是从 风格化NeRF 和 2D风格化模块 分别渲染出图像,然后逐像素算 L2 损失。