19. NeRF 2020 Neural Radiance Fields - Fourrier Feature - TinyNeRF- Noise added - Stratified sampling - Hierarchical volume sampling - High-dimensional
Mở đầu
SOTA 2020 cho việc tổng hợp các chế độ xem của complex scene bằng cách tối ưu các hàm 3D liên tục sử dụng sparse set làm input. Thuật toán này biểu diễn 1 scene dùng 1 fully-connected (non-convolutional) deep network, với input là 1 5-D coordinate (spatal location (x,y,z) + viewing direction (theta, phi)) và output là mức độ không gian (volume density) và view phát ra từ vị trí không gian đó. Ta truy vấn tọa độ 5D dọc theo các đường camera và dùng kết hợp volume để tạo màu và mật độ (density). Về input, volume rendering có đạo hàm tự nhiên, nên chỉ cần optimize biểu diễn là 1 tập hình ảnh biết camer pose. Kết quả synthesis là best viewed như ideos
Keywords: scene representation, view synthesis, image-based rendering, volume rendering, 3D deep learning
Method: tối ưu MLP, regressing từ 50D coordinate đơn lẻ qua 1 volume density đơn lẻ và view-dependent RGB color.
Để render (biểu diễn) neural radiance field ( NeRF) tại 1 viewpoint cụ thể: - Chụp nhiều góc độ để tạo 1 set 3D points
- Dùng những points này và hình chiếu 2D tương ứng làm input cho 1 neural network để ouput 1 tập colors và densities
- Dùng classic volume rendering techiniques tích trữ colors và densities vào 2D image. Vì có đạo hàm tự nhiên -> óc thể dùng Dradient Descent để optimize (minimizing error giữa observed image và view tạo từ biểu diễn.
Tổng hợp lại: - 1 biễu diễn continuous scenes với complex geometry và materials như 5D neural radiance fields, tham số hóa vởi MLP networks
- 1 differentiable (đạo hàm) procedure dựa vào volume rendering techniques , dùng để optimize biểu diễn RGB (bao gồm hierarchical sampling để phân bố MLP đến không gian và cảnh vật trong visible scene
- encoding 5D coordinate đến higher dimension space, để có thể optimize NeRF để biểu diễn high-frequency (tần số cao) scene content
Neural 3D shape representation
View synthesis and image-based rendering
Neural Radiance Field Scene Representation
input: 3D location x = (x, y, z) + 2D viewing direction
output: c = (r, g, b) và volume density delta - biểu diễn thành 3D Cartesian unit vector d
Vậy ta có 1 MLP:
Và ta optimize weights theta để nối mỗi vị trí input 5D tới density à directional emitted colore.MLP Ftheta xử lí 3D coordinate x với 8 fully-connected layers(ReLU activations và 256 channels/layer), và output delta với 256-dimensional feature vector. Mà feature vector này có thể concat với camera's ray viewing direction và qua thêm 1 fully-connected layer(ReLU activation và 128 channels)
Volume Rendering with Radiance FieldsVolume density delta(x) có thể hiểu là chênh lệch xác xuất của 1 ray kết thúc tại tiệm cận x. Màu mong đợi C(r) của camera ray r(t) = o + td với near bounds tn và far bounds tf là:
Hàm T(t) thể hiện tích lũy xác xuất từ tn đến t mà không dính các phần khác. Ta cần ước tính C(r) theo từng pixel trong virtual camera mong muốn. Ta dùng quadrature. Tuy nhiên việc ước lượng tích phân liên tục này sẽ giảm hiệu quả của MLP chỉ truy vấn tập rời rạc. Thay vào đó, sử dụng lấy mẫu phân lớp (stratified sampling) phân [tn,tf] thành n phần đều nhau rồi rút mẫu đồng nhất từ mỗi thùngMặc dù ta dùng tập rời rạc để ước tính tích phân, stratified sampling cho phép biểu diễn 1 continuous scene vì kết quả của nó trong MLP được đánh giá tại các vị trí liên tục trong quá trình tối ưuVới δi = ti+1 - ti là khoảng cách các mẫu liền kề. Hàm này tính C~(r) từ tập (ci,deltai) khả vi và theo biểu diễn alpha Optimizing a Neural Radiance FieldMặc dù bước trên là core, nhưng chưa đủ đạt SOTA, nên cần thêm 2 cải thiên để có thể biểu diễn high-resolution complex scenes. Đầu tiên là positional encoding của input coordinates để hỗ trợ MLP trong biểu diễn high-frequency functions, và thư 2 là hierachical sampling procedure để tạo mẫu hiệu quả hơn
Position encoding
Theo Rahaman et al, deep network là biased cho learning lower frequency function. Ngoài ra, mapping inputs vào higher dimensional space dùng hifgh frequency functions trước khi cho vào network có thể fitting tốt hơn cho data mà có high frequency variation
Từ đó, ta tách Ftheta thành Ftheta = F'theta o γ (gamma), 1 learned and 1 not, với gamma nối từ R thành R[2L] còn F'theta vẫn là 1 MLP thường
gamma được áp dụng phân biệt với 3 tọa độ x, y, z( mà thường thuộc [-1,1]) và với 3 vung Cartesian viewing direction unit vector d (xây dựng nằm trong [-1.1]).Theo kinh nghiệm, ta đặt L = 10 cho gamma(x) và L = 4 cho gamma(d)
-> Gần giống Transformer. Tuy nhiên, Transformer dùng nó cho việc đưa vị trí rời rạc của token trong sequence làm đầu vào của 1 architecture không chứa khái niệm trật tự. Ngược lại, ta dùng function này để map continuous input coordinates vào 1 higher dimensional space để làm MLP dễ ước tính higher frequency function. Tương tự việc mô hình hóa cấu trúc 3D protein
Hierarchical volume sampling
Việc sử dụng densely evaluating để đánh giá NeRF tại N query points dọc theo camera ray là không hiệu quả do: free space (không gian trống) và occluded regions (bị che khuất) mà không đóng góp vào góc view chỉ định nhưng vẫn được lấy sample lặp đi lặp lại. Từ ý tưởng về volume rendering, ta nghĩ đến hierarchical representation.
Thay vì chỉ sử dụng single network, ta đồng thời tối ưu 2 network: 1 "coarse" và 1 "fine". Đầu tiên ta smple 1 tập Nc locations bằng stratified sampling, và đánh giá "coarse" tại các vị trí này. Với output của "coarse", ta tạo ra nhiều sampling points hơn mà thiên về volume. Để làm thế, ta cần viết lại Cc_(r) như tổng weight các sample colors ci:
Sau đó ta chuẩn hóa các weight wi thành wi_ để có piecewise_constantLấy mẫu Nf thứ 2 từ phân phối này, bằng inverse transform sampling, mạng "fine" là kết hợp cả samples thứ 1 và thứ 2, tính toán kết quả cuối của Cf_(r) (dùng Nc+Nf samples).
Phương án này phân bố thêm mẫu đến các khu vực mong muốn. Cũng đồng nghĩa hướng đến importance sampling, các giá trị được sampled không đồng nhất rời rạc (nonuniform discretization) trong toàn miền tich hợp (integration) thay vì tìm 1 ước lượng xác suất độc lập của toàn bộ tích phân (independent probabilistic estimate of the entire integral)
Implement details
Ta optimize 1 separate neural continuous volume representation network cho mỗi scene. Điều này chỉ cần dataset là RGB images của scene (ta dùng pipeline COLMAP SfM để estimate). Tại mỗi optimization iteration, ta random sample 1 tập camera rays (batch) từ tập mội pixels trong dataset rồi dùng hierarchical sampling (query Nc sample từ coarse network và Nc+Nf sample từ fine network). Sau đó volume rendering để có màu của mỗi ray từ mỗi tập sample. Vậy loss sẽ là tổng squared error cảu render và true pixel tại cả coarse và fine rendering:
Với R là tập rays trong mỗi batch, C(r), Cc_(r) và Cf_(r) là ground_truth, coarse volume predict và fine volume predict RGB colors cho ray r. Mặc dù thông qua Cf_(r) nhưng ta cũng minimize loss của Cc_(r) để weight distribution (phân phối weight) từ coarse network có thể dùng để sample trong fine networkTheo kinh nghiệm, ta setup:
- batch size của rays : 4096
- mỗi sampled tại Nc : 64
- Và thêm mỗi sampled tại Nf: 128
- Nếu dùng Adam optimizer:
+ learning rate : 5.10^-4
+ decays exponentially: 5.10^-5 (phân rã cấp số nhân)
+ Các hyperparameter còn lại để default: beta1 = 0.9, beta2 = 0. 999, epsilon = 10^-7
- Mỗi single scene dùng khoảng 100-300k iterations để converge với 1 NVIDIA V100 GPU (cỡ 1-2 ngày)
SRN Scene Representation Networks: rất mờ, bị giới hạn nhiều bởi chỉ chọn 1 depth và color mỗi camera ray
NV Neural Volumes: có thể đi vào chi tiết volumetric geometry (vật thể 3D) nhưng do sử dụng underlying explicit 128^3 voxel grid nên không thể high resolution
Local Light Field Fusion (LLFF): được thiết kế đặc biệt cho các trường hợp real world scene, là đối tượng so sánh chính. Tạo "sampling guideline" để không quá 64 pixel chênh lệch giữa các input view, nên thường không ước tính được các trường hợp chênh lệch 400-500 pixel trở lên. Thêm nữa, LLFF pha trộn các scene từ các view khác nhau, dẫn đến mất tập trung, không rõ ràng
Tradoff lớn nhất là time và space.
1 minimal implement khác (JaxNeRF)
Kaggle: https://www.kaggle.com/code/sauravmaheshkar/jax-flax-minimal-implementation-of-nerf (Google OSS Expert Prize 04/2022 Honorable Mentions 2)
Phân tích kĩ hơn tại task View Synthesis (Xem tổng hợp) - 20 phút TPU v3-8
Neural Radiance Field NeRF:
- Neural -> Neural Network
- Radiance -> Radiance of scene: số light phát ra từ 1 điểm theo mỗi hướng
- Field -> continuous and non-discretized representation
-> NeRF là model cảu 1 điểm và 1 hướng view trong 3D space mà lượng light phát ra từ điểm đó trên mỗi hướng không rời rạc (non-discrete)
Overview:
- Neural Network Ftheta là Multi-Layer Perception MLP với ReLU activation (cỡ 9 fully-connected layer với width 256 (no convolutions))
- Input của MLP có 2 component:
+ (x,y,z) tọa độ 3D
+ (theta, phi) view direction từ point
-> 5D coordinate
- Output của MLP cũng có 2 component:
- (r, g, b) view composed từ point (x, y, z) trên direction (theta, phi) trong RGB colorspace
- delta density hoặc transparency (nhòe hoặc đổ bóng) có giá trị >= 0. Nếu delta = 0 tức là không có gì ở point hoặc point là transparent, nếu = infi tức là point là opaque (mờ mịt)
-> Nhiệm vụ của Ftheta là map spatial location + viewing direction to color + density
- Problem 1: Làm sao để Neural Network nhớ 1 single image
Lấy input (x,y) và predict (r, g, b) được train bằng cách overfitting trên 1 single image với object được nhớ là single image accurately
Điều đáng ngạc nhiên là dù mô hình chứa số tham số gấp 8-10 lần số pixel trong hình vẫn không thể ghi nhớ chính xác image, ngay cả khi đào tạo cực dài
- Solution:
Nhận xét: Nếu chúng ta lấy sinusoid (sin cos) của tọa độ input với tần suất tăng dần + mở rộng vector (high-dimensional space) và đưa tất cả như feature vector vào MLP thay vì đưa trực tiếp tọa độ thì model sẽ có thể nhớ image (Forrier Transform - Fourrier Feature Mapping)
Vì sao làm được? https://arxiv.org/pdf/2006.10739.pdf giống việc học high-frequency functions (RGB image) cho low-dimensional problem domains (2D coordinate of pixel) (ví dụ keypoint detector như SIFT, SURF,superpoint, vị trí keypoint layer trước không mất đi ở layer sau)Dataset:
Ta sử dụng 100 images đầu tiên và biểu diễn pose của chúng trong training data. Cho validation, dùng 1 cặp single (image,pose). Small validation subset sẽ khôn thành vấn đề, vì về cơ bản là ta muốn network nhớ 3D scene dựa vào dữ liệu qua phép nội suy trơn (smooth interpolation) giữa các frames
Mẫu data |
Task Novel View Synthesis: Cho 1 tập sparsely (rời rạc) sampled images of scene -> render 1 image từ novel viewpoint cho trước. Để làm thế ta dùng volumetric representations, dựa vào gradient-based optimization (tối ưu đạo hàm), cho thấy ít tạo ra các sản phẩm mất tập trung hơn mesh-based method (phương pháp lưới)
Ta rendering màu của bất kì ray nào đi qua scene bằng classical volume rendering. Để tính expected color (màu dự kiến), ta tính weights cho mỗi sampled điểm dọc theo từng ray
Basic step để render images:- Từ các image. tạo 1 không gian mẫu 3D (generate_rays + compute_3d_points)
- Dùng các point trên và hướng (2D) của chúng như input của network -> tạo output là color + density (compute_radiance_field)
- Xác định color và density của các điểm khác nhau trên ráy dựa vào khoảng cách (compute_wwerights + compute_adjacent_distances) -> render đén 2D image
1 implement khác nữa cho NeRF:
Kaggle: https://www.kaggle.com/code/ritzraha/nerual-radiance-fields (Google OSS Expert Prize 04/2022 Honorable Mentions 1) - 814s GPU
Question: Có khả năng 1 neural network dự đoán color tại điểm (pixel)
-> MemorizeTa nghĩ rằng camera là nối (mapping) giữa real-world và 2D image
Data pipeline
Tìm cách mapping 2D image to 3D scene (volumetric rendering)
Ví dụ với N pixel, 1 ray đi qua mỗi pixel và mỗi point: r(t) = o+td với t là parameter, o là origin và d là unit directional vector
Những cái cần lưu ý: - Ta có thể bắn 1 ray qua 1 single pixel bằng nhiều cách khác nhau, mỗi cách có 1 viewing angle riêng
- noise được thêm vào (uniform noise) để có phân phối liên tục.
xanh là distributed point, trắng là ramdomly placed ở giữa |
mỗi pixel có 1 ray tương ứng riêng và mỗi ray sampled tại distinct points |
TinyNeRF
Bản sample giảm bớt 1 vài bước:
- Thay vì dùng 5D input thì chỉ dùng 3D input là vị trí
- Không có Hierarchical Sampling
https://www.kaggle.com/code/rkuo2000/tiny-nerf
Hierarchical sampling
Tham khảo
- https://github.com/yenchenlin/nerf-pytorch
- https://github.com/bmild/nerf
- https://github.com/nerfstudio-project/nerfstudio (NeRF apply sau này)
- https://arxiv.org/pdf/2003.08934v2.pdf
- https://www.kaggle.com/code/sauravmaheshkar/jax-flax-minimal-implementation-of-nerf (Google OSS Expert Prize 04/2022 Honorable Mentions 1 - TPU implement)
- https://www.kaggle.com/code/rkuo2000/tiny-nerf (tiny NeFT - GPU implement)
- https://www.kaggle.com/code/ritzraha/nerual-radiance-fields (Google OSS Expert Prize 04/2022 Honorable Mentions 2 - TPU implement)
- https://arxiv.org/pdf/2006.10739.pdf (Fourier Features Let Networks Learn High Frequency Functions in Low Dimensional Domains)
Nhận xét
Đăng nhận xét