# 【三维重建】【深度学习】NeRF代码Pytorch实现--数据加载(中)

news/2024/4/19 17:17:03/

【三维重建】【深度学习】NeRF代码Pytorch实现–数据加载(中)

论文提出了一种5D的神经辐射场来作为复杂场景的隐式表示,称为NeRF,其输⼊稀疏的多⻆度带pose的图像训练得到⼀个神经辐射场模型。简单来说就是通过输入同一场景不同视角下的二维图片和相机位姿,对场景进行三维隐式建模,并通过体素渲染方程实现了合成任意新视角下的场景图片。本篇博文将根据代码执行流程解析数据加载过程中具体的功能模块代码。


文章目录

  • 【三维重建】【深度学习】NeRF代码Pytorch实现--数据加载(中)
  • 前言
  • load_llff_data
  • spherify_poses
  • 总结


前言

在详细解析NeuS网络之前,首要任务是搭建NeRF【win10下参考教程】所需的运行环境,并完成模型的训练和测试,展开后续工作才有意义。
本博文是对NeuS数据加载过程中涉及的部分功能代码模块进行解析,其他代码模块后续的博文将会陆续讲解。

博主将各功能模块的代码在不同的博文中进行了详细的解析,点击【win10下参考教程】,博文的目录链接放在前言部分。


load_llff_data

load_llff_data在load_llff.py文件内,由于内容太多,博主将这个函数的代码分段进行讲解,本博文将继续讲解load_llff_data函数的后续代码。

# 用于将相机分布限制在固定球体内并返回一个环绕的相机轨迹位姿用于新视角合成。
if spherify:poses, render_poses, bds = spherify_poses(poses, bds)

spherify_poses

spherify_poses在load_llff.py文件内,函数代码比较简洁,但内容比较丰富,理解存在难度(博主个人觉得),比较难理清每行代码乃至每个变量表达的含义和目的,因此博主将函数代码拆分成几段分别讲解,懂得可以快速过。

  • min_line_dist找到离所有相机中心射线距离之和最短的点,博主找遍了现有网络公开资料也没有发现其具体的原理支持,有知道的朋友可以再评论区留言。
# 让位姿[3×4]变为[4×4]
p34_to_44 = lambda p : np.concatenate([p, np.tile(np.reshape(np.eye(4)[-1, :], [1, 1, 4]), [p.shape[0], 1, 1])], 1)
# 位姿的旋转矩阵R的第三列(z轴相关) 方向向量
rays_d = poses[:, :3, 2:3]  # [N,3,1]
# 位姿的平移矩阵t  相机光心
rays_o = poses[:, :3, 3:4]  # [N,3,1]# 找到离所有相机中心射线距离之和最短的点
def min_line_dist(rays_o, rays_d):A_i = np.eye(3) - rays_d * np.transpose(rays_d, [0,2,1])    # [N,3,3]b_i = -A_i @ rays_o         # [N,3,1]pt_mindist = np.squeeze(-np.linalg.inv((np.transpose(A_i, [0,2,1]) @ A_i).mean(0)) @ (b_i).mean(0))  # [N,3]return pt_mindist# 简单理解为场景的中心位置
pt_mindist = min_line_dist(rays_o, rays_d)      # [3]
center = pt_mindist

代码的示意图如下图所示:

  • c2w用于中心化相机位姿,这段代码的功能类似于上篇博文的recenter_poses方法,这里不再赘述。
# 所有相机光心到场景中心的方向向量的平均距离向量(xyz轴上)
up = (poses[:, :3, 3] - center).mean(0)     # [3]
# 归一化:平均单位向量
vec0 = normalize(up)    # [3]
# 找到俩俩垂直的单位方向向量
vec1 = normalize(np.cross([.1,.2,.3], vec0))    # [3]
vec2 = normalize(np.cross(vec0, vec1))             # [3]
pos = center
# 构建坐标系
c2w = np.stack([vec1, vec2, vec0, pos], 1)  # [3,4]
# 求c2w的逆矩阵,并与poses进行矩阵运算,目的是完成所有相机位姿的归一化
poses_reset = np.linalg.inv(p34_to_44(c2w[None])) @ p34_to_44(poses[:, :3, :4])      # [N,4,4]

代码的示意图如下图所示:

  • 将所有相机的位置缩放到单位圆内。
# 理解为归一化后所有光心距离的平均
rad = np.sqrt(np.mean(np.sum(np.square(poses_reset[:, :3, 3]), -1)))
# 缩放因子
sc = 1./rad
# 缩放光心
poses_reset[:, :3, 3] *= sc
# 缩放边界
bds *= sc
# 归一化
rad *= sc

