NeRF中的位置编码

news2024/11/24 16:24:06

朴素NeRF中直接采用频率变换来做位置编码,为的是避免空间相邻采样点在MLP表示中的过平滑问题。比如位置(237, 332, 198)和位置(237,332,199)这两个点作为MLP的输入,MLP可能对个位不够敏感,导致输出过平滑的问题。例如:
NeRF Ablation
由于缺乏位置编码,导致纹理相近区域的细节会丢失。
我们来看一下原文中关于Position Encoding的公式:
γ ( p ) = ( sin ⁡ ( 2 0 π p ) , cos ⁡ ( 2 0 π p ) , ⋯   , sin ⁡ ( 2 L − 1 π p ) , cos ⁡ ( 2 L − 1 π p ) ) (1) \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)\tag{1} γ(p)=(sin(20πp),cos(20πp),,sin(2L1πp),cos(2L1πp))(1)
频率编码,很像傅里叶变换,代码如下:

import torch

class FreqEmbedder:
    def __init__(self, multires, include_input=True, input_dims=3, log_sampling=True):
        self.multires = multires
        self.input_dims = input_dims
        self.include_input = include_input
        self.log_sampling = log_sampling
        self.periodic_fns = [torch.sin, torch.cos]

        self.embed_fns = None
        self.out_dim = None
        self.create_embedding_fn()

    def create_embedding_fn(self):
        embed_fns = []
        d = self.input_dims
        out_dim = 0
        if self.include_input:
            embed_fns.append(lambda x: x)
            out_dim += d

        max_freq = self.multires - 1
        N_freqs = self.multires

        if self.log_sampling:
            freq_bands = 2. ** torch.linspace(0., max_freq, steps=N_freqs)
        else:
            freq_bands = torch.linspace(2. ** 0., 2. ** max_freq, steps=N_freqs)

        for freq in freq_bands:
            for p_fn in self.periodic_fns:
                embed_fns.append(lambda x, p_fn=p_fn, freq=freq: p_fn(x * freq))
                out_dim += d

        self.embed_fns = embed_fns
        self.out_dim = out_dim
	def embed(self, inputs):
        return torch.cat([fn(inputs) for fn in self.embed_fns], -1)

其中torch.sintorch.cos实现的就是数学意义的功能,举个例子:

import torch
pi = 3.1415926
degree_30 = pi / 6 # 30 degree

a = torch.Tensor([degree_30])
r = torch.sin(a)
print(r) # tensor([0.5000])

上面实验表明了 s i n ( 30 ° ) = 1 2 sin(30\degree)={1\over{2}} sin(30°)=21

对于频率位置编码:假设一个位置的 x 0 = 30 x_0=30 x0=30,它相邻的位置是 x 1 = 31 x_1=31 x1=31,经过 r = s i n ( x ∗ 512 ) r=sin(x*512) r=sin(x512)编码以后, x 0 x_0 x0编码后的位置为 − 0.6842 -0.6842 0.6842,而 x 1 x_1 x1编码后的位置为 0.6240 0.6240 0.6240。差距一目了然。
这里的512则表示频率,如公式(1)所示的 2 L − 1 π 2^{L-1}\pi 2L1π

当然,也如公式(1)所示,我们并不以单一的频率来表示位置编码,比如我们挨个用 [ 1 , 2 , 4 , 8 , 16 , 32 , 64 , 128 , 256 , 512 ] [1,2,4,8,16,32,64,128,256,512] [1,2,4,8,16,32,64,128,256,512]这10种频率来表示编码位置(只需用公式 r = s i n ( p ∗ x ) r=sin(p*x) r=sin(px),然后简单concat到一起)。这就完成了基本的位置编码。当然,我们还可以加入相位平移,把 c o s ( p ∗ x ) cos(p*x) cos(px)的结果也concat到一起。

所以,对于一个位置 p ( x , y , z ) p(x,y,z) p(x,y,z),我们用10种频率(如 [ 1 , 2 , 4 , 8 , 16 , 32 , 64 , 128 , 256 , 512 ] [1,2,4,8,16,32,64,128,256,512] [1,2,4,8,16,32,64,128,256,512])来编码,每种频率采用两种相位(sincos),那编码后的位置应该有 3 × 10 × 2 = 60 3\times10\times2=60 3×10×2=60维来表示原始的三维坐标向量。通常,我们会把原始的三维坐标向量也concat到一起,那么就输出 60 + 3 = 63 60+3=63 60+3=63维,直接喂到MLP里去。

