位置: IT常识 - 正文

NeRF 源码分析解读(二)(nerf代码)

编辑:rootadmin
NeRF 源码分析解读(二) NeRF 源码分析解读(二)光线的生成

推荐整理分享NeRF 源码分析解读(二)(nerf代码),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:nerf 算法,netsurf 源码分析,nerf csdn,nerf原理图,nerf 算法,nerf代码,nerf代码,nerf开源图纸,内容如对您有帮助,希望把文章链接给更多的朋友!

由上一章节我们得到了加载到的数据,包括读取图像的数组、图像的高宽焦距、相机的 pose 、以及用于分割测试集、训练集的分割数组。得到这些数据后,我们开始进行生成光线的步骤。 生成光线的步骤是 NeRF 代码中最为关键的一步,实际上我们模拟的光线就是三维空间中在指定方向上的一系列离散的点的坐标。有了这些点坐标,我们将其投入到 NeRF 的 MLP 神经网络中,计算这个点的密度值以及颜色值。 下面我们对具体代码进行分析。

def train():...# 加载数据,具体加载代码分析详见 上一篇博客... if K is None: K = np.array([ [focal, 0, 0.5*W], [0, focal, 0.5*H], [0, 0, 1] ])

注意这里的 K 。这里的 K 指的是相机的内参,具体的作用会在后面的分析中进行解释说明

1、初始化 NeRF 网络模型def train():...# 初始化 NeRF 网络模型render_kwargs_train, render_kwargs_test, start, grad_vars, optimizer = create_nerf(args)bds_dict = { 'near' : near, 'far' : far, } # 更新字典,加入三维空间的边界框 bounding box render_kwargs_train.update(bds_dict) render_kwargs_test.update(bds_dict)...

我们首先对 create_nerf() 返回的值进行解释说明:

render_kwargs_train:一个字典,包含了用于训练的各个参数值。具体字典内容详见下面的代码分析render_kwargs_test:start:grad_vars: 整个网络的梯度变量optimizer: 整个网络的优化器NeRF 源码分析解读(二)(nerf代码)

接下来我们对 create_nerf() 代码进行具体的逐行分析:

def create_nerf(args): embed_fn, input_ch = get_embedder(args.multires, args.i_embed) ...

这行语句实际上获得一个编码器 embed_fn 以及一个编码后的维度,给定 embed_fn 一个输入,就可以获得输入的编码后的数据。具体的编码公式如下,详见论文 5.1 节,代码分析详见:位置编码代码注释分析。

γ(p)=(sin⁡(2πp),cos⁡(2πp),⋯ ,sin⁡(2L−1πp),cos⁡(2L−1πp))\gamma(p)=\left(\sin \left(2^{0} \pi p\right), \cos \left(2^{0} \pi p\right), \cdots, \sin \left(2^{L-1} \pi p\right), \cos \left(2^{L-1} \pi p\right)\right)γ(p)=(sin(20πp),cos(20πp),⋯,sin(2L−1πp),cos(2L−1πp))

以下是网络结构的初始化代码,网络的层级模型详见论文 补充材料 pic 7。 关于 NeRF 的 model 部分我们会单独开一个章节进行解读。(待更新),总之我们只需要知道我们在这里创建了 NeRF 的粗网络,给这个粗网络输入一个 5D 的输入,就可以得到一个 (RGB,A)的输出,即: FΘ:(x,d)→(c,σ)F_{\Theta}:(\mathbf{x}, \mathbf{d}) \rightarrow(\mathbf{c}, \sigma)FΘ​:(x,d)→(c,σ) FθF_{\theta}Fθ​ 就是我们创建的网络 model

def create_nerf(args):...# 初始化MLP模型参数,网络的层级模型详见论文 补充材料 pic 7 model = NeRF(D=args.netdepth, W=args.netwidth, input_ch=input_ch, output_ch=output_ch, skips=skips, input_ch_views=input_ch_views, use_viewdirs=args.use_viewdirs).to(device) # 模型中的梯度变量 grad_vars = list(model.parameters()) ... # 定义一个查询点的颜色和密度的匿名函数,实际上给定点坐标,方向,以及查询网络,我们就可以得到该点在该网络下的输出([rgb,alpha]) network_query_fn = lambda inputs, viewdirs, network_fn : run_network(inputs, viewdirs, network_fn, embed_fn=embed_fn, embeddirs_fn=embeddirs_fn, netchunk=args.netchunk # 网络批处理查询点的数量)

可以看到这里的 network_query_fn 是一个匿名函数,真正起作用的函数是 run_network() 。下面我们对 run_network() 进行分析,观察我们是如何生成给定点的颜色和密度的。 run_network() 代码分析如下:

