Paper/3D vision

NeuralUDF: Learning Unsigned Distance Fields for Multi-view Reconstruction of Surfaces with Arbitrary Topologies

침닦는수건 2023. 6. 28. 18:08
반응형

내 맘대로 Introduction

SDF를 UDF로 대체한 NeuS 논문이라고 보면 된다. SDF가 outside/inside 구분에 좋은 형태인 것은 맞지만 outside/inside 구분이 확신하려면 watertight 형태일 필요가 있다. 즉, 뚫린 부분이 있는 형상일 때 성능이 하락한다. 뚫린 부분이 있으면 안팎이 뒤집히는 ray가 있기 때문에 학습이 어려워지기 때문이다. UDF는 SDF에서 signed을 없애버림으로써 outside/inside 구분으로 인한 효과를 최소화할 수 있다고 한다. 

 

UDF는 2개의 문제가 있어 논문에서 이를 해결하는게 contribution이다. 첫번째로 occluse-aware가 아니라는 점이다. SDF처럼 음수 값이 없기 때문에 이게 어디에 부딪혀 통과했는지 아닌지 구분하는게 어렵다. 두번째로 UDF = abs(SDF)와 같은 꼴이기 때문에 0에서 non-differentiable이라는 점이다. 속도는 크게 고려하지 않았다. 

 

메모하며 읽기


Volume rendering을 그대로 따르기 때문에 핵심은 UDF와 density function 간의 수식을 정의하는 것이다. 특히 differentiable 형태로 만들 수 있는 수식을 정의하는 것에 집중한다.

추가적으로 UDF라서 발생하는 불안정성을 해결하기 위한 regularize term도 추가했다.
SDF function이 UDF function으로 바뀌었다는 것 외에는 완전히 기존 baseline과 동일하다.

UDF <-> density function을 정의할 때, unbiased하게 만들어야 한다. NeuS에서 말했 듯, 실제 표면 위치에서 density function이 0이 되어야 하고 0 기준으로 양쪽에서 대칭이어야 한다.

NeuS에서 밝혀진 바에 따르면 density function은 monotonically increasing 형태면 그게 된다고 한다.


어떻게 만들 것이냐? SDF 기반 논문에서 쓴 방식을 그대로 쓸 수 있도록 만들어서 해결한다.

처음부터 새롭게 만드는게 아니라 UDF -> SDF로 잠깐 만드는 것이다.

UDF 함수가 있으면 그 앞에 indicator functino을 붙여서 SDF처럼 만들어주고 사용한다. 

표면보다 가까우면 1, 표면보다 벌면 0인 indicator를 만들고 수식(5)와 같이 설계하면 SDF와 의미가 같다. 

zero level set을 정의할 때, SDF였다면 부호가 교차하는 지점을 찾으면 그만이지만 UDF일 경우 이렇게 찾을 수가 없으므로 특정 크기의 epsilon을 정의하고 이 값 이하면 surface로 찾는다.

epsilon을 adaptive하게 정하는 것도 일이지만 그냥 그렇게 쓴다.

더큰 문제는 indicator function을 만들어서 붙였지만 이 function 역시 step function이라 non-differentiable하다는 것이다. 
그래서 indicator를 확률적으로 다시 만든다.

수식(6)과 같이 UDF 값을 후처리해서 확률값(surface일 확률)을 만들고 이를 곱해서 수식(8)처럼 만드는 식이다.

해석해보면, 표면 전까지는 확률값이 1일 테니 1이 계속 곱해진다. 

11111

그러다 표면 근처 (epsilon 이하)를 만나면 확률값이 1이 되어 갑자기 0이 곱해진다.

111110

그러면 이후부터는 뭐가 곱해지든 계속 0이 된다.

1111100000 

이런 식이면 indicator로 쓸 수 있는 것이다. 

여전히 하나 아쉬운 것은 수식(8)로 만들면 함수 모양이 아쉽다.


표면 근처에서 뚝! 떨어져야 하는데 조금 마진을 두고 떨어지기 때문이다. 

더 뚝 떨어지게 만들기 위해서 view direction과 normal 방향이 일치하는지 체크해서 표면 전인지 후인지 알아내고 표면 전이면 강제로 0으로 만들어 버린다. 


SDF는 표면에서 멀리 떨어진 값을 냅둬도 문제가 없다 왜냐면 부호가 바뀌는 지점만 집중하기 때문에 엄청 큰 음수나 엄청 큰 양수는 방치해도 문제가 안되기 때문이다.

하지만 UDF는 양수만 존재하기 때문에 값 관리를 더 잘해야 한다. 쓰레기값이 되도록 없도록 학습을 시켜야 하는 것이다. 양수만으로 내부 외부를 다 기술해야하기 때문이다. 

그래서 UDF가 최소한 0이 함부로 되는 것은 막고자 이러한 loss를 추가한다. (SDF 경우일 때도 추가해서 나쁠 것 없을 것 같다.)
loss는 다 알만한 것들이고 patch loss만 sparseneus에서 가져왔다. patch 단위로 color loss를 주는 것으로 NeuralWarp에서도 사용한 loss다. 연산량이 엄청나게 늘어나는데 그걸 그냥 감례하는 것 같다.
반응형