众所周知,NeRF除了位置 ( x , y , z ) (x,y,z) (x,y,z)输入外,还需要输入观测角度 ( θ , ϕ ) (\theta, \phi) (θ,ϕ)。观测角度可以用ray direction来表示,通常采用三维向量。也需要进行编码,也可以统称为位置编码。我们用同样的方法,但可以少用一些频率,比如我们用 [ 1 , 2 , 4 , 8 ] [1,2,4,8] [1,2,4,8]这四种频率来编码观测角度。编码后的维度也可计算出来: 3 × 4 × 2 + 3 = 27 3\times4\times2+3=27 3×4×2+3=27
NeRF_MLP
上图就是NeRF中MLP的输入顺序,图中并没有加原始位置,所以位置编码的维度为60,而方向编码的维度为24。输入阶段一目了然~

本文内容由本人亲自整理,如有疑问请留言交流~

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

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

相关文章

华为云云耀云服务器L实例评测 | 实例使用教学之软件安装:华为云云耀云服务器环境下安装 Docker

华为云云耀云服务器L实例评测 | 实例使用教学之软件安装:华为云云耀云服务器环境下安装 Docker 介绍华为云云耀云服务器 华为云云耀云服务器 (目前已经全新升级为 华为云云耀云服务器L实例) 华为云云耀云服务器是什么华为云云耀云…

特种设备安全监测终端,降低安全隐患风险!

特种设备运行关系到人民生命财产安全,关系到经济健康发展,关系到社会的稳定。有关特种设备的事故基本都发生在使用过程中,因此,使用过程的安全管理是特种设备的管理重点。针对国内特种设备本身存在事故隐患及安装、维修、操作、指…

基于微信小程序的快递配送管理平台系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言系统主要功能:具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考源码获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计…

亚马逊投资Anthropic; OpenAI将推出新版ChatGPT

🦉 AI新闻 🚀 亚马逊投资Anthropic获得可靠AI基础模型开发合作 摘要:亚马逊投资Anthropic至多40亿美元,将共同开发可靠高性能的基础模型,并能提前使用Anthropic技术。Anthropic将主要依赖亚马逊的云服务来训练未来的…

cJSON.c 在mfc中编译失败报 lnk2005错误

问题一、在MFC工程中导入cJson.c 编译时报以下错误: 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C1853 “x64\Release\xxx.pch”预编译头文件来自编译器的早期版本,或者预编译头为 C 而在 C 中使用它(或相反) xxx …

机器学习与数据挖掘第三、四周

为什么第二周没有呢……因为刚换老师,自学要适应一段时间。 本课程作者之后的学习目标是:实操代码,至少要将作者参加数学建模中用到的数据处理方法都做一遍。 首先,作者复习一下李宏毅老师的两节课程。 机器学习概述 机器学习就…

前言技术 VScode + 其他插件-1

一、VScode 提升编程效率,免费 IDE(Integrated Development Environment,集成开发环境)是含代码编辑器、关键词高亮、智能感应、智能纠错、格式美化、版本管理等功能于一身的 "高级代码编辑器" 每个 IT 工程师都要有自…

【专升本】1. 英语考试介绍

一、考试方式 基础题:80% 难题:20% 二、试卷结构 1. 语音 级别:不重要原因:1分/题 2. 语法与词 级别:基础,一般 原因:1分/题 3. 汇完形填空 级别:比较重要原因:…

PyTorch 深度学习之逻辑斯蒂回归Logistic Regression(五)

Revision-Linear Regression Classfication The MNIST dataset train: 训练集还是测试集 The CIFAR-10 dataset 1. Regression VS Classfication 输出概率 1.1 How to map [0,1] 导数: 正态分布 1.2 Sigmoid functions 2. Logistic Regression model loss function for Bin…

Spring事务this自调用的理解误区?真的会让事务失效吗?

