NERF论文笔记(1/2)

这篇博客详细介绍了NeRF(神经辐射场)技术,通过优化连续的体积场景函数,实现从稀疏场景图像生成任意视角的视图。NeRF利用全连接深度网络表示场景,输入为5维坐标,输出体积密度和依赖于视点的发射辐射。文章涵盖NeRF的基本原理,包括体积渲染、网络结构以及两项技术改进:位置编码和多层采样。

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

NeRF:Representing Scene as Neural Radiance Fields for View Synthesis 笔记

摘要

实现了一个任意视角视图生成算法:输入稀疏的场景图像,通过优化连续的Volumetric场景函数实现;用全连接深度网络表达场景,输入是一个连续的5维坐标,3D坐标+2D角度(航向、俯仰角),输出Volume density和依赖于视图的emitted radiance,查询5维坐标并用经典的Volume Rendering把输出的颜色与强度投影到图像。

介绍

a. march camera rays,我理解为从焦点投射射线到场景,获取3D坐标点。
b. 用3D点 x \bold{x} x与对应的2D角度(用单位向量 d \bold{d} d)输入,输出颜色 c \bold{c} c和强度 σ \sigma σ
c. 合成图像。

Neural Radiance Field场景表达

F θ : ( x , d ) → ( c , σ ) F_{\theta}:(\bold{x},\bold{d})\rarr(\bold{c},\sigma) Fθ:(x,d)(c,σ)
输出 σ \sigma σ只与输入位置坐标 x \bold{x} x有关, c \bold{c} c则与 x \bold{x} x d \bold{d} d有关。

网络结构,输入 x \bold{x} x的8层全连接层,均为256通道,各层带ReLU激活,输出 σ \sigma σ、256维特征,此特征再与 d \bold{d} d聚合,输入一层带ReLU的全连接层,输出 c \bold{c} c

Volume Rendering

位置坐标 x \bold{x} x表达为相机射线 r \bold{r} r r ( t ) = o + t d \bold{r}(t)=\bold{o}+t\bold{d} r(t)=o+td,t是从焦点 o o o出发的长度,积分上下界是远端、近端。
C ( r ) = ∫ t n t f T ( t ) σ ( r

### NeRF 论文详解及其实现教程 #### 基本概念 NeRF (Neural Radiance Fields) 是一种用于视图合成的技术,能够通过对场景的多角度图像进行建模,在未观察到的角度上生成高质量的新视图。其核心思想是将连续的体积密度和辐射度表示为神经网络的隐函数[^1]。 具体而言,NeRF 使用 MLP(多层感知机)来学习一个从空间位置 \( \mathbf{x} \in \mathbb{R}^3 \) 和观测方向 \( \mathbf{d} \in \mathbb{S}^2 \) 到颜色 \( \mathbf{c}(\mathbf{x},\mathbf{d}) \) 和体积密度 \( \sigma(\mathbf{x}) \) 的映射关系。这种设计使得 NeRF 能够捕捉复杂的几何结构和外观细节[^2]。 #### 实现流程概述 为了复现实现 NeRF,通常需要以下几个主要步骤: 1. **数据准备**: 收集一组目标物体或多视角场景的照片,并记录相机参数(如内在矩阵、外在矩阵等)。这一步可以通过 COLMAP 或其他 SfM 工具完成。 2. **模型定义**: 定义两个嵌套的 MLP 结构——粗略采样阶段和精细采样阶段。前者负责快速估计场景的大致分布,后者则进一步优化光线上的样本点以提高精度[^3]。 3. **前向传播计算**: 对于每条光线,执行分步积分操作,结合采样的位置信息与方向信息预测最终像素的颜色值。 4. **损失函数构建**: 主要采用 MSE Loss 来衡量预测图像与真实图像之间的差异。此外还可以加入正则化项防止过拟合等问题发生。 5. **训练过程管理**: 设置合适的超参并监控指标变化趋势直至收敛为止。 以下是基于 PyTorch 的简单代码框架展示如何搭建基础版 NeRF 模型: ```python import torch from torch import nn class BasicMLP(nn.Module): def __init__(self, input_dim=3, hidden_dim=256, output_dim=4): super(BasicMLP, self).__init__() layers = [] for _ in range(8): # Define depth of network here. layers.append(nn.Linear(input_dim if not layers else hidden_dim, hidden_dim)) layers.append(nn.ReLU()) self.mlp_network = nn.Sequential(*layers, nn.Linear(hidden_dim, output_dim)) def forward(self, x): return self.mlp_network(x) def render_rays(ray_batch, model_coarse, model_fine=None): """Render rays by computing the output colors given a model.""" N_rand = ray_batch.shape[0] z_vals = ... # Sample points along each ray according to some strategy. pts = ... # Compute point locations based on sampled distances and origins/directions from `ray_batch`. raw_coarse = model_coarse(pts.view(-1,pts.size(-1))).view(N_rand,-1,model_coarse.output_dim) rgb_map_coarse, weights = volume_rendering(raw_coarse[..., :3], raw_coarse[..., -1:], z_vals=z_vals) if model_fine is None: return {'rgb': rgb_map_coarse} fine_z_vals = sample_pdf(z_vals, weights[:, :-1].detach(), N_importance).detach() fine_points = get_ray_points_from_zvals(...) raw_fine = model_fine(fine_points.reshape(-1,fine_points.size(-1))) rgb_map_fine = ... outputs = { 'rgb_coarse': rgb_map_coarse, 'rgb_fine': rgb_map_fine} return outputs ``` 以上仅为简化版本示意用途,请参照官方仓库链接获取更完整的源码文件。 --- #### 当前研究进展中的挑战与发展 尽管 NeRF 取得了显著成就,但在实际应用场景下仍存在诸多局限性。例如当面对动态对象或者大规模户外环境时表现不佳;另外长时间耗损较大的计算资源也是亟待解决的问题之一[^4]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值