NeRF
Trường bức xạ nơ-ron
Bạn chụp 50 ảnh chiếc xe máy từ nhiều góc. Giờ muốn xem xe từ góc chưa chụp bao giờ. Cần gì?
Hãy tưởng tượng bạn dùng Google Maps để xem phố cổ Hội An. Từ ảnh 2D đã chụp, AI xây dựng "thế giới 3D" — bạn "bay" quanh, zoom vào ngóc ngách chưa ai chụp. Đó là công nghệ đằng sau NeRF.
Hình minh họa
NeRF biến bài toán 3D thành bài toán hàm số: F(x,y,z,θ,φ) → (r,g,b,σ). Một MLP đơn giản mã hóa TOÀN BỘ cảnh 3D! Không cần mesh, point cloud, hay voxel — chỉ cần weights của neural network.
Để tính màu 1 pixel: bắn tia từ camera, lấy mẫu N điểm trên tia, hỏi MLP tại mỗi điểm → (rgb, σ). Tích phân: C = Σ T_i · (1 - exp(-σ_i · δ_i)) · c_i. Trong đó T_i = xác suất tia đến được điểm i (không bị chặn trước đó).
Instant-NGP (NVIDIA): hash encoding + tiny MLP → train giây, render ms. 3D Gaussian Splatting (2023): biểu diễn cảnh bằng hàng triệu Gaussian 3D, rasterize trực tiếp → render realtime 100+ FPS. Cả hai đang thay thế NeRF gốc.
Render ảnh 800×800 từ NeRF. Mỗi pixel bắn 1 tia, lấy 64 mẫu/tia. MLP được gọi bao nhiêu lần?
Giải thích
NeRF (Mildenhall et al., 2020) biểu diễn cảnh 3D bằng continuous function mã hóa trong MLP — khác với cách mô hình sinh như VAE nén cảnh vào latent vector rời rạc, NeRF giữ cảnh như một hàm liên tục trên không gian 3D.
vị trí, hướng nhìn, màu, mật độ.
Volume rendering:
# NeRF MLP (simplified)
class NeRF(nn.Module):
def __init__(self, D=8, W=256, input_ch=63, input_ch_views=27):
super().__init__()
# 8 lớp FC cho vị trí
self.pts_layers = nn.ModuleList(
[nn.Linear(input_ch, W)] +
[nn.Linear(W, W) for _ in range(D-1)]
)
# Output: density σ (không phụ thuộc hướng nhìn)
self.sigma_out = nn.Linear(W, 1)
# Output: color rgb (phụ thuộc hướng nhìn)
self.rgb_layer = nn.Linear(W + input_ch_views, W // 2)
self.rgb_out = nn.Linear(W // 2, 3)
def forward(self, x, d):
# x: positional_encoding(xyz), d: positional_encoding(direction)
h = x
for layer in self.pts_layers:
h = F.relu(layer(h))
sigma = F.relu(self.sigma_out(h)) # Mật độ ≥ 0
h = F.relu(self.rgb_layer(torch.cat([h, d], -1)))
rgb = torch.sigmoid(self.rgb_out(h)) # Màu trong [0,1]
return rgb, sigma- NeRF biểu diễn cảnh 3D bằng MLP: F(x,y,z,θ,φ) → (r,g,b,σ). Toàn bộ cảnh mã hóa trong weights.
- Volume rendering: bắn tia từ camera, lấy mẫu nhiều điểm, tích phân → pixel color.
- Positional encoding giúp MLP học chi tiết tần số cao (cạnh sắc, texture).
- NeRF gốc chậm (~30s/ảnh). Instant-NGP và 3D Gaussian Splatting nhanh hơn 1000-6000×.
- Ứng dụng: Google Maps immersive, VR/AR, điện ảnh VFX, bất động sản ảo, bảo tồn di sản.
Kiểm tra hiểu biết
NeRF nhận input (x, y, z, θ, φ) và output (r, g, b, σ). Tại sao cần hướng nhìn (θ, φ)?