NeRF

最近神经网络界最火爆的两个技术,一个是 NeRF(NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis),另一个是 deep diffussion model,这里对 NeRF 进行调研之后进行一些总结。

感知的核心任务其实是对于周围环境的理解,对于机器人来说,只有理解了环境,然后才能做出一系列的决策。在环境理解中,三维环境重建是重要的任务之一。目前三维重建的手段是通过一系列的传感器在时空上对周围环境进行采样,而采样的结果将会作为三维重建的约束。一般来说当前的传感器有摄像头、激光雷达、毫米波雷达、超声波雷达等。而 NeRF 提出了一种如何通过一系列二维图片(摄像头)对三维重建进行约束的方法,其核心思想是建立可微的渲染方程。

1. 渲染方程(Rendering equation)

如果当前有一种对于三维环境的空间描述方法,并且清楚知道三维环境是如何在摄像头上进行成像的,则可以用图像对其进行约束,这种从三维环境到二维图像的过程被称为渲染,其核心问题是如何更好地描述真实世界的光照。

Nerf 认为整个空间由一系列的粒子构成,这些粒子一方面自身会发出光,另一方面这些粒子会吸收入射到它们的光,前者对应漫反射,后者对应遮挡。假设已知摄像头的内参\boldsymbol K、外参\boldsymbol R, \boldsymbol t,那么对于像素(u, v)^T来说,深度为z的位置在世界坐标系的位置\boldsymbol r和方向\boldsymbol d
\begin{aligned} \boldsymbol r &= \boldsymbol R^T \bigg( \boldsymbol K^{-1} \begin{bmatrix} zu \\ zv \\ z \end{bmatrix} - \boldsymbol t \bigg) \\ \quad \boldsymbol d &= \boldsymbol R^T \boldsymbol K^{-1} \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} \end{aligned}

在位置\boldsymbol r = r(z)处,取一个母线方向和\boldsymbol d相同的扁圆柱,其底面面积为E,长为\Delta z,粒子密度为\rho(\boldsymbol r),那么圆柱中的粒子个数为
n = E \Delta z \rho(\boldsymbol r)

\Delta z \to 0时,可以认为粒子几乎全部平铺在圆柱底部,如果粒子的截面积为A,那么所有粒子占据的总面积是nA,根据假设粒子会吸收入射到它们上面的光,因此光束打到圆柱上后被吸收的比例和面积占比一致为
\frac{nA}{E} = \Delta z \rho(\boldsymbol r)A

这里假设光是从外向内(摄像头光心)发射的,因此有
I(\boldsymbol r - \Delta \boldsymbol r) = (1 - \Delta z \rho(\boldsymbol r) A) I(\boldsymbol r)

取极限后可以得到微分方程
\frac{dI(\boldsymbol r)}{dz} = \lim_{\Delta z \to 0} \frac{\Delta I(\boldsymbol r)}{\Delta z} = \lim_{\Delta z \to 0} \frac{I(\boldsymbol r) - I(\boldsymbol r - \Delta \boldsymbol r)}{\Delta z} = \rho(\boldsymbol r) A I(\boldsymbol r) = \sigma(\boldsymbol r) I(\boldsymbol r)

如果考虑到粒子自身也会发光,发光量为 g(\boldsymbol r),那么有
I(\boldsymbol r - \Delta \boldsymbol r) = (1 - \Delta z \sigma(\boldsymbol r)) I(\boldsymbol r) + g(\boldsymbol r)

方程变成
\frac{dI(\boldsymbol r)}{dz} = \sigma(\boldsymbol r) I(\boldsymbol r) - g(\boldsymbol r)

