NeRF 源码分析解读(三)

本文深入解读NeRF模型中的光线生成过程,从相机参数到像素坐标变换,探讨如何构造单位方向向量,为渲染提供输入。通过get_rays_np函数剖析像素到光心的路径,涉及相机坐标系、小孔成像原理及世界坐标转换。

NeRF 源码分析解读(三)

光线的生成

上一章节我们对 NeRF 模型的初始化代码进行了分析,即 create_nerf() 部分,本章节我们继续对 NeRF 代码进行分析注释。
我们回顾一下前两节的内容:

def train():
	
	# 1、加载数据
	if args.dataset_type == 'llff':
	elif ...
	...

	# 2、初始化网络模型
	render_kwargs_train, render_kwargs_test, start, grad_vars, optimizer = create_nerf(args)
	...
	
	if args.render_only: ...

初始化网络模型之后我们继续向下分析代码,会发现一个渲染操作的判断 if args.render_only 。在网络模型训练好以后我们保存整个网络,在测试渲染时只需要将 render_only 参数置 True,不再对网络进行训练,直接得到渲染结果。核心代码在于渲染函数,我们先不对这一块儿代码进行分析,按照训练的流程,在初始化光线以后需要渲染得到像素值,因此我们对渲染函数的分析留在光线生成之后。我们继续向下分析代码。
下面的代码会涉及到光线的生成部分,比较重要

def train():

	...
	
	# 开始读取光线以及光线对应的像素值
	N_rand = args.N_rand
	# 是否以批处理的形式生成光线
    use_batching = not args.no_batching
    if use_batching:
    	...

use_batching 参数决定了是否从多个角度进行光线投射。源代码中对 lego 小车重建时参数为 False,这里我们为了读者能够更好的理解,同样对这部分代码进行解析。

def train():

	...
	
    if use_batching:
        print('get rays')
        rays = np.stack([get_rays_np(H, W, K, p) for p in poses[:,:3,:4]], 0) # [N, ro+rd, H, W, 3]
        print('done, concats')
        rays_rgb = np.concatenate([rays, images[:, None]], 1)  # [N, ro+rd+rgb, H, W, 3]  这里把光线的原点、方向、以及这条光线对应的像素颜色结合到一起,便于后面的 shuffle 操作
        rays_rgb = np.transpose(rays_rgb, [0,2,3,1,4])  # [N, H, W, ro+rd+rgb, 3]
        rays_rgb = np.stack([rays_rgb[i] for i in i_train], 0)  
评论 19
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值