NeRF原理简介及实现

news2024/11/30 0:35:31

 NeRF(Neural Radiance Fields)是一种先进的计算机图形学技术,能够使用深度全连接神经网络优化场景的连续5D函数表示,从而生成高度逼真的3D场景。该技术的优势在于没有使用离散化的网格或体素来表示场景,而是使用一个连续的函数来表示整个场景,可以从任意角度渲染,创造令人惊叹的高质量渲染,并在可视效果方面优于现有的渲染方法。

    NeRF的工作原理是自监督的,通过在有限的输入视图上训练数据,可以用较少的数据集来生成高质量的渲染。该技术通过在深度神经网络(MLP)中训练数据来获得场景的连续函数表示,并使用体积渲染技术来合成图像。因为这个合成过程是可微分的,所以可以使用梯度下降来优化这个函数,从而得到更好的场景表示。

01

NeRF基本原理

c866adbcb9f10d8bda1490649f5e763b.png

通过一组输入图像优化场景的连续5D神经辐射场表示(在任何连续位置处有体积密度和视角相关的颜色)的方法。使用体积渲染技术沿着光线累积场景表示的样本,并可以从任何角度渲染出场景。在上图中展示了从周围半球随机捕获的100个合成Drums场景的输入视图集合,并展示了从我们优化的NeRF表示渲染的两个新视角。

那么神经辐射场场景表示和可微渲染过程是什么样的呢,如下图所示:

cf6624e8b596c5ae0600b09769ea4e19.png

    通过沿相机射线采样5D坐标(位置和视角方向)来合成图像(a),将这些位置输入MLP以生成颜色和体积密度(b),并使用体积渲染技术将这些值融合到图像中(c)。这种渲染函数是可微的,然后通过最小化合成和真实观察图像之间的残差来优化场景的表示。

    具体来说:首先将一个静态场景表示为连续的5D函数,该函数输出空间中每个点(x, y, z)处发射的每个方向(θ, ϕ)的辐射度,以及每个点的密度,该密度表现为微分不透明度,控制光线通过(x,y,z)时累积的辐射量。然后使用深度全连接神经网络进行优化,该神经网络没有卷积层(通常称为多层感知器或MLP),以通过从单个5D坐标 (x, y, z, θ, ϕ) 回归到单个体积密度和视角相关的RGB颜色来表示这个函数。要从特定视点渲染这个神经辐射场(NeRF),需要如下步骤:

1)沿着摄像机射线遍历场景,生成一组3D采样点; 

2)将这些点及其对应的2D视角作为输入,输入到神经网络中得到一组输出颜色和密度; 

3)使用经典的体积渲染技术将这些颜色和密度积累成一张2D图像。由于这个过程是可微的,于是可以使用梯度下降来优化这个模型,通过最小化每个观察图像和相应的从辐射场表示中渲染的视图之间的误差来实现这个目标。通过在多个视图中最小化这个误差,可以鼓励网络通过将高体积密度和准确的颜色分配给包含真实底层场景内容的位置来预测一个连贯的场景模型。

    对于复杂的场景,优化神经辐射场表示的基本实现不能收敛到足够高分辨率的表示,并且在每个摄像机射线所需的样本数方面效率低下。通过使用位置编码来转换输入的5D坐标,从而使MLP能够表示更高频率的函数,并且通过分层采样的过程来减少所需的查询数量,以充分采样这个高频率的场景表示。

    总体的技术包括: 

1、一种将具有复杂几何和材料的连续场景表示为5D神经辐射场的方法,参数化为基本的MLP网络。 

2、一种基于经典的体积渲染技术的可导渲染程序,使用它来从标准RGB图像优化这些表示。这包括一种分层采样策略,用于将MLP的能力分配到具有可见场景内容的空间中。 

3、一种位置编码方式,将每个输入的5D坐标映射到更高维的空间,从而能够成功地优化神经辐射场以表示高频率的场景内容。

02


Instant-ngp安装

    Instant-ngp主要用于解决NeRF在对全连接神经网络进行参数化时的效率问题。该方法提出一种编码方式,使得可以使用一个较小规模的网络来实现NeRF同时不会产生精度的损失。该网络由特征向量的多分辨率哈希表实现增强,基于随机梯度下降执行优化。多分辨率结构有助于GPU并行,能够通过消除哈希冲突减少计算。该方法最大的亮点是将NeRF以小时计的时间开销提升到秒级。下图为一些渲染样例,可以看到渲染时间有显著的提升

d4545db7a524daa913bc5e5ba3459a3c.gifa2ec570f5b712d163db420c59330b87a.gif

github地址:NVlabs/instant-ngp: Instant neural graphics primitives: lightning fast NeRF and more (github.com)

基本安装步骤:

‍1、安装anaconda,我之前的图文有说明

2、安装MSCV2019,在这个地址下载安装Download Visual Studio Tools - Install Free for Windows, Mac, Linux (microsoft.com)‍

