nr-nerf(Non-Rigid Neural Radiance Fields) 与nerf的区别,这玩意看了我两天,那个s鸟损失函数

为了方便之后的人去学习,在此记录一下,他喵的,整个网站上都搜不到关于这个的讲解,什么鬼东西,吐槽一下,接下来去讲解一下

nerf是什么就不多说了,既然看nr-nerf那肯定是有nerf的基础,首先还是上图

这是论文中的一个图,它是什么意思呢,这个图其实就是这个nr-nerf完整的流程图,说白了nerf的网络框架就是这个图上的所有东西,这个框架很简单,最烦人的是他后面的那个损失函数真的费脑子(忍不住去说它),首先这个图从左往右看,先看第一个图最下面那个像个眼睛的东西表示的是观察视角,从它那块发出一条射线,射线上也是随机取N_sample个样本点,然后看下面那个Learned Latent Code L(这里用大写,那不是1,是L,好看一点),这个东西是个干什么的呢,他就是论文中提到的潜在编码,它是做什么的呢,看它的去向,其实就是可以把它理解为,就是我给出一张图片它对应了一个它的潜在编码,这个潜在编码是可以去训练的,也就是说这个编码是随着训练轮数而逐渐改变的,接着看它这里的x,x指的是就是N_sample个采样点的其中一个点,就是拿这个点来举例子,其他点和这个点的操作都一样\overline{r}表示的是就是这条射线没有被弯曲的时候,也就是采样点没有去经过bending的时候(接下来会讲bending),再整体看一下这第一个图,首先就是一个畸变图,也就是他的最上面的那个字(Deformed Volume),一个畸变图对应着一个潜在编码L(在代码中它给出了86张图片)。接下来就可以看第二张图了,可以看到这个x这个采样点去了哪里呢,它是不是去了两个地方,一个是刚性网络(Rigidity Network)中,它也去了光线弯曲(Ray-BendingNetwork)中。首先咱们先看第一个网络(Rigidity Network),它有什么作用呢?它就是判断一下这个点的刚性值,那没有阅读过论文的小伙伴又产生疑问了,刚性值又是什么鬼东西,我去解释一下,其实它就是去判断一下这个点x是属于背景呢还是前景呢,我们都了解哈,一张图片的背景是不是不通常情况下不会去有太大变化,比如你去一个景点去拍照片,同一个位置你要拍还几张照片,这好几张照片是不是通常情况下,背景是没太大变化的,而前景也就是你是不是肯定不是一个姿势去拍(如果是的话,那为什么要拍好几张呢),这个刚性网络输出一个w作为对这个点的一个判断,这个数值的范围是(0,1)之间,w越接近1意味着这个点越可能是前景,就是变化的,相反么0我就不说了,接下来再去看一下第二个网络,它是做什么的?听它的名字其实也能知道它是干啥的吧,就去调整每一个样本点的位置,是不是对一条射线上的样本点进行调整,这里说的调整还没去进行调整,这个网络它会输出一个就是每个样本点的偏移量,(如果你读过我讲的D-nerf的话你绝对感觉咋这么熟悉呢,没错其实这两个文章的本质都是去对光线进行弯曲,只不过弯曲的方法不一样,D-nerf是通过加了一个时间的输入参数去,进行对光线弯曲的,而这个网络就是通过这里说的潜在编码对光线进行弯曲的,想说一点别的,还是算了吧,懂得都懂),接下来回归正题哈,接着看第二个网络,刚下不是是说了么,通过输入样本点x和这个畸变图对应的潜在编码L,然后它就是输出一个对每个点的一个偏移量,(在D-nerf中,生成的这个偏移量是不是直接就去对样本点进行偏移了,而这里不是它,还进行了一些其他操作,接下来继续去将讲这些其他操作),它不是输出了一个偏移量了么b,咱们刚才说的刚性网络(Rigidity Network)的作用也说了,是不是我们在这整个三维场景中,是不是有变化的物体(比如说一个照片里的人)它产生畸变的概率是不是大一点的,这个刚性网络输出的w也可以理解成就是这个样的子的么(这里自己去好好想一下,应该不难想通),是不是我想看到的光线的弯曲是在这些变动的物体上进行去弯曲呀,也就是这些样本点上去进行发生偏移,我们有了这些知识,就可以去看这第三张图了,\widetilde{r}代表的是偏移后的曲线,这个之后再去说它接下来去哪了,我们先看\widetilde{r}怎么来的,是不是就是这公式去计算出来的,当然计算的是每一个样本点,所有样本点都这样计算是不是就是一条弯曲的线了,w(x)说的就是这个点的刚性值,b'(x,L)说的就是它从光线弯曲网路中输出的偏移量,然后x就是咱们没有进行处理过的样本点嘛(相对于D-nerf中对应的这里就多加了一个w,可以理解为就多加了一个权重,如果你读到这,还不能明白这个公式,那我真没办法了),还有就是为什么它这里是b'而不是b,在论文中b是对应的w(x)b'(x,L),而b'仅仅就是一个中间结果,它还要加一个权重才是最终的偏移量b,接下来,它把得到的\widetilde{b}去输入到一个标准体积网络中(Canonical Volume v)这个也即是nerf的那个原始网络,在D-nerf中我讲了,其实它这里保存的那个物体的三维信息就是t=0时刻的那个物体的三维信息,如果这个不知道的,可以去看一下我那篇文章,我不想重复的去讲了,这个地方也是一样这个网络中其实也就是保存了一个静态的一个物体的三维信息,这个网路的部分就差不多就讲解完了,如果还有什么疑问,可以评论,我有时间会回复。如果仅仅只是想去了解这个它对网络做出什么改动,这里已经讲解完了,下面可以不用看了。

