位置: 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 预览版发布(附更新修复内容汇总)

  • 拼多多上门取件退货要付运费吗(拼多多上门取件是哪个快递公司)

    拼多多上门取件退货要付运费吗(拼多多上门取件是哪个快递公司)

  • 小米10采用的是什么处理器(小米10是sa)

    小米10采用的是什么处理器(小米10是sa)

  • 闲鱼发货点错无需寄件了(闲鱼点错已发货怎么办)

    闲鱼发货点错无需寄件了(闲鱼点错已发货怎么办)

  • 钉钉常用联系人是好友吗(钉钉常用联系人删除后又出现)

    钉钉常用联系人是好友吗(钉钉常用联系人删除后又出现)

  • 苹果电池多久掉百分之一(苹果电池多久掉到80%)

    苹果电池多久掉百分之一(苹果电池多久掉到80%)

  • 电池2032和2025区别(电池2032和2025什么区别)

    电池2032和2025区别(电池2032和2025什么区别)

  • 抖音实名认证跟播放量有关吗(抖音实名认证跟银行卡要一致吗)

    抖音实名认证跟播放量有关吗(抖音实名认证跟银行卡要一致吗)

  • 如何恢复抖音聊天记录(如何恢复抖音聊天内容)

    如何恢复抖音聊天记录(如何恢复抖音聊天内容)

  • 华为nova6手机发烫怎么回事(华为nova6手机发热正常吗)

    华为nova6手机发烫怎么回事(华为nova6手机发热正常吗)

  • 3d深感镜头有什么用(3d深感镜头有什么特点)

    3d深感镜头有什么用(3d深感镜头有什么特点)

  • beats耳机怎么开机(beats耳机怎么开启降噪)

    beats耳机怎么开机(beats耳机怎么开启降噪)

  • soul怎么找通讯录好友

    soul怎么找通讯录好友

  • vivo高清通话怎么设置(vivo高清通话怎么设置不了)

    vivo高清通话怎么设置(vivo高清通话怎么设置不了)

  • a57桌面插件怎么添加(桌面插件在哪里打开)

    a57桌面插件怎么添加(桌面插件在哪里打开)

  • 淘宝卖家违规多久清零(淘宝卖家违规行为有哪些)

    淘宝卖家违规多久清零(淘宝卖家违规行为有哪些)

  • 已隐藏相册在哪里找到(已隐藏的相册怎么打开)

    已隐藏相册在哪里找到(已隐藏的相册怎么打开)

  • 华为和vivo怎么互传(华为和vivo怎么共享屏幕)

    华为和vivo怎么互传(华为和vivo怎么共享屏幕)

  • 小米mce16是什么型号(小米mce16是什么型号图片)

    小米mce16是什么型号(小米mce16是什么型号图片)

  • 华为plk一al10什么型号(华为手机plkal10什么型号)

    华为plk一al10什么型号(华为手机plkal10什么型号)

  • excel迭代(excel迭代计算什么意思)

    excel迭代(excel迭代计算什么意思)

  • 为什么搜索手机号找不到微信(为什么搜索手机号搜不到微信)

    为什么搜索手机号找不到微信(为什么搜索手机号搜不到微信)

  • 唯品会收货地址在哪里改(唯品会收货地址怎么填)

    唯品会收货地址在哪里改(唯品会收货地址怎么填)

  • Windows Server 2003 SP2 企业安装版 Y1.0下载(windowsserver2003设置用户密码)

    Windows Server 2003 SP2 企业安装版 Y1.0下载(windowsserver2003设置用户密码)

  • 【小程序从0到1】小程序常用组件一览(小程序从入门到精通)

    【小程序从0到1】小程序常用组件一览(小程序从入门到精通)

  • 什么是富人税收政策
  • 专票地址有误可以用吗
  • 小规模开普票一个季度不能超过多少钱是免税的
  • 代收款有手续费怎么做账
  • 在公司交社保不满十年,女性按照什么退税
  • 蓝字发票有认证的吗
  • 单位买绿植可以报销吗
  • 带清单的发票怎么贴原始凭证
  • 个体工商户取得经营所得的个人自行申报缴纳个人所得税
  • 买卖金融商品应交增值税计算
  • 企业房产税怎么申报缴纳
  • 百度推广服务费一年多少钱
  • 免税农产品如何填报企业所得税季报
  • 企业接受基金投资的规定
  • 一般纳税人为什么要开专票
  • 发票复印件能报账吗
  • 外贸企业当期认证的发票没申报影响退税吗?
  • 案例分析:如何缓解幼儿在幼儿园的焦虑情绪
  • 制造费用包括劳动保护费吗
  • 应收账款待确认收入
  • 地方教育附加可以在企业所得税前扣除吗
  • 非营利组织免税收入孳生的银行存款利息
  • 个体户对私账户
  • 库存商品入库的会计科目
  • linux系统安装浏览器
  • 连续亏损的公司还要去吗
  • 怎么重装电脑xp
  • 异常发票怎么处理
  • 按揭贷款到账时间
  • 今日立冬祝福语大全
  • php操作redis
  • 排灯节起源
  • 孚日山脉猞猁
  • 还贷款利息会计怎么做账
  • 无票收入需要开票吗
  • 分享项目成果
  • vue 动态组件
  • 订单超时十分钟
  • python如何导入excel
  • 应付职工薪酬如何记账
  • 企业一直亏损老板也赚钱
  • 平价转让股权怎么交企业所得税
  • 查询公司对公账户
  • 分公司以总公司名义
  • web cms漏洞
  • 前年度多交附加税怎么交
  • 待抵扣进项税额转出会计分录
  • 揭秘蒙娜丽莎25恐怖之处
  • 公司注销后实收资本要交税吗
  • 应付职工薪酬借方表示什么
  • 临时工工资怎么报个税
  • 暂估入库价格是否含税
  • 缴增值税的账务处理
  • 存货盘点的方法有哪些
  • 违约金从货款中扣除如何记账
  • 人工费怎么核算
  • 银行余额调节表电子版
  • 民营企业固定资产管理规定
  • 获取linux系统版本
  • centos 7 安装vnc
  • 删除 ubuntu
  • Win10预览版拆弹
  • win7系统还能用不
  • win10声卡驱动正常但没声音怎么解决
  • 微软宣布
  • linux在网络方面的应用
  • win8功能大全介绍
  • 实例的英文
  • excel表格文本形式在哪里
  • JAVA的OPENGL,JOGL入门实例----碰撞移动的正方体 (配置+源代码)
  • android 基础
  • jq倒计时代码
  • 安卓hid通信
  • shell终端是什么意思
  • 刮刮奖软件下载
  • jquery遍历对象使用的方法
  • jquery easyui开发指南
  • 地下车库是否缴房产税
  • 无锡市高新区税务局张贤平
  • 每辆车车船税都一样吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设