└train
├─config:
├─llff_data_load :--》input .npy[图片数目,3*5];--》output :images, poses, bds, render_poses, i_test
├─create_nerf() :--》input args;--》output :render_kwargs_train, render_kwargs_test, start, grad_vars, optimizer
└get_embedder():作用xyz+方向进行位置编码--》input输入xyz三维 ;-- output :embed_fn, input_ch=63;是属于run_nerf_helps.py文件中的函数;包含了傅里叶变换torch.sin与cos
└class Embedder对应论文5.1;
└create_embedding_fn 2pi的那个公式;对应论文5.1升维度的公式;
├─class NERF模型初始化:--》input d深度w通道数,xyz通道数;--》output :输出特征 alpha和rgb的最后层;
└forward xyz与视角分开---run_nerf_helps.py
├─load_weights_from_keras 核权重----run_nerf_helps.py
├─精细模型初始化refine 网络初始化
├─模型批量化处理数据
└run_network :Prepares inputs and applies network 'fn'以更小的patch-netchunk送进网络跑前向--》inputnetchunk=1024*64;--》output
├─优化器optimizer(torch.optim.Adam)
├─# 训练需要的参数
create_nerf()输出--》output:render_kwargs_train, render_kwargs_test, start, grad_vars, optimizer
├─仅渲染
└render_path输入(render_poses, hwf, K, args.chunk, render_kwargs_test, gt_imgs=images, savedir=testsavedir, render_factor=args.render_factor) 输出rgbs
├─如果批量处理处理ray,则准备raybatch tensor
├─N_iters 最大迭代次数,开始迭代for iintrange(start,N_iters):
└get_rays输入:(H,W,K,torch.Tensor(pose)) #(H,W,3),(H,W,3) ---run_nerf_helps.py; 旋转摄像方向从相机变为世界坐标系;将相机框架变为世界框架。
├─缩小成原始尺寸的1/2
├─render():输入(H, W, K, chunk=args.chunk, rays=batch_rays,verbose=i < 10, retraw=True,**render_kwargs_train)输出--》output:rgb, disp, acc, extras 【函数中的是ret_list + [ret_dict]】
Args:
H: int. 图像高度
W: int. 宽度
focal: float. 针孔相机焦距
chunk: int. 同步处理的最大光线数
rays: array of shape [2, batch_size, 3]. 每个batch的ray的原点和方向
c2w: array of shape [3, 4].相机到世界的转换矩阵3x4
ndc: bool. If True, represent ray origin, direction in NDC coordinates.NDC坐标
near: float or array of shape [batch_size]. .光线最近距离
far: float or array of shape [batch_size]. 光线最远距离
use_viewdirs: bool. If True, use viewing direction of a point in space in model.使用view方向
c2w_staticcam: array of shape [3, 4]. If not None, use this transformation matrix for
camera while using other c2w argument for viewing directions.变换矩阵
Returns:
rgb_map: [batch_size, 3]. Predicted RGB values for rays.预测的rgb图
disp_map: [batch_size]. Disparity map. Inverse of depth.视差图
acc_map: [batch_size]. Accumulated opacity (alpha) along a ray.深度图
extras: dict with everything returned by render_rays().其它
确定rays_o, rays_d的值 = get_rays(H, W, K, c2w/c2w_staticcam)or rays;
变换形状,最后一位变为3位;
└batchify_rays() 在更小的batch上进行渲染,避免超出内存;--》input输入:(rays_flat, chunk=256*32, **kwargs);输出--》output:all_ret全部结果拼接在一起
└render_rays()--》input输入:ray_batch,network_fn,network_query_fn,N_samples,retraw=False,lindisp=False,perturb=0.,N_importance=0,network_fine=None,white_bkgd=False,raw_noise_std=0.,verbose=False,pytest=False;输出--》output:ret
Args:
ray_batch: 用来view ray采样的所有必须数据:ray原点,方向,最大最小距离,单位方向array of shape [batch_size, ...].
network_fn: NeRF网络,用来预测空间中每个点rgb和透明度
network_query_fn: 将查询传递给network_fn的函数
N_samples: coarse采样点数,int.
retraw: bool. 如果为真,返回数据无压缩,If True, include model's raw, unprocessed predictions.
lindisp: bool. 如果为true在在深度图的逆上线性采样
perturb: 扰动 float, 0 or 1. 0在分层随机时间点对每条射线进行采样.
N_importance: fine增加的精细采样点数 int.
network_fine: fine网络
white_bkgd: 若为true则认为是白色背景 bool.
raw_noise_std:噪声 ...
verbose: 打印debug信息 bool. If True, 打印
Returns:
rgb_map: ray的rgb[num_rays, 3].
disp_map: 视差[num_rays].
acc_map:累积不透明度 [num_rays].
raw: 原始raw数据[num_rays, num_samples, 4].
rgb0: See rgb_map.
disp0: See disp_map. Output for coarse model.
acc0: See acc_map. Output for coarse model.
z_std: 标准差[num_rays]. Standard deviation of distances along ray for eachsample.
├─计算l2loss:img2mse ()求平均值:img2mse = lambda x, y : torch.mean((x - y) ** 2)
├─计算峰值信噪比psnr():mse2psnr = lambda x : -10. * torch.log(x) / torch.log (torch.Tensor([10.]))
├─反向传播loss 迭代
├─调整学习率,存日志