NeRF(Neural Radiance Fields)
- NeRF는 객체의 3D 모델을 생성하는 기술이 아니라 객체를 바라보는 모든 장면을 생성하는 Novel View Synthesis 기술
- 특정 객체나 장면을 여러 뷰에서 촬영한 결과로 실제 촬영하지 않은 각도에서 view를 만들어냄으로써 3D 렌더링된 것처럼 볼 수 있는 기술
- 새로운 뷰로 관측될 때마다 MLP 네트워크를 인퍼런스하여 결과 생성(미리 저장 x)
- 장점
1. 연속적인 공간에 대한 표현을 사용하기 때문에 view 이동이 자연스러움
- 3D 모델 정보를 가지고 광선과 물체의 관계를 계산하여 렌더링 하는 기존 방식에 비해 저장 공간에 대한 부담이 적음(그러나 view가 이동할 때마다 MLP inference는 지속됨)
- 컬러값 뿐만 아니라 volume density까지 추정하기 때문에 더욱 리얼한 결과 생성
- 현재: NeRF 결과를 3D mesh 형태로 변환하거나 editing 하는 등 여러 응용 가능하며 NeRF 결과를 기반으로 장점을 유지하면서 3D mesh 모델을 생성하는 시도가 이루어짐
x, y, z, Φ, θ
NeRF: Representing Scene as Neural Radiance Fields for View Synthesis
요약

- 적은 입력 데이터(위치 정보, 방향 정보)를 통해 새로운 뷰를 합성하는 논문
- x, y, z, θ, φ 를 MLP에 입력하면 RGB와 density 값을 추출
- x,y,z는 위치, θ, φ는 방향 정보를 의미(viewing direction 검색 ㄱㄱ)
- 객체를 바라보는 모든 장면을 새로 합성하기 때문에 마치 3D 렌더링한 것과 같은 결과물을 도출
- 새로운 시점에 대한 이미지를 생성할 때 MLP를 통해 생성
- 계층적 샘플링(hierarchical sampling) 전략 사용을 통해 MLP 용량 할당
- 각 입력 5D 좌표를 positional encoding을 통해서 최적화
NeRF
1. 방법론

- 입력(5D): 3D location x = (x, y, z) and 2D viewing direction (θ, φ)
- 출력: color c = (r, g, b) and volume density σ
- 방법론
a. camera rays를 따라 5D 좌표 샘플링
b. 5D 좌표를 MLP에 입력하여 color와 density 정보 추출
c. volume rendering 기술을 사용하여 값 생성
d. volume rendering 기술은 미분이 가능하기 때문에 합성된 이미지와 GT간의 잔차를 최소화하면서 장면 최적화
- FΘ : (x, d) → (c, σ)를 목표로 가중치를 최적화 해야한다.
- x는 위치 정보, d는 방향 정보인 입력을 의미
- c는 RGB 정보, σ는 density 인 출력을 의미
- c는 x와 d 모두 사용해서 값을 예측한다. 왜냐하면 색상 정보 c는 시점(방향 정보)에 따라서 빛이 반사하는 정도 등 색상 정보가 달라지기 때문에 x, d 모두를 통해 예측한다.
- σ는 x만 사용해서 값을 예측한다. 왜냐하면 σ는 해당 좌표에 물체가 있는지 없는지 정보만 파악하면 되고 방향 정보는 불필요하기 때문이다.