接下来就是对这篇文章中提到的损失函数进行一个讲解,按照论文顺序给的损失函数顺序去看首先是这个,这个和\widehat{c}(r)这个就是对应点的于这条光线的的那个像素点的真是颜色嘛,c(\widetilde{C})这个就是粗网路中对这个像素点的预测,c(\widetilde{C}\bigcup_{}^{}\widetilde{F})就是精细网路中对这个颜色的预测。然后接下来应该不用去讲了吧,至于精细网络和粗网路是什么,可以看一下,我这篇文章的前两篇nerf sample_pdf讲解D-nerf针对于nerf有什么改动,以及对Ψt和Ψx这两者主要的步骤讲解去看一下,我是真的不想做重复性工作,我写到这为止,我已经打了一个小时的字了。(都是我一个字一个打的呀,看到这也点个赞呗,谢谢,嘿嘿)。接下里再去看下一个公式这个公式计算的是偏移损失,首先什么是偏移损失呢,没错就是咱们上面说的偏移网路中产生的偏移量,首先这个公式整体的取平均就不说了应该都可以看懂αj表示的是一个权重它就是不透明度和透射率的一个乘积,这个论文里也解释的很详细,可以去看一下,至于后面这个他就是去判断一下这个点是前景还是后景,如果是前景的话他的偏移损失就会低一点,因为w那个是1,因为它认为前景进行偏移很正常,后景相反就不解释了。这个公式也就讲解完了,这个是对刚才那个公式做出的一个改进,可以注意到刚才那个公式里面是b这个公式里是b',区别我上面已经讲过了,就不讲了,就是把w这个给提出来了嘛,至于为什么我觉得论文里讲的也很清楚,就不做解释了,接下来就是发散损失这是它的计算公式,求和取平均这个直接掠过,它这里的w_{j}是指的什么呢?先说一下为什么要有这个公式吧,因为因为咱们刚才讲的那个偏移损失如果你理解了的话,其实他是不是关注点在那些可见区域(这里的可见区域是指的是在三维空间中摄像机拍照的那个角度,没有被其他物体遮挡住的那些点),这个损失是关注那些被遮挡住的那些物体(比如说一个张照片中有个人坐在一个石像前面,那这个人是不是把石像遮挡住了,是不是意味着那个w_{j}比较高呢),现在说一下w_{j}就是这个点偏移后不透明度,b还是就是偏移量,b外面套了一个div是什么东西呢,他就是偏移散度,偏移散度这个概念就是向量场分别对x,y,z求导然后求和,散度这两个字就是我是不是分散的程度的意思呢,其实就是它的字面的意思,他就是分散的程度,我对x,y,z分别求导是不是研究它的分散的趋势呢,这个趋势越大是不是就越散呢,这个物体是不是变化是不是就越大呢,我们是想让遮挡住的物体变化小一点,符合他露出来的那部分的样子不去有大的改动,想让它尽可能小,其实也就是论文里,我对这个遮挡住的物体尽可能保持他的volume,尽可能的去做一些平移和旋转(平移是不是就是个常数了求导是不是都是0,旋转也是样的,因为物体基本volume没有改变)。这也就讲完了。希望对你们有些帮助。

