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 ​)=N1​i,j∑​i′,j′min​D(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​)=1−v1T​v2​/v1T​v1​v2T​v2​ ​

简单来说,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层的消融实验

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

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

ARF 笔记 (NeRF的风格化)相关推荐

  1. Stylized NeRF 水记(NeRF的风格化)

    Stylized NeRF 水记(NeRF的风格化) <StylizedNeRF: Consistent 3D Scene Stylization as Stylized NeRF via 2D ...

  2. 论文笔记NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis

    NeRF使用神经网络来表示场景.给定一个场景,输入该场景一些视角的图片,NeRF可以合成该场景新视角的图片. 神经辐射场 神经辐射场(neural radiance field,NeRF)使用5D的向 ...

  3. TensorFlow基础笔记(7) 图像风格化效果与性能优化进展

    参考 http://hacker.duanshishi.com/?p=1693 http://blog.csdn.net/hungryof/article/details/53981959 http: ...

  4. TensorFlow基础笔记(6) 图像风格化实验

    参考 http://blog.csdn.net/wspba/article/details/53994649 https://www.ctolib.com/AdaIN-style.html Ackno ...

  5. 35、StylizedNeRF Consistent 3D Scene Stylization as Stylized NeRF via 2D-3D Mutual Learning

    简介 主页:http://geometrylearning.com/StylizedNeRF/ 给定一组真实的照片(a)和一个风格图像(b),模型能够生成风格化的新视图©,通过学习风格化的NeRF在3 ...

  6. 读论文12——NeRF:Representing Scenes as Neural Radiance Fields for View Synthesis

    目录 Abstract Introduction Related Work Neural Radiance Field Scene Representation Volume Rendering wi ...

  7. [论文解析] NeRF-Art: Text-Driven Neural Radiance Fields Stylization

    文章目录 Overview What problem is addressed in the paper? Is it a new problem? If so, why does it matter ...

  8. UE风格化场景练习笔记Day1

    今天要开启一个新项目,学习UE风格化场景的全流程制作,预计工作周期是一个月,开一个学习笔记记录一下我的进度和遇到的问题,方便之后回顾知识点和总结心得,同时也给初学者们提供一个全流程的学习教程. 在这个 ...

  9. [非卷积5D中文翻译及学习笔记] 神经辐射场 NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis

    不使用3D建模,使用静态图片进行训练,用(非卷积)深度网络表示场景的5D连续体表示,再通过ray marching进行渲染. 本中文翻译使用"机器学习+人工校准/注解"的方式完成. ...

最新文章

  1. android studio so文件的添加
  2. 提升代码内外部质量的22条经验
  3. 可以删除的android系统自带程序—详细列表【转】
  4. 问题集锦(36-40)
  5. 使用GAN 进行异常检测——anoGAN,TODO,待用于安全分析实验
  6. MCMC笔记:齐次马尔可夫链
  7. 云服务器安装虚拟机方法,云服务器安装虚拟机方法
  8. 【网络安全】如何搭建MySQL恶意服务器读取文件?
  9. 8.Struts2类型转换器
  10. C#如何判断质数(转)
  11. 在Visual C++中用ADO进行数据库编程(下)
  12. printf函数输出格式汇总
  13. SQLServer中一个多用户自动生成编号的过程
  14. 独生子女证每月增加3%的退休金,但丢了怎么办?
  15. 浪潮“151计划”:信息安全 没有“偏远地区”
  16. WPS新建文字分享微信.docx形式_DOC和DOCX文件的区别
  17. 在火狐浏览器里怎么看请求头
  18. Matlab使用mosek
  19. 暑假闲着没事第一弹:基于Django的长江大学教务处成绩查询系统
  20. 手机及电脑的护眼模式开启

热门文章

  1. Pygame基础知识(14)-pygame.image.load()对象和blit()绘制
  2. 博途组态阀岛_西门子PLC-S7-1200 PROFINET与 IO device 通信
  3. Spliterator
  4. linux下ssh、scp无密钥登陆方法
  5. Android Studio WiFi 之 获取 WiFi 名称、IP、Mac
  6. 案例十三、模仿微信打飞机游戏
  7. 前端常见面试题 —— BFC是什么?
  8. 云直播客户端4.0活动拍摄类直播与教学培训类直播测试
  9. Java实习生常规技术面试题每日十题Java基础(二)
  10. 微信小程序-异步请求变同步请求