3、安装cmake,Download | CMake,选择对应的版本安装

git clone --recursive https://github.com/nvlabs/instant-ngp cmake . -B build cmake --build build --config RelWithDebInfo -j 16

4、cmake完成后会在目录生成一个instant-ngp.exe的文件

5、创建对应的python环境

conda create -n ngp python=3.9

conda activate ngp

pip install -r requirments.txt

踩坑:

1、如果出现“Build problem: No CUDA toolset found”

  1. 打开Windows资源管理器并导航到CUDA安装目录:

  2. C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\extras\visual_studio_integration\MSBuildExtensions

  3. 复制所有文件。

  4. 粘贴到Visual Studio 2019安装目录:C:\Program Files (x86)\Microsoft VisualStudio\2019\Community\MSBuild\Microsoft\VC\v160\BuildCustomization

03


Instant-ngp测试

1、随便拍一个物体,注意尽量不要跳跃太大或者时长太短,否则后面将无法进行特征提取,或者即使提取了特征,也无法重建3D,在重建过程中若出现闪退,大概率是图片的问题。

2、将视频放到instant-ngp文件夹下的data下,可以自行再新建一个文件夹,比如mydata

3、使用scripts文件下的视频抽帧脚本进行视频抽帧

python     .\scripts\convert_video.py 

                --input H:\instant-ngp\data\mydata\sample.mp4 

                --output  H:\instant-ngp\data\mydata\images 

                --show_image 1 

                --scale 2

4、使用scripts文件下的colmap2nerf脚本进行辐射场转换

python     scripts/colmap2nerf.py 

                --colmap_matcher exhaustive 

                --colmap_camera_model PINHOLE 

                --run_colmap 

                --images H:\instant-ngp\data\mydata\images 

                --aabb_scale 4 

                --out H:\instant-ngp\data\mydata\transform.json

5、然后在终端运行

instant-ngp.exe H:\instant-ngp\data\mydata\images H:\instant-ngp\data\mydata\transform.json

b0e212ea8bffa54d9ebaaf3d16d4f8e8.png

ea69693e731af4c7fa81505b3e34854c.png

3bfca61a155fd31645176009f41e92aa.png

整个训练过程很快,5秒左右就能达到图3的效果,可以通过界面中crop size选择需要重建的部分,或者crop box下拉菜单中进行微调

1edcb8a93b77c37ff442d57cd6d75b9f.png

    整个测试下来,速度还是相当快的,GPU好一点的电脑速度应该会更快,后续打算通过controlNet中的openpose来生成不同角度的图片,然后喂给instant-ngp来生成3D模型,从而实现文字到3D图像的生成,也算是曲线救国吧

欢迎关注公众号:IoT Inn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/523602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Pandas与SQL系列】Pandas实现分布函数percent_rank、cume_dist

目录 1,分布函数,1.1,percent_rank()1.2,cume_dist()1.3 SQL例子 2,Pandas 实现3,补充Pandas实现排序 1,分布函数, 应用场景:快速查看某个记录所归属的组内的比例 分布函数分类及基础语法&…

asp.net952-sqlserver学生成绩信息管理系统开发

本学生管理系统主要学校内部提供服务,系统分为管理员,教师和学生三部分。 本研究课题重点主要包括了下面几大模块:用户登录,管理员管理,教师信息管理,学生信息管理,课程信息管理,考试信息管理,成绩信息管理系统设置等功能。这几个…

基于深度自编码网络实现轴承故障诊断

1.网络模型(数据集为CWRU) 代码实现了一个基于DAE的分类模型,用于对给定数据集进行分类。首先,通过DAE模型对原始数据进行特征提取和降维,然后使用分类模型将提取的特征与标签相匹配,以便对新数据进行分类。 代码的主要流程: 导…

用激光点云估算建筑高度【PDAL|PostgreSQL】

LiDAR 数据可以非常强大地提取城市规模的地面和物体的高程。 在 One Concern,我们正在使用 LiDAR 数据提取地面和建筑物高程,以改进进入我们的自然灾害模型的暴露信息,最终估计洪水和地震的影响。 由于 3DEP 项目预计将在 2023 年之前收集全…

STM32------GPIO

GPIO 一、介绍 1、1 什么是GPIO? 输入输出端口 1、2 GPIO特点 1、不同封装IO数量不一样。 2、快速翻转,每次翻转最快只需要两个时钟周期。 3、每个IO都可以做中断。 4、支持8种工作模式。 1、3 GPIO电气特性 STM32工作电压范围:2~3…

【C进阶】通讯录的实现(静态+动态)

目录 前言: 一.静态通讯录的实现 1.关于通讯录的前期准备 (1)菜单的打印 (2)建立一个联系人的信息 (3)通讯录整体 (4)宏定义常量 (5)主函数菜单选项的功能 2.通讯录的功能实现 (1)初始化通讯录 (2)增加指定联系人 (3) 展示通讯录 "FindByName函数" (4)删…

Autosar 规范接口之SPI