代码的示意图如下图所示:

  • 生成新视角的相机位姿。
# 平均光心位置
centroid = np.mean(poses_reset[:, :3, 3], 0)        # [3]
zh = centroid[2]            # 平均光心z轴距离
radcircle = np.sqrt(rad**2-zh**2)
new_poses = []
for th in np.linspace(0., 2.*np.pi, 120):camorigin = np.array([radcircle * np.cos(th), radcircle * np.sin(th), zh])up = np.array([0, 0, -1.])vec2 = normalize(camorigin)# 构建坐标系vec0 = normalize(np.cross(vec2, up))vec1 = normalize(np.cross(vec2, vec0))pos = camoriginp = np.stack([vec0, vec1, vec2, pos], 1)       # [3,4]new_poses.append(p)# 新视角:拼接在一起
new_poses = np.stack(new_poses, 0)      # [num,3,4]
# [num,3,5] 新视角位姿都拼接了原始位姿的起始位姿
new_poses = np.concatenate([new_poses, np.broadcast_to(poses[0, :3, -1:], new_poses[:, :3, -1:].shape)], -1)
# [num,3,5] 旋转平移后的新位姿都拼接了原始位姿的起始位姿
poses_reset = np.concatenate([poses_reset[:, :3, :4], np.broadcast_to(poses[0, :3, -1:], poses_reset[:, :3, -1:].shape)], -1)   

代码的示意图如下图所示:

左图是xy平面的视角,对于生成的新视角的相机光心的位置camorigin,z的大小是固定的zh,x和y则在半径为radcircle 的圆上;右图是世界坐标系下的视角,右图中列举了四个点,分别对应左图中在坐标轴上的四个点,并计算出这四个点位姿。

其他点画图表示太难了,读者领会精神即可


总结

尽可能简单、详细的介绍数据加载过程中部分代码:spherify_poses球面化相机分布并获取环绕相机位姿。后续会讲解其他功能模块的代码。


http://www.ppmy.cn/news/1068873.html

相关文章

前端开发工程师有哪些细分领域?

前端开发工程师有哪些细分领域? 1. 用户界面(UI:User Interface)设计:专注于设计用户交互的界面,要有良好的审美和用户体验思维。1. 视觉设计2. 交互设计3. 一致性4. 响应式设计5. 原型与线框图6. 用户体验…

C语言数值表示——进制、数值存储方式

进制 进制也就是进位制,是人们规定的一种进位方法对于任何一种进制—X进制,就表示某一位置上的数运算时是逢X进一位 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位…

利用python进行键盘模拟输入

记一次利用python模拟键盘输入,由于键盘中英文切换较为麻烦,所以写了两个小程序分别进行英文字符模拟或中文字符模拟。 #用于键盘英文字符输入模拟 import pyautogui import timedef simulate_typing(text):# Give some time to switch to the desired …

AD画PCB时设置的中文丝印乱码

AD画PCB时设置的中文丝印乱码怎么解决? 画好PCB后通常会加一些没有电气属性的丝印或者板号,有时用英文有时用中文,通常用英文或者数字都能直接显示,但是用中文时显示的就是乱码;因为字符串放置好后默认的字体是“比划…

【嘉立创EDA】焊接辅助图纸制作