文章目录 前言this调用是什么this调用事务失效案例this调用事务仍然生效案例?总结 如何解决this调用事务失效 前言 我们经常谈到Spring事务失效会有多种场景导致:可参考我另外一篇文章 一文清晰讲解Transactional 注解失效场景 Transactional 应用在非…

代码随想录算法训练营第四十九天 | 动态规划 part 10 | 买卖股票的最佳时机i、ii

目录 121. 买卖股票的最佳时机思路代码 122.买卖股票的最佳时机II思路代码 121. 买卖股票的最佳时机 Leetcode 思路 贪心:记录最低值,并且遍历股票逐个寻找股票卖出最大值 动态规划: dp[i][0] 表示第i天持有股票所得最多现金 dp[i][1] 表示…

uniapp - 微信小程序实现腾讯地图位置标点展示,将指定地点进行标记选点并以一个图片图标展示出来(详细示例源码,一键复制开箱即用)

效果图 在uniapp微信小程序平台端开发,简单快速的实现在地图上进行位置标点功能,使用腾讯地图并进行标点创建和设置(可以自定义标记点的图片)。 你只需要复制代码,改个标记图标和位置即可。

工地临时用电之智慧用电:全方位保障用电安全

随着科技进步和智能化的发展,工地用电管理也迎来了智慧化的革新。智慧用电,作为智慧工地的重要组成部分,通过集中式管理和创新的技术手段,为工地提供了全方位的用电安全保障。 针对工地临时用 的现状及系统结构,力安科…

ElementUI之动态树+数据表格+分页->动态树,动态表格

动态树动态表格 1.动态树 //src/components/LeftNav.vue <template><el-menu router :default-active"$route.path" default-active"2" class"el-menu-vertical-demo" background-color"#334157" text-color"#fff&quo…

OWASP Top 10漏洞解析(1)- A1:Broken Access Control 访问控制失效

作者&#xff1a; gentle_zhou 原文链接&#xff1a;OWASP Top 10漏洞解析&#xff08;1&#xff09;- A1:Broken Access Control 访问控制失效-云社区-华为云 Web应用程序安全一直是一个重要的话题&#xff0c;它不但关系到网络用户的隐私&#xff0c;财产&#xff0c;而且关…

Logic Pro X10.7.9(mac乐曲制作软件)

Logic Pro X是由苹果公司开发的一款专业音频制作软件&#xff0c;主要用于音乐制作、录音、混音和母带处理等方面。以下是Logic Pro X的特点&#xff1a; 强大的音频编辑功能&#xff1a;Logic Pro X提供了丰富的音频编辑工具&#xff0c;包括波形编辑器、音频自动化、时间拉伸…

【Linux】——基操指令(一)

个人主页 代码仓库 C语言专栏 初阶数据结构专栏 Linux专栏 LeetCode刷题 算法专栏 目录 前言 基操前的碎碎念 计算机的层状结构 基础指令 查看登录用户指令 查看用户指令 查看当前所处工作目录 清屏指令 基操指令 ls命令 cd命令 makdir指令 rmdir指令 &…

UE学习记录06----根据Actor大小自适应相机位置

背景&#xff1a; staticMesh 会根据业务需要随时变化&#xff0c;然后通过staticMesh的大小自适应相机位置&#xff0c;捕捉画面用来预览该模型&#xff0c;使模型在画布中不会太大导致显示不全&#xff0c;也不会太小 参考&#xff1a; UE实现相机聚焦物体功能_右弦GISer的…

TensorFlow入门(二、基本步骤)

深度学习是机器学习领域中的一个研究方向,它被引入机器学习使其更接近于最初的目标——人工智能。 深度学习的本质其实就是一个拟合函数&#xff0c;通过不断的“喂入”数据&#xff08;比如图片或者视频&#xff09;来调节神经网络的参数&#xff0c;从而找到输入数据的特征范…

嵌入式Linux应用开发-Framebuffer 应用编程

嵌入式Linux应用开发-Framebuffer 应用编程 第五章 Framebuffer 应用编程5.1 LCD 操作原理5.2 涉及的 API 函数5.2.1 open 函数5.2.2 ioctl 函数5.2.3 mmap 函数 5.3 Framebuffer 程序分析5.3.1 打开设备5.3.2 获取 LCD 参数5.3.3 映射 Framebuffer5.3.4 描点函数5.3.5 随便画几…