(출처: https://www.youtube.com/watch?v=dyGCqLLBz50&t=185s)
- 위 수식은 복잡해보이지만 목적이 한 픽셀에 해당하는 값인 C(r) 구하기인 volume rendering 과정이다.
- 한 픽셀값을 구하기 위해서는 camera ray를 쐈을 때 해당 ray에 위치하는 sample point인 t에 대한 정보를 통해 값을 구한다. 쉽게 생각해서 ray 위에 있는 sample point t들이 있을 것이고, 해당 t의 색상값과 t 위치에 가려진 게 없고(1)/많고(0)에 따라서 C(r)을 구하면 된다. 즉,
- (앞에 가려진 부분이 적고(투과도) x 물체가 있고(density) x 색상값(r))이면 해당 색상 정보가 강하게 들어갈 것이고
- (앞에 가려진 부분이 많고(투과도) x 물체가 없고(density) x 색상값(r))이면 해당 t에 대한 색상 정보가 약하게 들어갈 것이다
- T(t): camera로부터 쏜 ray가 현재 물체가 있는 지점까지 도달할 확률. 즉, 어느 시점까지 누적된 density 값이 크다는 것은 가려진다!는 것이기 때문에 T(t)가 작아짐. density가 클수록 weight가 작아짐
- σ(r(t)): t 지점의 색상 정보를 통해 얻은 density(말이 길어서 그렇지 이미 위에서 한 번 언급한 내용을 식으로 썼을 뿐)
- c(r(t)),d): t 지점의 색상 정보와 viewing direction을 통해 얻은 rgb 값(위에서 언급한 내용 맞음)
- 위 세 값을 곱하고 t_near~t_far까지의 적분을 통해 픽셀 값을 구하는 것
- 하단 식은 코드로 일정하게 ray를 쪼개서 t를 sampling 하면 continueous하지 못하기 때문에 random sampling을 통해 t를 sampling 함.
2. Optimizing
- 위 방법론처럼 진행하면 고차원 정보를 잃어버리거나 view에 따른 시점 변화(조명 변화 등)가 잘 포착되지 않음
- 이를 해결하기 위해 positional encoding과 hierarchical volume sampling 방법 제안
2.1. Positional encoding
- 기존 5D 정보만 이용하면 low frequency에만 집중하게 된다.
- 쉽게 생각해서 C(r)을 정할 때 t_near부터 t_far의 x, y, z, θ, φ 값을 통해 구하게 되는데 픽셀(시점)이 바라보는 값이 크게 다르지 않을 것이다.(==고주파 정보를 못 찾을 가능성이 크다.)

- 위치 정보의 차원은 10차원으로 늘려서 3(x,y,z) 10(차원) 2(sin,cos) = 60개의 데이터로 늘림
- viewing direction은 4차원으로 늘려서 3(직각 좌표계) 4(차원) 2(sin, cos) = 24개의 데이터로 늘림
- 이렇게 positional encoding을 통해 차원의 수를 늘림으로써 더 높은 차원 공간의 매핑하여 고차원 정보 추출에 더 쉽게 접근할 수 있도록 유도
2.2. Hierarchical volume sampling
- 이 전략은 쉽게 말해 density가 높은 값을 위주로 point를 다시 sampling 하는 전략이다.
- 왜냐하면 density가 높을수록 point가 의미있을 확률이 높기 때문이다.
- sampling 방법을 다시 돌아보면, ray가 있고 아래와 같은 deterministic sampling을 진행할 경우 매 iteration마다 같은 point들만 sampling 되기 때문에 point와 point 사이는 학습이 이루어지지 않는다.
Deterministic sampling: ----ㅇ----ㅇ----ㅇ----ㅇ----ㅇ-->
- 그래서 NeRF에서는 각 bin 마다 sampling을 하지만 bin 내부에서는 random하게 sampling하여 학습 효율을 높인다.
Stratified sampling: ----|-ㅇ---|ㅇ----|--ㅇ--|---ㅇ-|-->
- Hierarchical volume sampling
- coarse 단계: 먼저 Stratified sampling을 통해 64개의 sampling point를 찾는다.
- fine 단계: 다음으로 object가 가까울수록 density가 높아지는 weight를 사용하여 추가적으로 sampling을 128개 더 한다.

3. Loss

최종적으로 왼쪽은 coarse 단계에서 얻은 RGB 값과 GT 간의 차이를, 오른쪽은 fine 단계에서 얻은 RGB 값과 GT 간의 차이를 구하고 두 값을 더하여 Loss를 계산한다.
[참고]
https://mvje.tistory.com/158
https://www.youtube.com/watch?v=dyGCqLLBz50&t=185s
https://nuggy875.tistory.com/168