【论文精读】iNeRF-程序员宅基地

技术标签: 计算机视觉  深度学习  人工智能  NeRF  

这是IROS2021的一篇文章,一作是MIT的Lin Yen-Chen,也就是nerf-pytorch的作者。
论文地址:arxiv
项目代码:Github

Abstract

提出了 iNeRF,这是一个通过“反转”NeRF来执行姿态估计的框架,并且这个过程不需要mesh。 我们研究是否可以通过 NeRF 应用综合分析进行无mesh、仅 RGB 的 6DoF 姿态估计,也就是,给定图像,找到相机相对于 3D 对象或场景的平移和旋转。我们的方法假设在训练或测试期间是无法得到mesh的。从初始姿态估计开始,我们使用梯度下降来最小化从 NeRF 渲染的像素和观察图像中的像素之间的残差。在我们的实验中,我们首先研究 1)如何在 iNeRF 的姿势细化过程中对光线进行采样以收集信息梯度,以及 2)不同批次大小的光线如何影响合成数据集上的 iNeRF。然后,我们展示了对于来自 LLFF 数据集的复杂现实世界场景,iNeRF 可以通过估计新图像的相机位姿并将这些图像用作 NeRF 的额外训练数据来改进 NeRF。最后,我们展示了 iNeRF 可以通过反转从单个视图推断的 NeRF 模型,使用 RGB 图像执行类别级别的对象姿态估计,包括训练期间未看到的对象实例。

Introduction

6DoF姿态估计应用很广泛,最近在可微渲染方面的进步激发了学界通过合成数据来求解姿态估计问题的兴趣。但是渲染需要三维模型,而想要得到这个模型又并不容易。NeRF提供了不需要mesh模型也能得到渲染图片的方法,这样在姿态估计问题中就不需要mesh了。
提出的iNeRF需要三个输入,一个观察的图片,一个初始的pose估计,和一个该场景的NeRF模型表示。我们计算由NeRF渲染出的图像和观察的图像在pixel之间的差异,然后通过 NeRF 模型反向传播来自这些残差的梯度,以产生估计姿态的梯度。这个过程持续直到两张图对齐。
在这里插入图片描述
虽然听上去很不错,但为了姿态估计而使用NeRF面临如下几个挑战。首先,NeRF 渲染图像中的每个像素,方法是通过该像素发射一条射线并重复查询 3D 辐射场,同时沿着该射线行进以产生体积密度和颜色的估计值,然后将其 alpha 合成为一个像素颜色。 这种渲染过程是昂贵的,这给通过analysis-by-synthesis的方法带来了问题,因为它应该需要渲染完整的图像并反向传播所有像素贡献的损失。对于 iNeRF,我们利用 NeRF 的光线行进结构允许单独渲染光线和像素这一事实来解决这个问题,并且我们提出了一种基于兴趣点的采样方法,使我们能够确定应该对哪些光线进行采样以最好地表示物体的姿势。 这种采样策略允许准确的姿态估计,同时使用比全图像采样少两个数量级(two orders of magnitude fewer)的像素。 此外,我们证明 iNeRF 可以通过注释没有姿势标签的图像并将它们添加到训练集中来提高 NeRF 的重建质量。 我们表明,此过程可以在保持重建质量的同时将所需标记图像的数量减少 25%。
最后,我们展示了 iNeRF 可以执行类别级别的对象姿态估计,包括在训练期间未看到的对象实例,通过反转由 pixelNeRF推断的 NeRF 模型给定对象的单个视图。 我们知道的唯一先前的工作是类似地提供仅 RGB 类别级别的姿势估计是 Chen 等人最近的工作(Category level object pose estimation via neural analysis-by-synthesis)。 我们比较了和我们的工作之间的差异,这些差异主要来自连续的、隐式的 NeRF 参数化所带来的机遇和挑战。
本文主要贡献如下:(i) 我们表明 iNeRF 可以使用 NeRF 模型来估计具有复杂几何形状的场景和对象的 6 D o F 6 DoF 6DoF 姿势,而无需使用 3D 网格模型或深度传感。 (ii) 我们对射线采样和梯度优化的批量大小进行了彻底的调查,以表征 iNeRF 的鲁棒性和局限性。 (iii) 我们证明 iNeRF 可以通过预测额外图像的相机姿势来改进 NeRF,然后可以将其添加到 NeRF 的训练集中。 (iv) 我们展示了类别级别的姿势估计结果,对于看不见的物体,并包括真实世界的演示。

Related Works

介绍了Neural 3D shape representations相关内容。
介绍了通过RGB图片进行姿态估计的相关工作。

Background

详细介绍了一下NeRF。

iNeRF Formulation