def run_network(inputs, viewdirs, fn, embed_fn, embeddirs_fn, netchunk=1024*64): """ 对 input 进行处理,应用 神经网络 fn """ inputs_flat = torch.reshape(inputs, [-1, inputs.shape[-1]])embedded = embed_fn(inputs_flat) # 对输入进行位置编码,得到编码后的结果,是一个 array 数组if viewdirs is not None:# 视图不为 None,即输入了视图方向,那么我们就应该考虑对视图方向作出处理,用以生成颜色input_dirs = viewdirs[:, None].expand(inputs.shape)input_dirs_flat = torch.reshape(input_dirs, [-1, input_dirs.shape[-1]])embedded_dirs = embeddirs_fn(input_dirs_flat) # 对输入方向进行编码embedded = torch.cat([embedded, embedded_dirs], -1) # 将编码后的位置和方向聚合到一起outputs_flat = batchify(fn, netchunk)(embedded) # 将编码过的点以批处理的形式输入到 网络模型 中得到 输出(RGB,A)outputs = torch.reshape(outputs_flat, list(inputs.shape[:-1]) + [outputs_flat.shape[-1]])return outputs

这里的 batchify() 函数会把 embedded 数组分批输入到网络 fn 中,前向传播得到对应的 (RGB,A)。 接下来我们继续对 create_nerf() 进行分析

def create_nerf(args):...# 创建网络的优化器 optimizer = torch.optim.Adam(params=grad_vars, lr=args.lrate, betas=(0.9, 0.999))...# 关于加载已有模型的部分我们不在逐行分析,对整体算法的分析没有任何影响...# 注意看,现在整体的初始化已经完成,我们需要对返回值进行一些处理render_kwargs_train = { 'network_query_fn' : network_query_fn, 'perturb' : args.perturb, 'N_importance' : args.N_importance, 'network_fine' : model_fine, 'N_samples' : args.N_samples, 'network_fn' : model, 'use_viewdirs' : args.use_viewdirs, 'white_bkgd' : args.white_bkgd, 'raw_noise_std' : args.raw_noise_std, } # NDC 空间,只对前向场景有效,具体解释可以看论文,这里不再展开 if args.dataset_type != 'llff' or args.no_ndc: print('Not ndc!') render_kwargs_train['ndc'] = False render_kwargs_train['lindisp'] = args.lindisp render_kwargs_test = {k : render_kwargs_train[k] for k in render_kwargs_train} render_kwargs_test['perturb'] = False render_kwargs_test['raw_noise_std'] = 0. return render_kwargs_train, render_kwargs_test, start, grad_vars, optimizer

下面我们对字典 render_kwargs_train 中的键值进行分析:

'network_query_fn' : network_query_fn, # 上文已经解释过了,这是一个匿名函数,给这个函数输入位置坐标,方向坐标,以及神经网络,就可以利用神经网络返回该点对应的 颜色和密度'perturb' : args.perturb, # 扰动,对整体算法理解没有影响'N_importance' : args.N_importance, # 每条光线上细采样点的数量'network_fine' : model_fine, # 论文中的 精细网络'N_samples' : args.N_samples, # 每条光线上粗采样点的数量'network_fn' : model, # 论文中的 粗网络'use_viewdirs' : args.use_viewdirs, # 是否使用视点方向,影响到神经网络是否输出颜色'white_bkgd' : args.white_bkgd, # 如果为 True 将输入的 png 图像的透明部分转换成白色'raw_noise_std' : args.raw_noise_std, # 归一化密度

以上我们完成了 NeRF 模型的初始化部分。我们在下一章节继续对 train() 函数进行分析。NeRF源码分析解读(三)

本文链接地址:https://www.jiuchutong.com/zhishi/298610.html 转载请保留说明!

上一篇:共识算法涉及的概念(共识算法主要解决什么问题)