Autosar SPI 概述(Specification of SPI Handler/Driver ) 基础知识介绍 在AutoSar标准中,与SPI通讯相关的三个术语:Channel、Job和Sequence。 1个Channel对应1个发送缓冲区和1接收缓冲区;1个Job对应着1次SPI通讯发送…

(第45册)HTML5网页游戏设计从基础到开发(第2版·微课视频版)

HTML5是W3C组织近年来发布的一项引起业内轰动的Web新标准。它几乎颠覆现有Web应用, HTML5从根本上改变了开发商开发web应用的方式,从桌面浏览器到移动应用,这种语言和标准都正在影响将继续影响着各种操作平台。 本书是第2版,第1版2018年出版,经历6次印刷…

【项目开发】GoFrame+Vue项目部署到阿里云服务器

前言 本来想都用docker部署的,结果学艺实在是不精,只能先这么委曲求全宝塔页面的反向代理一直无法生效,用了重定向跳转页面宝塔的网站也可以构建go项目 背景 后端使用GoFrame框架,前端使用Vue 3 TypeScript Vite,…

Windows Cygwin 配置

Windows Cygwin 配置 一、什么是Cygwin? Cygwin,原Cygnus出品(已被红帽收购),目前是RedHat名下的项目。项目的目的是提供运行于 Windows 平台的类 Unix 环境(以 GNU 工具为代表)。为了达到这个…

learn C++ NO.4 ——类和对象(2)

1.类的6个默认成员函数 1.1.默认成员函数的概念 在 C 中,如果没有显式定义类的构造函数、析构函数、拷贝构造函数和赋值运算符重载函数,编译器会自动生成这些函数,这些函数被称为默认成员函数。 class Date { };初步了解了默认成员函数&am…

pytorch实战10:基于pytorch简单实现CGAN

基于pytorch简单实现CGAN 前言 ​ 最近在看经典的卷积网络架构,打算自己尝试复现一下,在此系列文章中,会参考很多文章,有些已经忘记了出处,所以就不贴链接了,希望大家理解。 ​ 完整的代码在最后。 本系列…

离散数学下 ---格与布尔代数

(一)目录 格的定义及性质 子格 分配格 有补格 布尔代数 (二) 内容 格的定义与性质 补充点: 格与布尔代数,它们与群的基本不同之处是:格与布尔代数的基集都是一个偏序集。 格是一个具…

华硕主板win11设置关机状态下USB接口不通电

华硕主板win11设置关机状态下USB接口不通电 我新装机子在关机之后usb还是通电,导致一些外接设备显示灯常亮着非常不方便。因此我尝试把其关掉。 我的是华硕主板,不同主板可能设置方式不一样,请注意。 请按照如下步骤操作: 计算机…

NetApp FAS2554故障灯常亮case处理过程分享

近期处理了一个NetApp FAS2554前面故障灯一直点亮的case,本文对于分析过程和最终的问题发现做一个分享,欢迎讨论,可以add wechat at StorageExpert。 外观检查: 客户反馈,一套FAS2554存储,没有任何扩展柜…

文献阅读(52)—— Integration self-attention and convolution

文献阅读(52)—— Integration self-attention and convolution 文章目录 文献阅读(52)—— Integration self-attention and convolution先验知识/知识拓展文章结构背景文章方法1. Relating Self-Attention with Convolution 文章…

C++11 函数对象、Lambda表达式 绑定器

1. 函数对象和绑定器 函数对象&#xff1a; 重载了operator()运算符的类的对象。 STL中的原本的绑定器&#xff1a; STL中的绑定器可将二元函数对象绑定为一元函数对象。有如下示例帮助回顾&#xff1a; #include <iostream> #include <vector> #include <…

「 计算机网络 」Cookie、Session、Token、JWT 原理详解

「 计算机网络 」Cookie、Session、Token、JWT 原理详解 参考&鸣谢 傻傻分不清之 Cookie、Session、Token、JWT 详解 Cookie&#xff0c;Session&#xff0c;Token 一文彻底搞懂Cookie、Session、Token到底是什么 文章目录 「 计算机网络 」Cookie、Session、Token、JWT 原…

机器学习 day13(正则化,线性回归的正则化)

正则化的思想 如果特征的参数值更小&#xff0c;那么对模型有影响的特征就越少&#xff0c;模型就越简单&#xff0c;因此就不太容易过拟合 如上图所示&#xff0c;成本函数中有W₃和W₄&#xff0c;且他们的系数很大&#xff0c;要想让该成本函数达到最小值&#xff0c;就得使…

基于PostGIS的曲线拐点计算

在这篇博文中&#xff0c;我将介绍一种查找曲线拐点的方法。 一个简单的理解方式&#xff1a;将曲线想象成我们正在行驶的道路&#xff0c;我们想要找到我们停止右转并开始左转或反之的点&#xff0c;如下所示&#xff1a; 我们将展示解决方案的草图和 PostGIS 中的实际实施。…