[2021]NeRF−−: Neural Radiance Fields Without Known Camera Parameters

本文探讨了一种无需已知相机参数的Neural Radiance Fields (NeRF) 方法,提出直接优化相机内参,以实现多视角场景重建,挑战了传统依赖于相机参数的限制。研究者通过学习可变的相机参数,提升模型的泛化能力,减少了对场景特定模型的需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标题:NeRF−−: Neural Radiance Fields Without Known Camera Parameters

链接:https://arxiv.org/pdf/2102.07064

这篇文章主要讲的是如何在没有相机参数的情况下进行多视角的场景重构。

 

首先作者介绍了两种场景重构方式:

1. 直接还原场景的3D模型,这一方案的难点在于通常难以恢复细节,而且光照对于角度的变化并不真实,因为通常都会假设表面是漫反射的

2. 隐式表示(Implicit-Representation)的方案,即学习这么一个模型,输入是相机的参数,输出是相机视角观测到的图像。而nerf就是这种类型的模型。这种方案有助于减少3D模型的存储,但问题在于需要针对每个场景单独建模

然后,作者提到,在训练nerf的时候我们是需要配对的图像和相机参数的,但通常而言相机参数我们是无法获得的。在nerf中是使用了sfm方式预测了相机参数,但作者认为其实根本就不需要相机参数,因此就做了尝试。

首先,整体的模型结构都是基于NeRF的。作者先将相机的内参(焦距,焦点,高度)和外参(位置,旋转)设置为可学习的参数。然后在训练的时候会先将相机参数设为一个固定的初始化值,例如相机的朝向总是向着z轴的负方向的。然后通过这个相机参数和向radiance field里发射一条光线(即将相机参数和对应像素的位置输入radiance field),从而获得对应点的密度和颜色。然后再取不同的位置发射光线,最终将获得的密度和颜色通过体积渲染成一张完整的图片,从而与输入图像做loss,进而优化相机的内参和最终的图像表示。

其中作者还提到,为了提高模型的效果,其实可以重复的优化相机内参,即按照前面讲的训练完毕之后再将获得的相机内参保存,然后初始化nerf的所有参数,之后将保存的相机参数作为相机参数的初始化,再继续重复上面的步骤训练,这样可以得到一个更好的结果。

### 实现 Neural Radiance Fields (NeRF) 的 Julia 版本 Neural Radiance Fields 是一种用于从多视角图像合成新视图的技术。该方法通过训练一个连续的场景函数来表示三维环境中的辐射度,从而能够渲染高质量的新视角图像。 在 Julia 中实现 NeRF 需要几个关键组件: 1. **数据准备** 数据集通常由一组不同角度拍摄的对象或场景的照片组成。这些照片需要经过预处理以便于后续模型训练[^1]。 2. **网络架构设计** 使用深度学习库 Flux 或 Knet 来构建一个多层感知器(MLP),这个 MLP 将位置坐标作为输入并预测对应的颜色和体积密度值。为了提高效率,可以采用分层采样策略以及引入空间编码技术如 Positional Encoding[^2]。 3. **损失函数定义** 定义合适的损失函数对于优化至关重要。常见的做法是计算预测像素颜色与真实图片之间的均方误差(MSE)[^3]。 4. **渲染过程模拟** 渲染阶段涉及到沿着射线积分得到最终观察到的颜色。这一步骤可以通过数值积分完成,在实践中常用的方法有反向投影法等[^4]。 下面是一个简单的伪代码框架展示如何用 Julia 和 Flux 库搭建基本版 NeRF: ```julia using Flux, Statistics, Random struct NerfModel model::Chain end function positional_encoding(x, L=10) encoded = [] for i in 0:L-1 push!(encoded, sin.(2^(i)*π*x)) push!(encoded, cos.(2^(i)*π*x)) end vcat(encoded...) end # 初始化神经网络结构 nerf_model = Chain( Dense(63, 256, relu), Dense(256, 256, relu), Dense(256, 256, relu), Dense(256, 4) ) # 训练循环简化版本 for epoch in 1:num_epochs # 获取一批次的数据 batch_data = get_batch() # 前向传播 predictions = nerf_model(positional_encoding(batch_data["points"])) # 计算损失 loss_value = mean((predictions .- batch_data["colors"]) .^ 2) # 反向传播更新参数... end ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值