其实我刚才一直有一个疑问它说可以渲染一个新的角度,它是怎么做到的?它在代码中的实现样本点的偏移是通过一个潜在编码的东西,而这个是给定的呀在训练的时候总共在他的代码中有86张照片,然后每一张照片初始的潜在编码都是32个0,然后这几个潜在编码都是在训练过程中逐渐去被训练的,这也就意味着,它这每个编码不都是被绑定了么,被每张相片的视角,也就是说每张的位姿对应这么一个潜在编码(其实可以理解里面包含的信息有时间这个东西,只不过是隐式的,还有一些在这个时间下的物体的一些其他信息),如果这样去理解的话,那就意味着照片输入的位姿和时间去绑定了,也就是说在这个观察角度下,那么只能观察到这个姿态的物体,不知道你们能不能去理解这个,不能理解也没关系因为这样理解错了,在照片位姿和潜在编码的角度去考虑的话确实是这样的,但其实不应该站在这个角度去理解,要站在样本点和潜在编码的角度去理解,其实在代码实现中,那不都是每一个样本点的位置坐标编码去和那个潜在编码去相加么,然后去得到那些采样点的偏移(重要的是那个潜在编码是让采样点发生偏转,其实和视角没什么关系,视角就是去提供射线,在这射线上进行采样),这样理解就解释的通了,比如这86张图片中有一张照片对应的潜在编码是a这个是已知的并且被训练好了的那么其实a当中已经包含了这个训练时候的照片的时间和其他的一些信息,然后我现在又去站在一个新的角度上去渲染这个时间下的这个物体,在这个新的角度上有一个网格,也就是像素(可以理解为新渲染的这个照片的像素),每个网格发射出一条条射线,并且在这些射线上采样,得到采样点,然后去拿这些采样点的坐标编码去和这个潜在编码a去进行拼接然后再放到bending网路中,其实更通俗的去说就是我这个潜在编码是“作用在”这些采样点上的,而这些采样点都是在那么一个立方体中就是从这个立方体中进行采样,讲到这因该就可以理解这个了。

我还想讲一下它和D-nerf的区别,d-nerf是怎么去实现光线弯曲的呢,它就是引入了一个时间维度t对吧,就是它可以指定时间t去渲染那个时刻下不同视角下的物体的姿态,只不过它这个时间t是显示给出的,通过输入t和想要去渲染的角度就可以渲染出来新的视角下对应的照片,其实它也是时间t也是作用在采样点上的对吧,因为它也是使采样点进行发产生偏转,视角仅仅就是去给出射线,然后去在这个射线上进行选取采样点,总结一句话其实这个不管是时间t还是潜在编码其实它都是作用在这个立方体中所有的点上的,它训练出来的网络(这里说的网络包括d-nerf中的那个偏移网络和nr-nerf中的这个bending网络)其实也都是和立方体中所有点的偏移有关和视角没关系。视角仅仅是提供点的一个角度,但是时间t和潜在编码都和它没有关系。

再去讲一下,有没有考虑到这样一个问题,比如说nr-nerf训练时只有86个照片(原作者给出的那个代码中训练的那个就只有86张)对吧,那是不是也就意味着对应的潜在编码也只有86个,刚才说了潜在编码中是不是包含了一些信息,其中就包括了时间的信息,那是不是就意味着只有这86个“时刻呢”在我的理解是的,其实它只能包含这86个时刻,但是它的32位编码中难道用32位编码,它当中只包含时间信息么,当然不是刚才上面也说了,它肯定还包含一些那个时刻的这个物体的一些其他信息,这些信息是有助于接下来的bending网络的,促使bending网络给出更准确的偏转,那咱们回头看d-nerf,对比的去考虑,nr-nerf中是不是可以选择的时刻是有限的就只有训练时后训练的那些照片数量的那么多时刻(也就是上面说的86个时刻),反观d-nerf呢,虽然它也是拿一个个时刻的照片去进行训练的,但是它是不是可以选择“任意的时刻”的任意角度去进行渲染,是吧,具体为什么为d-nerf那篇文章解释过,去对比着看嘛,nr-nerf是不是它潜在编码可以包含更多的信息,使bending网络去得到更多的信息去,给出更准确的样本点的偏转,是吧。目前我也就考虑到这了,更多的可以去评论讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值