NeRF代码学习

2023-11-01

学习nerf_pytorch项目代码,以及pytorch_lighting形式代码,

首先需要读取数据,将数据输入神经网络进行训练(包括生成编码、生成光线、计算密度颜色、体渲染步骤),将数据输出

1、数据集读取

代码中给出的样例,是读取Blender Lego数据集,三种数据形式读取得到的结果都是相同的,所以这里介绍load_llff.py
关于坐标转换等问题,参考该链接

COLMAP到LLFF数据格式
imgs2poses.py该函数的作用:
1、调用colmap软件估计相机的参数,在sparse/0/文件夹下生成一些二进制文件:cameras.bin, images.bin, points3D.bin, project.ini。
2、读取上一步得到的二进制文件,保存成一个poses_bounds.npy文件。

poses_bounds.npy文件保存相机位姿信息,N×17的矩阵,前面15个参数可以重排成3x5的矩阵形式:左边3x3矩阵是c2w的旋转矩阵R,第四列是c2w的平移向量T,前四列相当于相机外参;第五列分别是图像的高H、宽W和相机的焦距f(相机内参)(这部分是前15个参数)
在这里插入图片描述
在这里插入图片描述
上图的两行代码,将相机外参和相机内参提取了出来: poses_arr[:, :-2]代表取前15列,为一个(N,15)的array,reshape([-1, 3, 5])代表将(N,15)的array转换为(N,3,5)的array,N张图片,3行5列的矩阵,transpose([1,2,0])则是将array的坐标系调换顺序,得到[3,5,N]的矩阵,代表了N张图片的相机外参poses
在这里插入图片描述
上图代码中,poses_arr[:, -2:].transpose([1,0])则是先提取poses_arr的后两列数据(N,2),然后将0,1坐标系对调,得到(2,N)shape的array:bds,bds指的是bounds深度范围,也就是输入网络时给定的near,far(采样区间)17个参数中的最后两个参数
代码中有图片下采样,并更新w,h,焦距的操作,接着读取图片,images 是 (N,w,h,channel) 分别对应(图片张数、高、宽、通道)
在这里插入图片描述
这里还提供了其他一些操作:相机坐标系的转换、获构造相机矩阵、图像缩放、获得平均位姿、中心化相机位姿、生成相机轨迹用于视角合成,这部分学习刚才的链接,这里就不详细介绍。
数据集读取得到的是,经过下采样缩放的范围,焦距,经过重新中心化的相机位姿,并获得render_poses,渲染位姿,i_test为一个索引数字
images (图片数,高,宽,3通道), poses (图片数,3通道,5) ,bds (图片数,2) render_poses(N_views,3,5),i_test为一个索引数字:[[0:train], [train:val], [val:test]]

2、构建NeRF网络

run_nerf.py

首先从train()函数开始,
1、获得超参数config_parser()
2、读取数据llff、blender,获得第一步返回的图像、位姿、范围、渲染位姿、测试集
3、create_nerf生成网络
4、生成批处理光线get_rays_np
5、渲染得到像素颜色 render
6、计算loss,反向传播

具体流程图如下
在这里插入图片描述
流程图这里还参考了该链接

