Stylized NeRF 水记(NeRF的风格化)
Stylized NeRF 水记(NeRF的风格化)
《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风格化的歧义,我们引入了可学习的隐编码,这些编码服从于以风格为条件的概率分布。他们被附着在训练样本上作为条件输入,以更好地训练风格化模块。
实验结果表明,该方法在视觉质量和长期一致性方面都优于现有的方法。
方法
框架概览
{Sj}\{S_j\}{Sj} 为风格图片,经过VGG,提取出特征 {FjS}\{F_j^S\}{FjS} ,然后用 Enc 编码。
Enc 是一个预训练的 VAE 编码器(别忘了,VAE 是靠 自监督重建 任务训练的,只需要大量图片(的VGG特征)就能训练)
下半部分就是正常的2D风格化流程,先用NeRF渲染出正常图片 {Ji}\{\mathcal{J}_{i}\}{Ji} ,用VGG抽特征 {FjC}\{F_j^C\}{FjC} ,再和风格特征一起输入到一个 AdaIN层 和一个 解码器,得到风格化后的图片 Ca\mathcal{C}_{a}Ca 。(解码器需要预训练,并且在风格化训练过程中继续微调)
上半部分是把NeRF的颜色模块换成了自己的风格模块,就成了Stylized NeRF。风格化模块输入输入坐标和一个可学习的编码,输出颜色,原 NeRF 输入坐标 输出体密度,两者结合,经过体渲染,得到风格化后的图片 Cn\mathcal{C}_{n}Cn 。(注意,这里没有输入视角,所以该方法也是一个类似点云上色的方法)
概述
分为两部分,风格化NeRF 和 2D风格化网络,两部分相互学习。
虽然 风格化NeRF 天生具有空间一致性,但是由于 2D风格化网络 通常不能保证空间一致性,所以相互学习往往会导致 风格化NeRF 变得模糊。因此,我们提出将不一致的二维风格化结果视为服从风格条件分布的不同样本,并引入服从这种条件分布的 隐编码 来处理不一致的问题。
2D风格化网络
2D风格化网络由三部分组成:VGG编码器、一个AdaIN层、一个CNN解码器。
注意 AdaIN 只是一种具有代表性的方法,可以被其他更先进的方法取代。
先用VGG编码器从内容图和风格图中抽取特征图,再用 AdaIN 把内容特征图的均值方差修改成风格特征图的均值方差,最后再用CNN解码器解码出风格化后的图像。
整个过程中,只有CNN解码器是可学习的。
预训练
我们还对CNN解码器进行预训练。我们使用一致性损失 LcoL_{co}Lco 、风格损失 LsL_sLs 、内容损失 LcL_cLc ,从NeRF中蒸馏出3D一致性知识对解码器进行预训练。
一致性损失 LcoL_{co}Lco 计算如下:
Lco=∥Oi,s−Mi,jWi,j(Oj,s)∥2L_{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
其中 Oi,sO_{i, s}Oi,s 表示在视角 iii 和风格 sss 下,风格化的输出。
Wi,jW_{i,j}Wi,j 表示从视角 jjj 到 视角 iii 的 warp 操作(用NeRF做深度估计得到)。
Mi,jM_{i,j}Mi,j 表示 warp 和遮挡的 mask 。
简而言之就是,把不同视角下的风格化结果,利用NeRF的深度估计,warp 到同一个视角,然后计算他们的 L2 损失,计算损失时只计算能够 align 的像素。、
(你他妈,我怀疑这个式子有问题, mask 应该还要乘在 Oi,sO_{i, s}Oi,s 上吧?而且为啥没有说 风格损失 和 内容损失?)
风格化NeRF
我们固定已经训练好的 NeRF,把颜色预测模块替换为我们自己的MLP(也就是风格化模块),就得到 Stylized NeRF。
风格化模块输入输入坐标和一个可学习的编码,输出颜色。
可学习的编码
首先,我们训练一个 VAE 去编码风格图的 VGG特征,这样,我们可以得到每种风格的编码的均值方差。
每个视角使用不同的可学习编码。使用 LdL_dLd 将可学习编码约束到 VAE 得到的均值方差。
也就是说,我们认为同一风格不同视角的可学习编码都是从同一风格的VAE编码采样得到的,我们训练可学习编码的过程其实是在反解具体的采样结果。
LdL_dLd 就是高斯分布的负对数似然损失:
Ld(li,j)=(li,j−μj)22πσj2L_{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
其中 li,jl_{i,j}li,j 表示在视角 iii 和风格 jjj 下的可学习编码。
在推理阶段,使用被编码的分布的均值 μ\muμ 作为输入(这个均值指的是该风格下VAE编码的均值还是该风格下训练过的可学习编码的均值?)
可学习编码的消融实验
讲道理,看图片,这个可学习编码就稍微减少了一丢丢模糊吧……
相互学习
相互学习的第一步是把NeRF的空间一致性知识蒸馏到 2D风格化网络(也就是前面说的预训练CNN解码器的步骤),然后就是相互学习
模仿损失 Lmimic L_{\text {mimic }}Lmimic 计算如下:
Lmimic =∑i,j,r∥Cn(ri,li,j)−Ca(Ii,Sj)ri∥2L_{\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
其中 Cn(ri,li,j)\mathcal{C}_{n}\left(r_{i}, l_{i, j}\right)Cn(ri,li,j) 由 风格化NeRF 得到,表示用风格 jjj 在视角 iii 像素 rrr 处的风格化后的颜色。 Ca(Ii,Sj)ri\mathcal{C}_{a}\left(\mathcal{I}_{i}, \mathcal{S}_{j}\right)_{r_{i}}Ca(Ii,Sj)ri 由 2D风格化模块 得到,其中 Ii\mathcal{I}_{i}Ii 表示 原NeRF 在视角 iii 下渲染的原图, Sj\mathcal{S}_{j}Sj 表示风格 jjj , rir_iri 表示视角 iii 下渲染出的像素 rrr 。
简单来说,就是从 风格化NeRF 和 2D风格化模块 分别渲染出图像,然后逐像素算 L2 损失。
Stylized NeRF 水记(NeRF的风格化)相关推荐
- DCT-Net 水记(用于 人脸风格化 的 小样本 图像翻译,无需反演,无需构造配对图片)
DCT-Net 水记(用于 人脸风格化 的 小样本 图像翻译,无需反演,无需构造配对图片) <DCT-Net: Domain-Calibrated Translation for Portrai ...
- 交互式视频风格化 水记
交互式视频风格化 水记 <Interactive Video Stylization Using Few-Shot Patch-Based Training> 项目主页: Interact ...
- Liquid Warping GAN 水记
Liquid Warping GAN 水记 <Liquid Warping GAN: A Unified Framework for Human Motion Imitation, Appear ...
- 【论文精读】NeRF —— 解读《NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis》
NeRF的核心点是实现了复杂静态场景的隐式表达,用一个神经网络来建模. Abstract 本文提出了一种新方法,通过使用稀疏的输入视图集优化底层连续的体积场景函数,实现了合成复杂场景的新视图的SOTA ...
- PI-REC 水记 (线稿+色块→绘画)
PI-REC 水记 (线稿+色块→绘画) https://github.com/youyuge34/PI-REC 官方视频教程:BV1db411g74d 机器之心 新闻稿 渐进式图像重构网络:像画画一 ...
- 神经网络辐射场NeRF、实时NeRF Baking、有向距离场SDF、占用网络Occupancy、NeRF 自动驾驶
1 NeRF原理 2 NeRF加速 Plenoxels KiloNeRF Instant NGP TensoRF 3 SDF + NeRF 4 Occupancy + NeRF 5 NeRF应用简介 ...
- NeRF系列(2):NeRF in the wild : Neural Radiance Fields for Unconstrained Photo Collections论文解读与公式推导
NeRF in the Wild: Neural Radiance Fields for Unconstrained Photo Collections 论文:https://openaccess.t ...
- MacBook进水记
水杯与狗不得靠近 --MPB 工作时不小心把水杯放在了MBP旁边,只是唯一的一次放在旁边,就被我碰倒了!键盘进入大约20ML,第一时间拔所有接线,把MBP倒过来,长按电源键关机,之后用电吹风吹了一小时 ...
- 论文水记|How to Train Triplet Networks with 100K Identities?
这是来自猎户星空的关于人脸识别的文章 作者 Chong Wang :Xue Zhang :Xipeng Lan https://arxiv.org/abs/1709.02940 好久没有写博客了,水一 ...
最新文章
- python pip 自动补全
- linux中yum怎么安装服务器,yum安装(linux如何安装yum)
- setwindowshookex回调函数不执行_ECMAScript 6 入门教程—Generator 函数的异步应用
- delphi中combobox键值对
- 08.update_by_query操作
- MappedByteBuffer的使用
- Linux iptables用法与NAT
- java实现回文验证_LeetCode 精选 TOP 面试题(Java 实现)—— 验证回文串
- 莫烦Tensorflow教程(1~14)(转)
- 【转】Java程序员最常用的8个Java日志框架
- 清华谭浩强编著的c语言程序设计教程,清华大学谭浩强C语言程序设计教程第3版 (9).doc...
- Java - @OneToMany注解的mappedBy属性有什么作用?
- Spring AOP动态代理的实现方式
- 基于JavaEE的居民水电费管理系统_JSP网站设计_MySQL数据库设计
- 浅谈“艰难困苦,玉汝于成”
- Centos安装Perl
- 永磁同步电机的矢量控制策略(八)一一一仿真模型搭建与源代码
- OC方法以及文件编译
- 淘宝旺旺号转userid 和 uid 的接口方法
- 干货|最全焊接不良汇总,你知道如何避免吗?