Paper/Neural rendering

Delicate Textured Mesh Recovery from NeRF via Adaptive Surface Refinement

침닦는수건 2024. 5. 7. 13:25
반응형

내 맘대로 Introduction

 

알고리즘적 개선이 아닌 파이프라인 논문. NeRF + diff.renderer를 이용한 refinement를 붙여서 품질 좋은 mesh를 얻어내는 파이프라인을 만들고 그 속도를 최대한 가속한 논문. 최종 출력이 Blender나 unity 같은 상용툴에 입력으로 쓰일 수 있는 OBJ 같은 형태. 

 

상용툴에서 색상을 diffuse + specular로 분리해서 다루므로 논문에서도 diffuse, specular로 색깔을 나누어 다루었을 뿐 나머지는 전부 기존 논문들과 같다. 가져다 쓴 조합형 논문. 가속화하고 구현해낸 것에 의의가 있음.

 

메모

총 2 stage

1) stage1
- grid-based NeRF로 빠르게 coarse geometry + appearance 복원

2) stage2
- mesh vertex마다 offset 주고 diff.rendering으로 최적화 반복
- color도 같이 최적화함. 


stage1 

grid based NeRF 학습함. 그냥 MLP 아니고 voxel grid feature를 뽑아내는 방식 (속도 이슈 때문에 그런 것, InstantNGP 활용 때문 같기도.)

참고할 점은 activation function을 exponential activation 쓴 점. 이걸 쓰면 sharp surface modeling에 도움된다고 함.


color는 diffuse, specular network 분리함

diffuse 먼저 추정 -> diffuse+feature로부터 specular 추정

후자의 specular용 MLP2는 나중에 최종 출력에 같이 포함됨.(specular color를 Blender 나 unity에 넣어주려면 SH 여야하는데 그게 안되니까 MLP를 같이 끼워 출력)



loss는 NeRF loss 그대로가 핵심

대신 specular color는 diffuse 위에 쌓는 개념이므로 0으로 regularization 가하면서 diffuse가 먼저 학습될 수 있도록 함

sharp surface에 신경 많이 쓰는 느낌인데 per-point rendering weight (alpha compositing할 때 alpha)가 0 아니면 1로 극단적이도록 유도하는 loss를 추가함.

smoothing된 surface를 억제하는 regularization.

뒤에 따라붙는 stage 2, diff.rendering을 이용한 최적화

먼저 color 

per-point color는 NeRF에서 찾아낼 수 있음. 따라서 vertex color를 찾은 뒤, diff.rendering 수행

-> color loss 수식(6) 그대로 사용해서 업데이트.

 geometry는 per-vertex offset을 최적화하는 방식.

vertex 수랑 face 구성을 그대로 하고 위치만 바꾸면 표현력이 부족할 수 있으므로 vertex 증가/감소가 가능하도록 하고 매번 face 정의를 새로하는 adaptive control 추가


face 별로 reprojection error 계산, 높은 순으로 정렬

하위 5% (error 최소)는 face subdivision으로 증가
상위 50%는 삭제

vertex의 증식과 삭제를 반복하고, 매번 per-vertex offset을 0으로 초기화하고 face를 다시 정의하면서 최적화를 반복함.

복원 공간이 object centric이면 큰 상관없지만 열린 공간이면 장거리 영역에 대한 처리가 들어가야 메모리/속도 이슈가 없음.

따라서 InstangeNGP의 규칙을 따라 복원 공간을 나누고, 장거리 영역이라면 해상도를 낮춰서 관리함. marching cube든 뭐든.
핵심은 rendering loss(color)로 모든게 refinement되도록 하는건데 추가로 vertex를 움직이는 것이다보니 laplacian smoothing loss 추가.
coarse-to-fine 전부 다 복원되고 나면

1) mesh unwrapping -> texture UV map 획득
- diffuse, specular 2개를 얻음

2) specular의 경우, MLP2( view-dependent specular color 예측용)을 같이 envelope해서 상용툴 fragement shader 안에 넣어버려야함. (추가 구현이 필요하단 소리)

512x512x512로 초기화하고 refinement 돌리는 식

대충 3만번 정도 돌리면 충분하다고 함.


NeuS도 충분히 좋은데 너무 dense한게 문제라고 함. ㅇㅈ


한계는 반투명이나 털, 반짝이는 것들 (당연히 안되는 것들)
반응형