主要是用cone tracing代替ray tracing,消除不确定性。使用多元高斯函数表示一段截头圆锥,并提出IPE(Integrated Positional Encoding)替代原始NeRF中的PE。
原始NeRF的问题
- (a, top) 用full-resolution训练的NeRF能够渲染photo-realistic view,但仅仅是渲染与训练图像相同的scale或resolution时;
- (a, bottom) 减小图像分辨率(后拉camera并zooming in或相似的操作。smartphone:人往后退,用双指将屏幕中的图像放大)会导致renderings出现严重的锯齿;注:此处应该是指在full-resolution的NeRF模型上渲染低分辨率图像会导致严重的锯齿,而不是指训练数据用低分辨率;
- (b) 在multi-resolution images上训练NeRF稍微改善了这个问题,但会导致跨尺度的渲染质量差:全分辨率时模糊,低分辨率时“锯齿”。
- (c) MipNeRF也是在multi-resolution images上进行训练,但跨尺度渲染的效果不错。
原因:
NeRF沿着pixel对应的ray提取point-sampled positional encoding features,这些point-sampled features:
- 忽略了ray看到的volume的形状和大小(图中的蓝色和黄色截头圆锥。右边的camera更近,其看到的scene volume如蓝色所示,较小的截头圆锥;而左边的camera更远,看到的应该比右边的要大,如黄色部分所示);
- 导致两个不同的camera以不同的scale(可理解为与scene距离不相等的两个camera)对相同的位置(如图中红点)进行成像时可能会提取相同的point-sampled feature(按道理feature应该不一样),从而降低NeRF的性能。
NeRF的Ray Tracing存在ambiguity:不同位置camera对相同空间点提取了相同的point-sampled feature,即无辨识度。
而MipNeRF通过Cone Tracing解决这种ambiguity,如下图所示。因为不同位置camera所cast的cone是不一样大小的,所以对空间同一点所产生的feature不一样(如何产生feature见后文IPE),有辨识度。
从信号处理的角度解决锯齿/混叠问题:一是增加采样频率(增加采样点数量,每个pixel 用多条rays);二是预滤波,用low-pass filter减小所需的Nyquist频率,这样所需的采样点数量减少(本文属于方式二)。
重点components
Cone Tracing
pixel所cast的不是ray,而是cone,可消除NeRF的ambiguity。
IPE-integrated positional encoding
IPE(integrated positional encoding):MipNeRF将cone划分为N段,即N个截头圆锥,如何获取这些截头圆锥的feature呢?一个直接的方法就是用NeRF中所用的积分方式,公式如下:
其中表示某个截头圆锥,就是截头圆锥某点的positional encoding特征(就是NeRF中的PE)。但是的分布是未知的,所以上式无法计算。本文用多元高斯函数来近似一个截头圆锥,从而能够计算上式。
如何用多元高斯函数近似一个截头圆锥?具体推导见论文及论文附录。
PE与IPE的差异
NeRF的PE公式:
和NeRF中的PE相比,多了一个指数衰减项,且空间位置X变成了,即截头圆锥均值的PE,是一个统计值。
参考链接-IPE的特点。一个截头圆锥的统计属性(均值、方差)和它所处的位置相关,意味着IPE特征是用截头圆锥的位置计算的,和PE的本质一样,只不过IPE用的是位置的统计属性。上图中蓝色表示高频、红色表示低频。对于高频部分变化较快,有很多细条;低频部分变化较慢,是宽条。IPE对这些频率进行积分,如果截头圆锥比较大,则最终积分结果中高频趋于0;如果截头圆锥比较小,则高低频都有(此时等价于PE)。
训练数据的结构
用源代码中dataset.py
文件进行分析。将synthetic data缩放为不同等级,如800x800, 400x400, 200x200, 100x100的大小,总计400张。代码文件dataset.py
中的MultiCamera
类即是所使用的多尺度训练数据,其有两个比较重要的成员:self.images
, self.rays
,前者是图片数据,类型是list,大小为400,每个成员是一张图片,图片大小为上面4种情况;
后者是一个类似于字典的“类”,包括:directions, far等字段,它们均是list类型,长度均为400(与400张图片相对应)。如viewdirs成员变量,其第一个元素是(800,800,3),表示了(x,y)像素处的view direction(3D空间)。疑问:directions和viewdirs有什么不同?