Step 1:调用get _rays()函数,根据光线的ray_d计算单位方向作为view_dirs
Step 2:生成光线的远近端,用于确定边界框,并将其聚合到rays中(获得光线的ray_o.ray_d、near、
far、viewdirs)
Step 3:并行计算ray的属性(通过调用batchify_rays(函数)
Step 4:batchify_rays()再调用render_rays()函数进行后续渲染
Step 5:render_rays()的pts属性保存每个采样点的位置
Step 6:将点投入网络,得到RGB与σ
Step 7:render_rays()调用raw2outputs()函数进行离散点的积分操作(体素渲染)
Step 8:将{ 'rgb_map’ : rgb_map, 'disp_map’ : disp_map,'acc_map : acc_ map}属性返回到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,  # 归一化密度在这里插入代码片

代码解释参考链接

run_nerf_helpers.py

class Embedder:输入高频参数 生成位置编码器embed
class NeRF:创建model,alpha输出的是密度,rgb是颜色,一个batch是1024个光束,也就是一个光束采样64个点
get_rays_np():获得光束
ndc_rays():把光线的原点移动到near平面
sample_pdf():分层采样,得到精细网络的采样点

pytorch_lighting中生成color_mesh

https://github.com/kwea123/nerf_pl
使用 pytorch ( pytorch-lightning ) 的NeRF 的非官方实现,提供一个更简单、更快的训练过程(还有更简单的代码和详细的注释以帮助理解工作)
视频链接
extract_color_mesh.py:实现了通过隐式表示(三维空间中点的颜色与密度)转换为可视化的网格或点云

首先将物体划到一个正立方体里(volume),划分整个3D空间为一个一个的小立方体(可以看成体素)

输入每个小立方体的坐标,通过NeRF网络,可以返回密度,来表示这个小方块里是否占据物体,
1、预测占据值(occupancy)判断哪些位置被物体占据
2、使用Marching Cubes算法,可以得到mesh的顶点,得到三角网格(网格是由三角形和三角形上的顶点组成的)
关于Marching Cubes的算法介绍:
https://blog.csdn.net/weixin_38060850/article/details/109143025
3、去除噪声点,去掉网格中比较零散的连接三角形的点,保留最大的一团(一簇)
4、添加颜色

颜色这里,计算的是顶点的颜色而不是三角形的颜色,把这个顶点投射到训练图像上,得到它的RGB值,然后用这些值的平均值作为它的最终颜色。
在这里插入图片描述

但是 会出现被遮挡的部分也被上色成前面的颜色,如下图
在这里插入图片描述
原因是,在正对着玩偶拍照时,披风这部分属于被遮挡,但是这里的点投影回图像上时,得到的rgb是人脸的rgb(图像成像存在遮挡情况,只拍出了人脸),所以得到的颜色也是人脸的颜色就出现了问题。需要解决的问题就变成了如何判断该顶点在一个图像中是被遮挡不可见的,如果他在这个角度不可见,就不赋予该点颜色。
解决的方法又用到了NeRF的体密度,从相机原点出发,形成射线,以顶点为终点,并计算沿这些射线的总密度(σ图像积分)。如果一个顶点没有被遮挡,积分得到的不透明度(体密度)就会很小;否则,数值就会很大,这意味着顶点和摄像机之间存在着某种东西(被遮挡),被遮挡不会上色。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NeRF代码学习 的相关文章

  • 计算机组成原理综合1

    1 完整的 计算机系统 应包括 D A 运算器 存储器和控制器 B 外部设备和主机 C 主机和实用程序 D 配套的硬件设备和软件系统 2 计算机系统中的存储器系统是指 D A RAM存储器 B ROM存储器 C 主存储器 D 主存储器和外存
  • 学习使用layPage, 多功能JS分页组件/插件的方法

    学习使用layPage 多功能JS分页组件 插件的方法 效果图 分页代码 效果图 点击查看链接 分页代码
  • GHM-XGBOOST模型的学习和理解

    Gradient Harmonized Margins GHM GHM 是一种损失函数 主要用于解决类别不平衡问题 GHM 损失函数能够关注较难的样本 对于容易的样本降低权重 从而在训练过程中更好地平衡了损失 这有助于提高模型对于少数类别的
  • web前端学习怎么能快速入门

    Web前端开发是一个热门的职业领域 很多人都希望能够快速入门并掌握相关技能 下面将从制定学习计划 项目实战案例练习 以用为学 与培训班老师多交流 自主学习能力的培训等5个方面详细介绍如何在web前端培训班学习 1 制定web前端学习计划 在
  • 培训学习大数据知识有哪些方法

    学习大数据知识是当前非常热门的话题 随着大数据技术的不断发展 越来越多的人开始关注并学习大数据知识 在大数据培训班学习大数据知识是一个非常好的选择 下面我将从制定大数据学习计划 项目实战案例练习 以用为学 与培训班老师多交流等四个方面来详细
  • 运维的本质是什么?阿里“无人化”智能运维平台的演进

    差不多在两年前 阿里内部出现了很多运维中台 研发中台等等 那有没有后台呢 不好意思 我们只有中台 没有后台 会在中台上构建与业务相关的各个前台 目前阿里的业务几乎覆盖了所有行业 有着很多业务线 如果业务线的前台到中台全部都是我们自己去建设
  • css学习之路:sass学习基础篇

    SCSS 一 动态的样式语言 让CSS有变量的概念 css有很多的缺点 语法不够强大 没有变量和合理的样式复用机制 导致难以维护 我们就可以使用动态样式语言 赋予CSS新的特性 常见的动态样式语言 scss sass scss兼容sass
  • CSS学习之路: 基础学习篇

    css基础 一 css3 概述 1 1 什么是css Cascading style sheets 层叠样式表 级联样式表 简称样式表 1 2 css作用 对页面中html元素进行美化 1 3 HTML和css的关系 HTML 负责页面结构
  • 【深度学习:(Contrastive Learning) 对比学习】深入浅出讲解对比学习

    对比学习允许模型从未标记的数据中提取有意义的表示 通过利用相似性和不相似性 对比学习使模型能够在潜在空间中将相似的实例紧密地映射在一起 同时将那些不同的实例分开 这种方法已被证明在计算机视觉 自然语言处理 NLP 和强化学习等不同领域都是有
  • 在职状态下继续学习的心得体会

    本来平时记录的都是一些技术点的学习和使用 今天打算记录一下学习方法 当然不一定适合所有人 因人而异 仅供参考 学习这件事 对于IT行业来说 真的是活到老学到老 技术的更新迭代速度非常快 而且总是有那么一些公司特别的卷 没办法 改变不了外因
  • The Planets:Venus

    靶场下载 The Planets Venus VulnHub 信息收集 arp scan l Interface eth0 type EN10MB MAC 00 0c 29 43 7c b1 IPv4 192 168 1 60 Starti
  • 【CTF必看】从零开始的CTF学习路线(超详细),让你从小白进阶成大神!

    最近很多朋友在后台私信我 问应该怎么入门CTF 个人认为入门CTF之前大家应该先了解到底 什么是CTF 而你 学CTF的目的又到底是什么 其次便是最好具备相应的编程能力 若是完全不具备这些能力极有可能直接被劝退 毕竟比赛的时候动不动写个脚本
  • SRC漏洞挖掘经验+技巧篇

    一 漏洞挖掘的前期 信息收集 虽然是前期 但是却是我认为最重要的一部分 很多人挖洞的时候说不知道如何入手 其实挖洞就是信息收集 常规owasp top 10 逻辑漏洞 重要的可能就是思路猥琐一点 这些漏洞的测试方法本身不是特别复杂 一般混迹
  • 2024年网络安全十10大发展趋势发布

    2023年网络安全十10大发展趋势发布 近日 中国计算机学会 CCF 计算机安全专委会中 来自国家网络安全主管部门 高校 科研院所 大型央企 民营企业的委员投票评选出2023年网络安全十大发展趋势 福利 趋势一 数据安全治理成为数字经济的基
  • 白帽子如何快速挖到人生的第一个漏洞 | 购物站点挖掘商城漏洞

    本文针对人群 很多朋友们接触安全都是通过书籍 网上流传的PDF 亦或是通过论坛里的文章 但可能经过了这样一段时间的学习 了解了一些常见漏洞的原理之后 对于漏洞挖掘还不是很清楚 甚至不明白如何下手 可能你通过 sql labs 初步掌握了sq
  • 2024年金三银四网络安全考试试题

    2023年金三银四网络安全考试试题 1 关于数据使用说法错误的是 A 在知识分享 案例中如涉及客户网络数据 应取敏感化 不得直接使用 B 在公开场合 公共媒体等谈论 传播或发布客户网络中的数据 需获得客户书面授权或取敏感化 公开渠道获得的除
  • 网络安全(黑客)自学

    1 网络安全是什么 网络安全可以基于攻击和防御视角来分类 我们经常听到的 红队 渗透测试 等就是研究攻击技术 而 蓝队 安全运营 安全运维 则研究防御技术 2 网络安全市场 一 是市场需求量高 二 则是发展相对成熟入门比较容易 3 所需要的
  • 【js学习之路】遍历数组api之 `filter `和 `map`的区别

    一 前言 数组是我们在项目中经常使用的数据类型 今天我们主要简述作用于遍历数组的api filter 和 map 的区别 二 filter和map的共同点 首先 我们主要阐述一下 filter 和 map 的共同点 api的参数都是回调函数
  • 项目文章 | IF=8.4&转录因子Egr-1是脑膜炎型大肠杆菌引起的血脑屏障损伤的关键调节因子

    2024年1月17日华中农业大学动科动医学院陈焕春院士 王湘如教授团队在期刊 Cell Communication and Signaling IF 8 4 发表了题为 Egr 1 is a key regulator of the blo
  • 【学习分享】全志平台TWI子系统源码分析(1)从设备树到寄存器

    全志平台TWI子系统源码分析 1 从设备树到寄存器 前言 一 名词解释 二 从设备树入手看源码 1 TWI设备树 2 TWI源码位置 3 TWI总线相关寄存器 总结 前言 这次开坑主要是想把全志平台TWI子系统在源

随机推荐

  • 自定义限制接口访问次数(ExpiringMap)

    ExpiringMap简介 它具有高性能 低开销 零依赖 线程安全 使用ConcurrentMa的实现过期entries等优点 主要特点包括 过期策略 可变有效期 最大尺寸 侦听器过期 延迟输入加载 过期自省 可设置Map中的Entry在一
  • python opencv旋转,Python OpenCV cv2.rotate()用法及代码示例

    OpenCV Python是旨在解决计算机视觉问题的Python绑定库 cv2 rotate 方法用于将2D数组旋转90度的倍数 函数cv rotate以三种不同的方式旋转数组 用法 cv2 cv rotate src rotateCode
  • Pandas 三大对象

    1 pandas的Series对象 pandas的Series对象是一个带索引数据构成的一维数组 可以用一个数组创建Series对象 import pandas as pd data pd Series 0 25 0 5 0 75 1 0
  • 为你的嵌入式设计选择合适的低功耗处理器

    在早期 获得低功耗的CPU通常意味着牺牲功能 以降低的时钟速度运行或等待新的低功耗处理技术以降低待机 和有功功耗 无论如何 情况已不再如此 并且处理器领域已经发生了戏剧性的变化 随着处理技术的进步以及创新的芯片设计和高粒度电源管理软件 带来
  • Python2.7.16安装(Ubuntu16.04)

    Python2 7 16安装 Ubuntu16 04 前面的文章已经介绍了在Windows上安装Python2和Python3了 现在介绍Linux系统上的安装 Ubuntu16 04上默认安装了Python2 7和Python3 5 Re
  • HTML 文件中引入高德地图

    准备工作 1 在高德开放平台 注册开发者账号 2 登陆之后 进入 应用管理 点击 我的应用 选择右上角 创建新应用 3 为应用添加 Key 在 服务平台 一项选择 Web 端 JSAPI 页面实现 1 创建一个div 作为地图的容器 2 设
  • Week2:包含 min 函数的栈

    1 题目描述 定义栈的数据结构 请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中 调用 min push 及 pop 的时间复杂度都是 O 1 示例 MinStack minStack new MinStack minSta
  • Vue下OpenLayers中Style-Icon的图片路径

    OpenLayers加载图片的方式 1 使用 require 方式加载图片 图片路径 根目录 src assets let styles icon new Style image new Icon anchor 0 5 1 src requ
  • 解决阿里云无法正常使用samba的问题

    昨天在阿里云上申请了一个云服务器 系统用的是ubuntu14 04 由于是免费的 初次使用 配置较低 单核1G内存 40G硬盘 所以在服务器上不方便安装图形界面 默认的系统镜像是没有桌面系统的 毕竟只是服务器 没有图形界面总觉得不是很方便
  • TensorFlow2.0学习笔记-3.模型训练

    3 模型训练 3 1 Keras版本模型训练 构建模型 顺序模型 函数式模型 子类模型 模型训练 model fit 模型验证 model evaluate 模型预测 model predict 使用样本加权和类别加权 回调函数 Model
  • 二叉树树叶与度为2的节点数关系论证

    如果二叉树树叶总数为n0 度为2的节点总数为n2 那么有n0 n2 1 下面论证这一关系 假设树叶总数为0 度为1的节点总数为n1 度为二的节点总数为n2 那么二叉树总结点数n满足以下关系 n n0 n1 n2 另一方面 除根节点以外的所有
  • CentOS下7zip包的解压、压缩方法

    1 安装7z 1 直接安装 yum install p7zip 2 源代码下载编译 wget http sourceforge net projects p7zip 9 13 p7zip 9 13 src all tar bz2 downl
  • ESP32通过UART串口使用AT指令

    ESP32通过UART串口使用AT指令 MCU起航 mcublog cn ESP32通过UART串口使用AT指令 MCU起航 mcublog cn
  • Unity基于NGUI点击事件向下传递的解决方法

    Unity开发中经常有点击Button 弹窗提示界面 然后点击任意区域关闭提示界面并且提示界面下一层的事件依然可以触发 需要点击事件向下传递 UGUI对此支持相对好处理 NGUI本身对此支持不好 这里提供一个方法 public class
  • 使用IDM下载视频出现“由于法律原因,IDM无法下载...

    一 问题描述 由于法律原因 IDM无法下载 如图 二 原因分析 下载该IDM抓取的M3U8文件 查看其中的内容发现 EXT X KEY 字段已经写明了加密方式是AES 128 包含一个URI和IV值 EXTM3U EXT X VERSION
  • SQL批处理

    转载自http www cnblogs com kissdodog archive 2013 06 30 3163880 html 批处理简介 批处理是作为一个逻辑单元的T SQL语句 如果一条语句不能通过语法分析 那么不会运行任何语句 如
  • docker超快速安装redis(以配置文件启动)附上几个坑

    docker超快速安装redis 以配置文件启动 附上几个坑 1 下载好Xshell和Xftp 下载地址 只需要填写一个真实邮箱即可 2 创建目录 在user下 在别的目录需要管理员权限 选择用户下面的一个文件 创建redis文件夹 再创建
  • The Ultimate Guide to Python Type Checking

    In this guide you will get a look into Python type checking Traditionally types have been handled by the Python interpre
  • 物联网 单片机 嵌入式毕业设计题目 - 350例

    文章目录 1前言 2 如何选题 2 1 不要给自己挖坑 2 2 难度把控 2 3 如何命名题目 3 单片机 嵌入式 选题大全 3 1 嵌入式方向 3 2 算法方向 3 3 移动通信方向 3 4 学长作品展示 最后 1前言 近期不少学弟学妹询
  • NeRF代码学习

    学习nerf pytorch项目代码 以及pytorch lighting形式代码 首先需要读取数据 将数据输入神经网络进行训练 包括生成编码 生成光线 计算密度颜色 体渲染步骤 将数据输出 1 数据集读取 代码中给出的样例 是读取Blen