ARF 笔记 (NeRF的风格化)

ARF 笔记 (NeRF的风格化)

《ARF: Artistic Radiance Fields》

主页:https://www.cs.cornell.edu/projects/arf/

论文:https://arxiv.org/abs/2206.06360

项目:https://github.com/Kai-46/ARF-svox2

在这里插入图片描述
看这篇的目的是,看看他如何在 多视角下 保证, 让 风格化特征 保持 align

这个 ARF 就是一个微调的技术,通过训练,把一个现成的辐射场转化为风格化的辐射场(也就是所谓的ARF)

提出了一个基于匹配的VGG风格化损失,称为NNFM。个人感觉思路有点接近图像类比。(而且看起来很像单边的倒角损失,说不定可以称之为单边的VGG感知倒角损失。哇这好怪的名字hhhhh)

训练分成两个阶段:

第一个阶段是先求解一个线性颜色变换,然后用颜色迁移后的图像预训练ARF

第二个阶段是用NNFM损失来训练ARF,同时用正则化将其约束到颜色变换后的原图。

核心的技术要点就是 颜色迁移+NNFM损失

有一个额外的亮点是,提出了延迟反向传播,可以在使用VGG相关损失训练NeRF时节省很多内存。

而且我认为这种延迟反向传播技术明显是可以适配多种模型的,除了NeRF,应该还可以应用于很多别的地方。

总结一下多视角align的方法

他在训练时直接抛弃了原本辐射场网络的视角方向的输入项,而且优化时固定体密度,只优化外观(具体见“实现细节”这一节),所以训练出来必然是 align 的。

这个无视角训练的过程,相当于是把辐射场转化为点云(体素),颜色已经与视角无关了,然后再根据风格重新着色,得到的风格化的点云显然还是与视角无关的。

所以,颜色迁移预训练 很重要,它可以让网络有机会适应不输入视角方向的渲染,将辐射场变成与视角无关的辐射场。这个过程中,对每个体素,网络会选择一个视角无关颜色作为其颜色,于是我们使用颜色迁移后的图像来引导网络选择我们想要的颜色,这样就可以产生更贴合的颜色。

当然,即使没有颜色迁移预训练,NNFM的正则化项也会向ARF提示原网络的输出,从而使得体素颜色接近多视角下的平均值,所以在消融实验中即使是没有颜色迁移预训练也能生成多视角一致的图像。

概述

给定一个已经重建好的真实场景的 NeRF ,我们使用给定的2D图像的风格,将其3D场景风格化。

实现风格化,靠的是微调 现有NeRF。

微调使用的 loss 是我们提出的 最近邻特征匹配风格损失。

我们还引入了一种 延迟反向传播 技术,可以节省显存。

我们应用了一种 视角一致 的 颜色转换技术 来进一步提高最终的视觉质量。

方法

风格转换损失(NNFM)

之前使用的 VGG风格损失 ,测量的风格信息通常基于全局统计数据,不一定能 视角一致 地捕捉 局部细节。

我们提出了 最近邻特征匹配损失(NNFM,Nearest Neighbor Feature Matching),将复杂的高频细节从二维风格的图像转移到三维场景,并且在多视角下保持一致。

定义 I style I_\text{style} Istyle 为提供风格的图像, I render I_\text{render} Irender 为 用NeRF在给定视角渲染出的图像。

使用 VGG 分别从中抽取 特征图 得到 F style F_\text{style} Fstyle F render F_\text{render} Frender

定义 F render ( i , j ) F_\text{render}(i,j) Frender(i,j) 表示 F render F_\text{render} Frender 中位于像素坐标 ( i , j ) (i,j) (i,j) 处的特征向量。

NNFM损失计算如下:

ℓ n n f m ( F render  , F style  ) = 1 N ∑ i , j min ⁡ i ′ , j ′ D ( F render  ( i , j ) , F style  ( i ′ , j ′ ) ) \ell_{\mathrm{nnfm}}\left(\boldsymbol{F}_{\text {render }}, \boldsymbol{F}_{\text {style }}\right)=\frac{1}{N} \sum_{i, j} \min _{i^{\prime}, j^{\prime}} D\left(\boldsymbol{F}_{\text {render }}(i, j), \boldsymbol{F}_{\text {style }}\left(i^{\prime}, j^{\prime}\right)\right) nnfm(Frender ,Fstyle )=N1i,ji,jminD(Frender (i,j),Fstyle (i,j))

其中 N N N 表示 F render F_\text{render} Frender 中的像素数量, D ( v 1 , v 2 ) D(\boldsymbol{v}_1, \boldsymbol{v}_2) D(v1,v2) 表示 向量 v 1 \boldsymbol{v}_1 v1 v 2 \boldsymbol{v}_2 v2 之间的余弦距离:

D ( v 1 , v 2 ) = 1 − v 1 T v 2 / v 1 T v 1 v 2 T v 2 D\left(\boldsymbol{v}_{1}, \boldsymbol{v}_{2}\right)=1-\boldsymbol{v}_{1}^{T} \boldsymbol{v}_{2} / \sqrt{\boldsymbol{v}_{1}^{T} \boldsymbol{v}_{1} \boldsymbol{v}_{2}^{T} \boldsymbol{v}_{2}} D(v1,v2)=1v1Tv2/v1Tv1v2Tv2