文章路标👉 文章解决问题主题内容拙见与拓展文章解决问题 1️⃣ 嘉立创EDA专业版在较新的版本中(如版本 : V2.1.17)中支持了焊接辅助工具功能,在这个功能中,包含了位号与PCB的对应索引(分位号聚合排序与不聚合排序两种序列方法),可以索引到对应的3D仿真图,或者简图(…

URL(统一资源定位符)

2023年8月28日,周一上午 目录 概述URL的组成举例说明示例CSDN官网我的博客《极简Vim教程》在百度搜索CSDN相关资料 概述 URL(统一资源定位符)是用于标识和定位互联网上的资源的字符串。 它是一种标准化的格式,由多个组成部分构…

好用的网页制作工具就是这6个,快点来看!

对于网页设计师来说,好用的网页设计工具是非常重要的,今天本文收集了6个好用的网页设计工具供设计师自由挑选使用。在这6个好用的网页设计工具的帮助下,设计师将获得更高的工作效率和更精致的网页设计效果,接下来,就一…

2023最新官网下载安装配置JDK8(1.8u381)的详细步骤

目录 前言 一、下载 二、安装 三、配置环境变量 四、查看 前言 JDK11版本:官网下载JAVA的JDK11版本(下载、安装、配置环境变量)_java11下载_云边的快乐猫的博客-CSDN博客JDK17版本: Java官网下载JDK17版本详细教程&#xff…

计算机网络MTU和MSS的区别

在计算机网络中,MTU代表最大传输单元(Maximum Transmission Unit),而MSS代表最大分节大小(Maximum Segment Size)。 1.MTU(最大传输单元): MTU是指在网络通信中&#x…

用于视频 4K 渲染和编辑的最佳 GPU,适用于高端预算

如果本地渲染和编辑电脑配置不够,如何最节省成本和时间解决: 本地普通电脑连接到赞奇云工作站,秒变超算机,根据需求选择合适的配置,不仅仅能提升渲染速度,还能提升软件的运行速率。 通过云工作站、软件中…

【PCL (Point Cloud Library)可视化点云的工具汇总】

PCL (Point Cloud Library)可视化点云的工具 PCL (Point Cloud Library) 提供了一系列的工具和类用于点云的可视化。以下是其中的一些主要工具和功能: pcl::visualization::CloudViewer: 如前所述,这是一个简单易用的可视化工具,主要用于基本的点云显示。pcl::visualizatio…

38. 连续签到领金币数

文章目录 题目需求思路一实现一题目来源 题目需求 用户每天签到可以领1金币,并可以累计签到天数,连续签到的第3、7天分别可以额外领2和6金币。 每连续签到7天重新累积签到天数。 从用户登录明细表中求出每个用户金币总数,并按照金币总数倒…

VS Code内存占用过高 - 解决方案

前言 使用VS Code时,其占用的内存可能会急剧增加,从而增加计算机内存的压力,下文介绍如何减少VS Code的内存占用。 通过此方案,本人从3G的内存占用降到了700M的内存占用。 解决方案 打开VS Code的设置,如下图&…

平衡二叉树及其应用详解

平衡二叉树 定义与性质 平衡二叉树(Balanced Binary Tree)是计算机科学中的一种数据结构,它是二叉排序树的一种特殊情况。 平衡二叉树满足以下性质: 左子树和右子树的高度差不超过 1。也就是说,对于任意节点&#…

MySQL索引,事务和存储引擎

一、索引 1、索引的概念 ●索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址(类似于C语言的链表通过指针指向数据记录的内存地址)。 ●使用索引后可以不用扫描全表来定位某行的数据,而是先…

[Unity] 单例设计模式, 可供继承的单例组件模板类

一个可供继承的单例组件模板类: public class SingletonComponent<TComponent> : Componentwhere TComponent : SingletonComponent<TComponent> {static TComponent _instance;private static TComponent GetOrFindOrCreateComponent(){// 双检索if (_instance …

mysql通过.frm和.ibd 文件恢复数据库

问题背景&#xff1a;由于强制在服务关闭mysql导致部分数据表以及数据丢失 如下图只有.frm .ibd的文件为我的问题文件 查找不到表结构和表数据目录D:XXXX\mysql-5.7.24-winx64\data\mydata 从frm文件中恢复表结构 先把原来的数据备份一次 避免过程中出错 先备份之前数据的.fr…

揭秘视频号创收计划:松松一个月赚1300+

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 这是卢松松一个月视频号的收益&#xff0c;1300元。自从视频号在五月份推出创作者分成计划以来&#xff0c;许许多多的视频号创作者开始获得了一些收益&#xff0c;这绝对是一项挺不错的进展。 目前…

数字化智能工厂信息化系统集成整合规划建设方案[150页word]

导读&#xff1a;原文《150页6万字数字化智能工厂信息化系统集成整合规划建设方案》&#xff08;获取来源见文尾&#xff09;&#xff0c;本文精选其中精华及架构部分&#xff0c;逻辑清晰、内容完整&#xff0c;为快速形成售前方案提供参考。 数字化智能工厂建设方案 设备智…

电脑提示由于找不到xinput1_3.dll,无法继续执行代码有什么好的解决办法

最近又遇到了玩游戏时提示找不到xinput1_3.dll&#xff0c;无法继续执行代码了&#xff0c;这种情况在电脑问题里算比较常见的&#xff0c;相信大家都有遇到过&#xff0c;今天就给大家几种解决方法&#xff0c;这几种方法我都试过&#xff0c;都能解决缺失dll文件的问题。 一.…