NeRF三维重建—神经辐射场Neural Radiance Field(二)体渲染相关
粒子采集部分
粒子采集的部分我们可以理解为,在已知粒子的情况下,对图片进行渲染的一个正向的过程。
- 空间坐标(x,y,z)
- 发射的光线通过相机模型成为图片上的像素坐标(u,v)
- 粒子颜色即为像素颜色
- (u, v)与(x, y, z)的公式如下:也就是之前在相机模型中提到的一些有关坐标转化的部分知识。
内参+外参来进行的
相反我们的任务是给定一张图片,我们需要的是在许多张图片中推导出相机为位姿信息。
- 可以看作是沿着某一条射线上的无数个发光点的“和”;
- 利用相机模型,反推射线
- 那么这个射线表示为:r(t)=o+td
- O为射线原点,d为方向,t为距离
- 极坐标表示
总结来说我们的这个过程就是相机模型的一个反向的过程表达。由像素(u,v)反推出像素的信息来。
在三维的空间中采样射线的信息。
这一部分就是我们有关的粒子采集的部分信息了。可以得到我们的原点和方向的信息。我们通过这两个信息就可以表示出这条射线了。
体渲染
我们最后得到的像素的颜色是无数个发光粒子在该射线长度上经过累计得到的和。(作为我们像素最终的颜色)。
我们在表示出的这条射线上采用一定的方法取发光粒子的值,最后通过积分就可以得出体渲染所得到的像素的位置坐标了。
r(t)=o+td r(t)=o+td r(t)=o+td
在我们计算的时候这个t是离散化的,我们如何通过选择这个离散的t来进行计算呢?
- 方法1:设置near=2,far=6。在near和far之间均匀采样64个点
- 通过图像和相机的位姿,来计算表示一条射线。
- 在射线上均匀的采样了64个点
- 训练时,一张图片取1024个像素,
- 得到1024条射线,每条射线上采样64个粒子共1024*64个粒子
我们的输出就是粒子的密度和颜色值
对之前的模型的信息进行一定的补充:
γ(p)=(sin(20πp),cos(20πp),…,sin(2L−1),cos(2L−1πp)) \gamma(p)=\left(\sin \left(2^{0} \pi p\right), \cos \left(2^{0} \pi p\right), \ldots, \sin \left(2^{L-1}\right), \cos \left(2^{L-1} \pi p\right)\right) γ(p)=(sin(20πp),cos(20πp),…,sin(2L−1),cos(2L−1πp))
- p需要归一化到[-1,1]
- 对于空间坐标x,L=10,r(x)是60D
- 对于视角坐标d,L= 4,r(d)是24D
- 在代码中,加上初始值:r(x)是63D,r(d)是27D
LOSS
- GT是图片某一像素的RGB
- 将该像素对应光线上的粒子颜色进行求和
- 粒子的颜色和:该像素颜色的预测值
- 粒子的颜色和]与像素颜色做MSE(均方误差损失)
L=∑r∈R∥C^(r)−C(r)∥22R 是每个batch的射线(1024条) \begin{array}{l} L=\sum_{r \in R}\|\hat{C}(r)-C(r)\|_{2}^{2}\\ R \text { 是每个batch的射线(1024条) } \end{array} L=∑r∈R∥C^(r)−C(r)∥22R 是每个batch的射线(1024条)
体渲染连续积分
C(s)^=∫0+∞T(s)σ(s)C(s)dsT(s)=e−∫0sσ(t)dt \begin{array}{l} \hat{C(s)}=\int_{0}^{+\infty} T(s) \sigma(s) C(s) d s \\ T(s)=e^{-\int_{0}^{s} \sigma(t) d t} \end{array} C(s)^=∫0+∞T(s)σ(s)C(s)dsT(s)=e−∫0sσ(t)dt
- T(s):在s点之前,光线没有被阻碍的概率.
- o(s):在s点处,光线碰击粒子(光线被粒子阻碍)的概率密度
- C(s):在s点处,粒子光出的颜色
- 各点的颜色和概率密度已知,要先求T(s)
每个点的体密度与颜色相乘在结合一下不透明度来进行说明。
理论推导部分说明:
- 我们对上面的公式进行推导首先推导T的公式
T(s+ds)=T(s)[1−σ(s)ds]T(s+ds)=T(s)−T(s)σ(s)dsT(s+ds)−T(s)=−T(s)σ(s)dsdT(s)=−T(s)σ(s)dsdT(s)T(s)=−σ(s)ds \begin{array}{l} T(s+d s)=T(s)[1-\sigma(s) d s] \\ T(s+d s)=T(s)-T(s) \sigma(s) d s \\ T(s+d s)-T(s)=-T(s) \sigma(s) d s \\ d T(s)=-T(s) \sigma(s) d s \\ \frac{d T(s)}{T(s)}=-\sigma(s) d s \end{array} T(s+ds)=T(s)[1−σ(s)ds]T(s+ds)=T(s)−T(s)σ(s)dsT(s+ds)−T(s)=−T(s)σ(s)dsdT(s)=−T(s)σ(s)dsT(s)dT(s)=−σ(s)ds
两边同时积分就可以得到:
∫0tdT(s)T(s)=∫0t−σ(s)ds∫0t1T(s)dT(s)=∫0t−σ(s)dslnT(s)∣0t=∫0t−σ(s)dslnT(t)−lnT(0)=∫0t−σ(s)dslnT(t)=∫0t−σ(s)dsT(t)=e∫0t−σ(s)ds \begin{aligned} \int_{0}^{t} \frac{d T(s)}{T(s)} & =\int_{0}^{t}-\sigma(s) d s \\ \int_{0}^{t} \frac{1}{T(s)} d T(s) & =\int_{0}^{t}-\sigma(s) d s \\ \left.\ln T(s)\right|_{0} ^{t} & =\int_{0}^{t}-\sigma(s) d s \\ \ln T(t)-\ln T(0) & =\int_{0}^{t}-\sigma(s) d s \\ \ln T(t) & =\int_{0}^{t}-\sigma(s) d s \\ T(t) & =e^{\int_{0}^{t}-\sigma(s) d s} \end{aligned} ∫0tT(s)dT(s)∫0tT(s)1dT(s)lnT(s)∣0tlnT(t)−lnT(0)lnT(t)T(t)=∫0t−σ(s)ds=∫0t−σ(s)ds=∫0t−σ(s)ds=∫0t−σ(s)ds=∫0t−σ(s)ds=e∫0t−σ(s)ds
因为是离散的数据我们要将之前推导出来的连续形式进行离散化的处理。
- 计算机只能处理离散化数据
- 将光线[O,s]划分为N个等间距区间[Tn→ Tn+1]
- n=0,1,2,…,N
- 间隔长度为on
C^(r)=∑i=1NTi(1−e−σiδi)ci where Ti=e−∑j=1i−1σjδj \begin{array}{l} \hat{C}(r)=\sum_{i=1}^{N} T_{i}\left(1-e^{-\sigma_{i} \delta_{i}}\right) c_{i}\\ \text { where } T_{i}=e^{-\sum_{j=1}^{i-1} \sigma_{j} \delta_{j}} \end{array} C^(r)=∑i=1NTi(1−e−σiδi)ci where Ti=e−∑j=1i−1σjδj
下面我们补充我们的离散化公式的一个推导过程。
我们对每个光区贡献的光强进行累计操作。
C^=∑n=0NI(Tn→Tn+1) \hat{C}=\sum_{n=0}^{N} I\left(T_{n} \rightarrow T_{n+1}\right) C^=n=0∑NI(Tn→Tn+1)
I(Tn→Tn+1)=∫tntn+1T(t)σnCndt=σnCn∫tntn+1T(t)dt=σnCn∫tntn+1e−∫0tσ(s)dsdt=σnCn∫tntn+1e−(∫0tnσ(s)ds+∫tntσ(s)ds)dt=σnCn∫tntn+1e−∫0tnσ(s)dse−∫tntσ(s)dsdt=σnCnT(0→tn)∫tntn+1e−∫tntσ(s)dsdt \begin{aligned} I\left(T_{n} \rightarrow T_{n+1}\right) & =\int_{t_{n}}^{t_{n+1}} T(t) \sigma_{n} C_{n} d t \\ & =\sigma_{n} C_{n} \int_{t_{n}}^{t_{n+1}} T(t) d t \\ & =\sigma_{n} C_{n} \int_{t_{n}}^{t_{n+1}} e^{-\int_{0}^{t} \sigma(s) d s} d t \\ & =\sigma_{n} C_{n} \int_{t_{n}}^{t_{n+1}} e^{-\left(\int_{0}^{t_{n}} \sigma(s) d s+\int_{t_{n}}^{t} \sigma(s) d s\right)} d t \\ & =\sigma_{n} C_{n} \int_{t_{n}}^{t_{n+1}} e^{-\int_{0}^{t_{n}} \sigma(s) d s} e^{-\int_{t_{n}}^{t} \sigma(s) d s} d t \\ & =\sigma_{n} C_{n} T\left(0 \rightarrow t_{n}\right) \int_{t_{n}}^{t_{n+1}} e^{-\int_{t_{n}}^{t} \sigma(s) d s} d t \end{aligned} I(Tn→Tn+1)=∫tntn+1T(t)σnCndt=σnCn∫tntn+1T(t)dt=σnCn∫tntn+1e−∫0tσ(s)dsdt=σnCn∫tntn+1e−(∫0tnσ(s)ds+∫tntσ(s)ds)dt=σnCn∫tntn+1e−∫0tnσ(s)dse−∫tntσ(s)dsdt=σnCnT(0→tn)∫tntn+1e−∫tntσ(s)dsdt
经过化简就可以得到最后的公式的形式:
I(Tn→Tn+1)=σnCnT(0→tn)∫tntn+1e−∫tntσndsdt=σnCnT(0→tn)∫tntn+1e−σn(t−tn)dt=σnCnT(0→tn)[−1σne−σn(t−tn)∣tntn+1]=CnT(0→tn)(1−eσnδn)=Cne−∑i=0n−1σiδi(1−eσnδn). \begin{aligned} I\left(T_{n} \rightarrow T_{n+1}\right) & =\sigma_{n} C_{n} T\left(0 \rightarrow t_{n}\right) \int_{t_{n}}^{t_{n+1}} e^{-\int_{t_{n}}^{t} \sigma_{n} d s} d t \\ & =\sigma_{n} C_{n} T\left(0 \rightarrow t_{n}\right) \int_{t_{n}}^{t_{n+1}} e^{-\sigma_{n}\left(t-t_{n}\right)} d t \\ & =\sigma_{n} C_{n} T\left(0 \rightarrow t_{n}\right)\left[-\left.\frac{1}{\sigma_{n}} e^{-\sigma_{n}\left(t-t_{n}\right)}\right|_{t_{n}} ^{t_{n+1}}\right] \\ & =C_{n} T\left(0 \rightarrow t_{n}\right)\left(1-e^{\sigma_{n} \delta_{n}}\right) \\ & =C_{n} e^{-\sum_{i=0}^{n-1} \sigma_{i} \delta_{i}}\left(1-e^{\sigma_{n} \delta_{n}}\right). \end{aligned} I(Tn→Tn+1)=σnCnT(0→tn)∫tntn+1e−∫tntσndsdt=σnCnT(0→tn)∫tntn+1e−σn(t−tn)dt=σnCnT(0→tn)[−σn1e−σn(t−tn)tntn+1]=CnT(0→tn)(1−eσnδn)=Cne−∑i=0n−1σiδi(1−eσnδn).
- 粗模型:输入均匀采样粒子,输出密度
- 细模型:根据密度,二次采样
- 最后输出:采用模型2的输出
- 粗模型和细模型结构相同