简单来说,NNFM损失 就是对特征图 F render F_\text{render} Frender 中的每个像素,找到特征图 F style F_\text{style} Fstyle 中最接近的像素,然后令其之间的距离变得更小。

等等,这个NNFM其实就是倒角损失吧,只不过把距离度量从L2改成了余弦距离,而且只有单向的。

控制风格化的强度

加入一个 L2 正则项,约束到原图

ℓ = ℓ nnfm  ( F render  , F style  ) + λ ⋅ ℓ 2 ( F render  , F content  ) \ell=\ell_{\text {nnfm }}\left(\boldsymbol{F}_{\text {render }}, \boldsymbol{F}_{\text {style }}\right)+\lambda \cdot \ell_{2}\left(\boldsymbol{F}_{\text {render }}, \boldsymbol{F}_{\text {content }}\right) =nnfm (Frender ,Fstyle )+λ2(Frender ,Fcontent )

这个 F content F_\text{content} Fcontent 原文里没讲太清楚,应该是从原NeRF得到图像,经过颜色迁移,再用VGG提取出特征图。

有意思,用余弦距离优化,但是又用 L2 距离来正则化,不知道是怎么想的,去看看他有没有做这方面的消融实验。

延迟反向传播

因为使用了VGG特征提取器,这导致每次计算loss的时候无法像原本的NeRF那样高效,L1/L2损失可以单独计算每个像素的 loss,而基于 CNN 的 loss 一次就要算整张图片,这极大增加了内存消耗。

我们先做一次全分辨率的前向传播(此时的NeRF不记录梯度,只需要渲染图像),得到 I render I_\text{render} Irender ,然后用 I render I_\text{render} Irender 计算 loss ,然后把梯度反传到 I render I_\text{render} Irender ,这样就得到了逐像素的梯度。然后我们就可以用传统的流程逐像素的优化 NeRF 了(当然,每个像素上都需要重新计算NeRF的前向传播)。

在这里插入图片描述

视角一致的颜色迁移(预训练)

我们的 style 和 content 损失可以迁移风格并且保留内容,但是我们发现这会导致 I style I_\text{style} Istyle I render I_\text{render} Irender 颜色不一致。

为了解决这个问题,我们用颜色迁移先预训练 ARF,然后再使用 NNFM 损失来训练 ARF。

在这里插入图片描述消融实验,
第一列是颜色迁移+NNFM全套操作,
第二列是不使用颜色迁移,
第三列是将NNFM损失替换为Gram损失,
第四列是将NNFM损失替换为CNNMRF损失。

我们首先使用颜色迁移和 I style I_\text{style} Istyle ,将 I render I_\text{render} Irender 重新上色,这些重新上色的图像将用来预训练 ARF,作为在使用NNFM损失训练ARF之前的初始化。

重新上色的图像也会作为 I content I_\text{content} Icontent ,用于计算 content 正则化损失。

此外,在3D风格化后,我们再次对渲染到视点的图像进行颜色迁移,并将同样的颜色迁移直接应用于辐射场渲染产生的颜色值。

颜色迁移的具体方法

使用RGB空间中的简单的线性变换来实现颜色迁移。

我们用 { c i } i = 1 m \left\{\boldsymbol{c}_{i}\right\}_{i=1}^{m} {ci}i=1m 表示要重新上色的图片中颜色的集合,用 { s i } i = 1 n \left\{\boldsymbol{s}_{i}\right\}_{i=1}^{n} {si}i=1n 表示 I style I_\text{style} Istyle 中颜色的集合。

我们解析地求解一个线性变换 A \boldsymbol{A} A ,使得 E [ A c ] = E [ s ] \mathrm{E}[\boldsymbol{A} \boldsymbol{c}]=\mathrm{E}[\boldsymbol{s}] E[Ac]=E[s] Cov ⁡ [ A c ] = Cov ⁡ [ s ] \operatorname{Cov}[\boldsymbol{A} \boldsymbol{c}]=\operatorname{Cov}[\boldsymbol{s}] Cov[Ac]=Cov[s] ,也就是说,颜色迁移后的图像中颜色的均值和方差应与 I style I_\text{style} Istyle 一致。

实现细节

测试了 Plenoxels [46],NeRF [32] 和 TensoRF [46]

在这里插入图片描述

看起来每种的效果都还行。

在风格化过程中,将原辐射场的体密度组件固定,只优化外观组件。

  • 我们抛弃了所有 视角相关 的 对外观的建模⭐⭐⭐

    对 Plenoxels ,我们只保留球面谐波分量的第一个分量,移除其他所有分量。

    对 TensoRF ,令输入MLP的 视角方向 归零。

我们通过实验挑选VGG最合适的层,也就是第三层,详见原文。

挑选VGG层的消融实验挑选VGG层的消融实验

在风格化过程每次迭代时,随机从重建时使用的视点中挑选,作为计算损失时使用的渲染视点。

训练了10个epoch,学习率从 1e-1 指数衰减到 1e-2 。

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值