该微分方程求解如下
\begin{aligned} \frac{dI(\boldsymbol r)}{dz} - \sigma(\boldsymbol r) I(\boldsymbol r) &= -g(\boldsymbol r) \\ &\Downarrow \\ \bigg[ \frac{dI(\boldsymbol r)}{dz} - \sigma(\boldsymbol r) I(\boldsymbol r) \bigg] e^{-\int_0^z\sigma(\boldsymbol r)dx} &= -g(\boldsymbol r) e^{-\int_0^z\sigma(\boldsymbol r)dx} \\ &\Downarrow \\ \frac{d}{dz} I(\boldsymbol r) e^{-\int_0^z\sigma(\boldsymbol r)dx} &= -g(\boldsymbol r) e^{-\int_0^z\sigma(\boldsymbol r)dx} \\ &\Downarrow \\ I(\boldsymbol r_f) e^{-\int_0^{z_f}\sigma(\boldsymbol r)dx} - I(\boldsymbol r_n) e^{-\int_0^{z_n}\sigma(\boldsymbol r)dx} &= -\int_{z_n}^{z_f} g(\boldsymbol r) e^{-\int_0^z\sigma(\boldsymbol r)dx} dz \\ &\Downarrow \\ I(\boldsymbol r_n) e^{-\int_0^{z_n}\sigma(\boldsymbol r)dx} &= I(\boldsymbol r_f) e^{-\int_0^{z_f}\sigma(\boldsymbol r)dx} + \int_{z_n}^{z_f} g(\boldsymbol r) e^{-\int_0^z\sigma(\boldsymbol r)dx} dz \\ &\Downarrow \\ I(\boldsymbol r_n) &= I(\boldsymbol r_f) e^{-\int_{z_n}^{z_f}\sigma(\boldsymbol r)dx} + \int_{z_n}^{z_f} g(\boldsymbol r) e^{-\int_{z_n}^z\sigma(\boldsymbol r)dx}dz \end{aligned}

正常积分的范围应该为 0 \to \infty,但是工程上是不可实现的,因此采用 \boldsymbol r_n 表示采样的最近距离,\boldsymbol r_f 表示采样的最远距离,在这样的假设下,I(\boldsymbol r_n) 表示摄像头看到的颜色,也就是需要求解的值,I(\boldsymbol r_f) 表示背景光的颜色,这个是 Nerf 原始论文中没有考虑到的项,后来在一些论文中被添加进去。在 NeRF 中认为 g(\boldsymbol r) = \sigma(\boldsymbol r) c(\boldsymbol r, \boldsymbol d),因此有了论文中的公式如下所示
I(\boldsymbol r_n) = \int_{z_n}^{z_f} \sigma(\boldsymbol r) c(\boldsymbol r, \boldsymbol d) e^{-\int_{z_n}^z\sigma(\boldsymbol r)dx}dz

注意到 NeRF 对于渲染模型的建立只考虑了遮挡和漫反射,对于其他比如多次散射等并没有考虑,如果想要考虑这些因素,可以阅读论文Optical models for direct volume rendering。为了方便编写程序,需要对上述的连续方程进行离散化,首先进行变形得到
\begin{aligned} I(\boldsymbol r_n) &= \int_{z_n}^{z_f} \sigma(\boldsymbol r) c(\boldsymbol r, \boldsymbol d) e^{-\int_{z_n}^z\sigma(\boldsymbol r)dx}dz \\ &= \int_{z_n}^{z_f} -c(\boldsymbol r, \boldsymbol d) d e^{-\int_{z_n}^z\sigma(\boldsymbol r)dx} \\ &= \sum_{z = z_n}^{z_f} -c(\boldsymbol r, \boldsymbol d)(e^{-\sum_{z_n}^z \sigma(\boldsymbol r)\Delta z} - e^{-\sum_{z_n}^{z - \Delta z}\sigma(\boldsymbol r) \Delta z}) \end{aligned}

如果在 [z_n, z_f] 上进行采样,得到一系列采样点 z_1, \cdots, z_N,因此最终的离散表达式可以写成
\begin{aligned} I(\boldsymbol r_n) = \sum_{i = 1}^{N} c(\boldsymbol r_i, \boldsymbol d_i)(e^{-\sum_{j = 1}^{i - 1}\sigma(\boldsymbol r_j) \Delta z_j} - e^{-\sum_{j = 1}^{i}\sigma(\boldsymbol r_j) \Delta z_j}) \end{aligned}

读完可能会很奇怪,这个哥们是怎么想到这种奇奇怪怪的方法的,很多人怀疑他曾经搞过射线追踪,事实上也确实是如此,在他的主页 Ben Mildenhall 上可以看到,他在校时期完成过一些和渲染、射线追踪相关的课程大作业,这也很好地解释了为什么他可以很自然地想到用神经网络来完成这项任务。

