Neural Radiance Fields
Module: Computer Vision | Difficulty: Advanced
NeRF Formulation
Volume Rendering
where .
Positional Encoding
NeRF Loss
import torch
import torch.nn as nn
class NeRF(nn.Module):
def __init__(self, pos_enc_dim=10, dir_enc_dim=4, hidden=256):
super().__init__()
pos_in = pos_enc_dim * 2 * 3 + 3
dir_in = dir_enc_dim * 2 * 3 + 3
self.pos_mlp = nn.Sequential(
nn.Linear(pos_in, hidden), nn.ReLU(True),
nn.Linear(hidden, hidden), nn.ReLU(True),
nn.Linear(hidden, hidden), nn.ReLU(True),
nn.Linear(hidden, hidden), nn.ReLU(True),
)
self.sigma = nn.Linear(hidden, 1)
self.color = nn.Sequential(
nn.Linear(hidden + dir_in, hidden // 2), nn.ReLU(True),
nn.Linear(hidden // 2, 3), nn.Sigmoid()
)
def forward(self, pos, dir):
h = self.pos_mlp(pos)
sigma = self.sigma(h)
color = self.color(torch.cat([h, dir], dim=-1))
return color, sigma
def positional_encoding(x, L=10):
freqs = 2 ** torch.arange(L).float()
return torch.cat([torch.sin(freqs * x), torch.cos(freqs * x)], dim=-1)
Key Takeaways
- NeRF represents scenes as continuous volumetric radiance fields
- Positional encoding enables learning high-frequency details
- Volume rendering produces photorealistic novel views