【NERF】入门学习整理
1. 【NERF】入门学习整理
1.1 基础含义输入输出
深度学习模型中储存三维模型信息,而不是像三D点云体素的显示表达。
输入:是一个五维的相机位姿(x,y,z,Yaw,Pitch)
输出:4D(R G B 不透明度)
2.位置编码含义
位置编码(x,y,z):主要是为了将图像中的高频信息体现出来,可以大幅提高图片中的细节质量,不受到周边位置平滑的操作的影响。
位置是通过 concat 的方式去将这样的信息融合起来。每个位置编码是有两项 sin和 cos。
3.代码中实际网路结构
像下图中网络隐含层为简单的全连接层(蓝色表示);第五层使用ResNet;
concat操作含义补充:
在深度学习中,concat操作指的是连接(concatenate)操作,通常用于将两个张量沿着指定的轴(通常是某个维度)进行拼接。这个操作会将两个张量按照指定的轴连接在一起,生成一个新的张量。
在实现上,可以使用深度学习框架提供的函数来进行concat操作,比如在Python中使用TensorFlow或者PyTorch等框架。以TensorFlow为例,可以使用tf.concat()
函数来实现concat操作。在PyTorch中,可以使用torch.cat()
函数来实现类似的功能。
举例来说,如果有两个形状分别为(2, 3)和(2, 4)的张量,想要在第二个维度上进行拼接,那么可以使用如下代码实现:
import tensorflow as tf
# 创建两个张量
tensor1 = tf.constant([[1, 2, 3], [4, 5, 6]])
tensor2 = tf.constant([[7, 8, 9, 10], [11, 12, 13, 14]])
# 在第二个维度上拼接
result = tf.concat([tensor1, tensor2], axis=1)
print(result)
4.Volume Render部分(64个采样点处理)
NeRF采用的是一种体积雾的渲染方式(CG),在获取一定范围采样点的(r,g,b,a)之后需要再进行特定积分运算,最终得到对应像素最终的(r,g,b,a),在训练时通过光线采样点积分的得到的像素值
代码在这一部分定义采样点实际采样的区域,并将这一组采样点进行积分的方式处理输出为rgb图像
需要的主要参数有:
H,W:图片的高,宽(像素为单位)
K:相机的内参,即焦距
chunk:同时处理的光线数量(batch)
rays:表示每个示例光线的起点和方向(射线)
c2w:相机到世界的变换矩阵
near:光线最近的距离
far:光线最远的距离
![在这里
5.Volume Render部分(64个采样点处理)
我们可以简单地理解为:
我们使用一个NeRF神经网络采取体积雾的渲染方式,通过已知视角的图片进行训练,然后输入其它相机位姿的参数,从而预测出未出现视角的图片。
此时三维模型的信息就储存在了NeRF神经网络之中! 所以这是一种中"隐式"的表示方法,而不是像点云、体素、网格这种显式的表示方式!
论文输入:
代码实际输入:
网络输入输出说明:
input:(x,y,z,0,φ)代表输入的相机位姿
output:(r,g,b,σ)代表颜色和不透明度
(batch_size=1024, sample_points=64, features=n)
batch_size–在一个训练批次/选代用于训练的像素点/射线数量
sample_points–每条射线在一定范围随机采样点的数量
features–为网络中的输入或输出特征的长度,如62、256128等