2. 三维空间描述方法

当前对三维空间描述的方法主要有以下四种:栅格、点云、隐式表达、面元


3d_model.png

3. 球谐函数(Spherical Harmonics,SH)

在采用类似 Plenoxels 思路完成三维重建过程中,一个绕不开的坎是球谐函数,其就是在球坐标系下的傅里叶展开,可以表示球坐标系下的各种函数,最开始用在游戏渲染行业。这里用它来表示空间三维点颜色(像素颜色)随着观察角度(相机移动)的不同而产生的微小变化。

在一般的论文中提到球谐函数,往往采用复球谐函数的形式,如下所示
Y_l^m(\theta, \phi) = \sqrt{\frac{(l - m)!}{(l + m)!}\frac{2l + 1}{4\pi}}P_l^m(\cos\theta)e^{im\phi}

其中 \theta, \phi 定义如下
\begin{aligned} x &= r\sin\theta \cos\phi \\ y &= r\sin\theta \sin\phi \\ z &= r\cos\theta \end{aligned}

P_l^m(x) 是伴随勒让德多项式,可以通过如下的递推公式得到结果
\begin{aligned} P_m^m(x) &= (-1)^m(2m - 1)!!(1 - x^2)^{\frac{m}{2}} \\ P_{m + 1}^m(x) &= x(2m + 1)P_m^m(x) \\ (l - m)P_l^m(x) &= x(2l - 1)P_{l - 1}^m - (l + m - 1)P_{l - 2}^m \\ \end{aligned}

这里列出最开始的几个伴随勒让德多项式的结果
\begin{aligned} P_0^0 &= 1 \\ P_1^0 &= x & P_1^1 &= -\sqrt{1 - x^2} \\ P_2^0 &= \frac{1}{2}(3x^2 - 1) & P_2^1 &= -3x\sqrt{1 - x^2} & P_2^2 &= 3(1 - x^2) \\ P_3^0 &= \frac{1}{2}(5x^3 - 3x) & P_3^1 &= \frac{3}{2}(1 - 5x^2)\sqrt{1 - x^2} & P_3^2 &= 15x(1 - x^2) & P_3^3 &= -15(1 - x^2)^{\frac{3}{2}}\\ \cdots \end{aligned}

但是在工程中,采用的一般是实球谐函数(Real Spherical Harmonics),如下所示
Y_l^m(\theta, \phi) = \begin{cases} (-1)^{|m|}\sqrt{\frac{(l - |m|)!}{(l + |m|)!}\frac{2l + 1}{2\pi}}P_l^{|m|}(\cos\theta)\cos(|m|\phi) & m > 0 \\ (-1)^{|m|}\sqrt{\frac{(l - |m|)!}{(l + |m|)!}\frac{2l + 1}{2\pi}}P_l^{|m|}(\cos\theta)\sin(|m|\phi) & m < 0 \\ \sqrt{\frac{2l + 1}{4\pi}}P_l^0(\cos\theta) & m = 0 \end{cases}
这里列出了最开始的几个实球谐函数
\begin{aligned} Y_0^0 &= \frac{1}{2}\sqrt{\frac{1}{\pi}} \\ Y_1^{-1} &= \sqrt{\frac{3}{4\pi}} \sin\theta \sin\phi \\ Y_1^{0} &= \sqrt{\frac{3}{4\pi}} \cos\theta \\ Y_1^{1} &= \sqrt{\frac{3}{4\pi}} \sin\theta \cos\phi \\ Y_2^{-2} &= \frac{1}{4}\sqrt{\frac{15}{\pi}} \sin^2\theta \sin2\phi \\ Y_2^{-1} &= \frac{1}{2}\sqrt{\frac{15}{\pi}} \sin\theta \cos\theta \sin\phi \\ Y_2^{0} &= \frac{1}{4}\sqrt{\frac{5}{\pi}} (3\cos^2\theta - 1) \\ Y_2^{1} &= \frac{1}{2}\sqrt{\frac{15}{\pi}} \sin\theta \cos\theta \cos\phi \\ Y_2^{2} &= \frac{1}{4}\sqrt{\frac{15}{\pi}}\sin^2\theta \cos2\phi \\ \cdots \end{aligned}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容