下一篇:Win11 Build 23430 预览版发布(附更新修复内容汇总)

  • 荣耀20青春版可以升级鸿蒙系统吗(荣耀20青春版可以用40w快充吗)

    荣耀20青春版可以升级鸿蒙系统吗(荣耀20青春版可以用40w快充吗)

  • 华为每周六都有充值返利吗(华为每周六都有优惠券吗)

    华为每周六都有充值返利吗(华为每周六都有优惠券吗)

  • powerbank是什么牌子的充电宝(powerblend是什么品牌)

    powerbank是什么牌子的充电宝(powerblend是什么品牌)

  • 剪映app两个视频怎么拼在一起(剪映app两个视频一起播放)

    剪映app两个视频怎么拼在一起(剪映app两个视频一起播放)

  • 腾讯会议用流量多吗(腾讯会议用流量开视频半个小时要多少流量)

    腾讯会议用流量多吗(腾讯会议用流量开视频半个小时要多少流量)

  • 校园网认证失败是什么原因(校园网认证失败无法连接认证服务器)

    校园网认证失败是什么原因(校园网认证失败无法连接认证服务器)

  • 钉钉怎么同时登录2个手机

    钉钉怎么同时登录2个手机

  • 重新下载的微信怎么恢复聊天记录(重新下载的微信怎么才能恢复聊天记录)

    重新下载的微信怎么恢复聊天记录(重新下载的微信怎么才能恢复聊天记录)

  • 骑手能看到顾客差评吗(骑手能看到顾客的哪些信息)

    骑手能看到顾客差评吗(骑手能看到顾客的哪些信息)

  • 红米note7和note8贴膜通用吗(红米note7和note8pro贴膜通用吗)

    红米note7和note8贴膜通用吗(红米note7和note8pro贴膜通用吗)

  • 主板与显卡的搭配原则(主板和显卡怎么搭配兼容)

    主板与显卡的搭配原则(主板和显卡怎么搭配兼容)

  • 进程由哪三个部分组成(进程的三大组成部分)

    进程由哪三个部分组成(进程的三大组成部分)

  • win7能用uefi启动吗(win7支持uefi启动)

    win7能用uefi启动吗(win7支持uefi启动)

  • vivo手机如何关闭自动锁屏(vivo手机如何关机开机)

    vivo手机如何关闭自动锁屏(vivo手机如何关机开机)

  • 降序是从大到小吗(降序是1还是0)

    降序是从大到小吗(降序是1还是0)

  • 华为手环丢失后怎样能追踪下落(华为手环丢失后,别人连接手机可以看到我手机内容吗)

    华为手环丢失后怎样能追踪下落(华为手环丢失后,别人连接手机可以看到我手机内容吗)

  • 三星s9 g9550是什么(三星s9 g9600)

    三星s9 g9550是什么(三星s9 g9600)

  • 打印机碳粉盒卡纸怎么处理(打印机碳粉盒卡住了怎么取出来)

    打印机碳粉盒卡纸怎么处理(打印机碳粉盒卡住了怎么取出来)

  • qq聊天图标都有哪些(qq聊天图标什么意思)

    qq聊天图标都有哪些(qq聊天图标什么意思)

  • 显卡丐版是什么意思(显卡丐版啥意思)

    显卡丐版是什么意思(显卡丐版啥意思)

  • 7p有无线充电功能吗(苹果7p有无线充电)

    7p有无线充电功能吗(苹果7p有无线充电)

  • 充电器一直绿灯好修吗(小刀电动车充电器一直绿灯)

    充电器一直绿灯好修吗(小刀电动车充电器一直绿灯)

  • Linux下为不使用SSH的用户提供SFTP服务环境(linux中不能使用的shell)

    Linux下为不使用SSH的用户提供SFTP服务环境(linux中不能使用的shell)

  • 幼儿园会计需要做什么工作
  • 事业单位长期股权投资持有期间被投资单位
  • 服务费的增值税怎么算
  • 长期待摊费用进项税可以一次性抵扣吗?
  • 应收账款增值税专用发票
  • 公允价值变动税务处理
  • 预收账款缴税的计算公式
  • 小规模纳税人出租房屋增值税税率是多少
  • 展览费怎么开票
  • 酒店更换地毯的请示
  • 非房地产开发企业土地增值税扣除项目
  • 水费能不能开专票
  • 公司什么发票可以入账
  • 期末留抵税额可以冲减欠税吗
  • 如何防止程序被关闭
  • 在标题栏显示完整页面
  • 企业工商年报填错了怎么办
  • win8怎么提高性能
  • mac更新内容
  • 怎么关闭windows defender
  • 股东分配利润如何入账
  • 营改增前甲供材施工企业如何缴纳企业所得税
  • win7无法记忆文件保存路径
  • php imagecopy
  • 收到无法支付的押金收入
  • 含工资表的会计科目
  • php怎么输出文字
  • 附有退回条件的销售商
  • zend framework手册
  • 跨的基本功有哪些
  • 最新人工智能软件chingt
  • Vue(ref和$refs属性介绍与使用)
  • 开发票时有哪些规定呢?
  • 资产减值损失为什么要调增
  • 公司总人数和上社保人数
  • 属于长期险种的是
  • 社保局申报工伤款多久能下
  • mysql 5.7.22安装教程
  • mysql的where语句优化
  • 个人提供劳务增值税专用发票
  • 租赁公司租赁物计入什么会计科目
  • 上缴非税收入的税种
  • 房地产中介公司排名
  • 注会考试模拟机考
  • 小规模开发票免税如何记账?
  • 老板借给公司钱需要交税吗
  • 投资有哪些方面
  • 其他应付款冲账摘要怎么写
  • 跨年的管理费用怎么处理
  • 转账手续费怎么入账
  • 原材料会计科目
  • 错误原始凭证怎么写
  • 明细分类账的建账
  • mysql密码总是输入错误
  • 如何在ubuntu下安装和配置gcc并用C语言
  • fedora怎么用
  • 三星笔记本预装win8改win7好吗
  • 硬盘装pe怎么启动
  • win8启用或关闭windows功能
  • mac快速操作在哪
  • xp直升win7
  • mac使用磁盘工具的快捷键
  • win10如何彻底关掉自动锁屏
  • win7声音方案下载
  • Linux中通过Socket文件描述符寻找连接状态介绍
  • win7系统玩英雄联盟蓝屏
  • javascript中的函数
  • 安卓里面怎么调用方法
  • js 图像
  • js限制输入字符长度
  • Node.js+ES6+dropload.js实现移动端下拉加载实例
  • javascript基础入门视频教程
  • javascript字符
  • unity最新教程
  • 深入python3
  • 所得税季度报表收入成本怎么填
  • 四川税务局发票下载
  • 小规模国税申报表填写方法
  • 就业核查怎么核查
  • 小店区税务大厅
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设