定义iNeRF要解决的问题,现在有一个已经训练好的场景的NeRF模型 Θ Θ Θ,相机内参已知,但是图片I对应的相机外参 T T T未知,我们相当于求解NeRF的逆问题:
在这里插入图片描述
为了求解这个优化问题,我们使用和NeRF一样的loss函数,但是是优化外参T,过程如图2所示。这个loss函数在6DoF的SE(3)空间中是非凸的,对整个图片使用NeRF渲染又计算开销很大,尤其是迭代优化这种情况。我们将讨论基于梯度的 S E ( 3 ) SE(3) SE(3)优化过程,光线采样策略,以及如何用iNeRF预测的来pose来提升NeRF的表现。
在这里插入图片描述

Gradient-Based SE(3) Optimization

Θ Θ Θ作为特定场景的NeRF的参数, T i T_{i} Ti是在第i步估算的相机pose, I I I是观察的图像, L L L作为loss函数来训练。我们使用梯度下降法来求解等式1里的 T T T。为了保证 T T T在基于梯度的优化过程中一直在 S E ( 3 ) SE(3) SE(3)空间,我们使用exponential coordinates来参数化。给定一个 T 0 T_{0} T0
在这里插入图片描述
其中 S = [ ω , ν ] T S = [ω, ν] ^{T} S=[ω,ν]T表示screw axis, θ θ θ是magnitude, [ w ] [w] [w] w w w的skew-symmetric的 3 × 3 3×3 3×3矩阵,而
在这里插入图片描述
在这个参数化方法下,我们的目标是初求解初始估计姿势 T 0 T_{0} T0的最佳相对变换:
在这里插入图片描述
我们通过 MLP 对损失函数进行迭代微分得到梯度,用来更新相对位姿变换。使用Adam优化器并让学习率指数下降。对每个观察的图片,我们初始化一个接近0的 S θ Sθ ,其中每个元素都是从零均值正态分布 N ( 0 , σ = 1 0 − 6 ) N(0, \sigma=10^{-6}) N(0,σ=106)中随机抽取的。在实践中,我们参数化 e [ S ] θ T 0 e^{[S]θ}T_{0} e[S]θT0而非 T 0 e [ S ] θ T_{0}e^{[S]θ} T0e[S]θ,导致了初始估计中心的中心旋转,这减轻了优化期间旋转和平移之间的耦合。

Sampling Rays

对图片的每个像素都采样渲染开销很大,所以设计策略来只采样部分像素来反向传播。
随机采样。一种方法是在成像平面上随机选择M个像素来计算对应的ray,实际上NeRF本身也是这么干来优化自己的参数的。我们发现batch size小的时候,这个策略是不充分的,很多时候都采集到了欠纹理的区域,这对算位姿提供不了多少信息。
使用兴趣点采样。先使用兴趣点检测来获得一些候选点,不够的话再随机采样补充。虽然这个策略引入了更少的随机,使得收敛更快,但是我们发现它容易出现局部最小值,因为它只考虑观察图像上的兴趣点,而不是观察图像和渲染图像的兴趣点。但是从渲染图像获得兴趣点又太昂贵了,计算复杂度是 O ( H W n ) O(HWn) O(HWn)
使用兴趣区域采样。这是一种放宽兴趣点采样的策略,并从以兴趣点为中心的扩张mask中采样。在获得兴趣点之后,我们使用I次 5 × 5 5×5 5×5扩展采样区域。我们发现这种采样方式加速了优化即使rays的batch size很小。值得注意的是,如果I设得很大的话,这又演化成了随机采样。

Self-Supervising NeRF with iNeRF

除了iNeRF能提供位姿估计,我们也探索了使用其结果来训练NeRF。我们训练了一个NeRF,然后使用iNeRF来得到额外的图片pose,然后把这些当作数据集再加到训练当中。这相当于,NeRF可以被半监督地训练。

Results

先在NeRF的合成数据集和真实场景的LLFF数据集来验证iNeRF的姿态估计。特别地,我们研究了batch size和采样策略如何影响iNeRF的表现。我们然后展示了iNeRF通过添加数据集来提升NeRF性能。最后,我们展示看iNeRF在tandem中和pixelNeRF合作很好,能够通过单张RGB图片来预测NeRF模型。

Limitations and Future Work

光照和遮挡会严重影响iNeRF。一个潜在的解决方案是使用transient latent codes建模appearance variation,就像NeRF-W当中训练NeRF时候做的那样,并且在iNeRF当中对这些外观编码和相机位姿一起进行联合优化。并且,现在iNeRF使用大概20秒来运行 100 100 100次迭代优化,还不能实时,可以结合新的NeRF来做提升。

Conclusion

复读了一下贡献。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/YuhsiHu/article/details/126069732

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签