Linear Algebra
🐅

CAP-UDF 읽어보기

생성일
2023/02/18 16:08
태그
UDF

Consistency-Aware Unsigned Distance Functions Progressively from Raw Point Clouds

called as CAP-UDF

Introduction

센서정보를 취득하여 surface를 리컨하는 것은 3D vision, 로보틱스 또는 그래픽스 분야에서 중요합니다!
그 중에서도 흔히 얻을 수 있는 센서정보는 바로 point cloud입니다. (실제 상황에서 라이다를 주로 활용하기 때문에, 요즘에는 아이폰에도 하나씩 달려있다 ㅡ.ㅡ)

Point Cloud에서 Surfacereconstruction하는 데 크게 2가지 방법이 있지만, 아래와 같은 문제점이 존재합니다.

SDF를 이용하여 리컨 :
open surface에 대해 표현하기 힘들다.
복잡한 형태(ex. multi-layered)에 대해 표현하기 힘들다.
UDF를 이용하여 리컨 :
surface 근처에서 smooth한 distance field 값을 얻기 힘들다.
unsigned distance field에서 곧바로 surface를 뽑아내기 힘듭니다.
위 문제를 해결하는 방법을 저자들은 아래와 같이 제안합니다.

Contribution

1.
Consistent-aware UDF를 학습하는 네트워크를 제안합니다.
2.
학습한 UDF로 부터 얻은 gradient field의 기하학적 성질을 이용해 더 정확한 surface를 추출합니다.
3.
open, multi-layer로 구성된 오브젝트도 리컨할 수 있습니다!

Method

3D shape를 표현하는 UDF를 학습하는 Network ff

Input : 3D query position q=[x,y,z]q=[x, y, z]
Output : unsigned distance value s=f(q)Rs=f(q) \in \mathbb{R}
이 때 네트워크 ff 는 오직 raw point cloud P={pi,i[1,N]}P=\left\{p_i, i \in[1, N]\right\} 를 이용해 학습한다!

1. Raw Point Cloud로만 UDF 학습하기

raw point cloud 집합에서 인접한 점들을 랜덤하게 샘플링합니다. 이를 집합 QQ 로 정의합니다.
Q={qi,i[1,M]}Q=\left\{q_i, i \in[1, M]\right\}
이 점들을 unsigned distance value f(qi)f(q_i) 만큼 f(qi)\nabla f\left(q_i\right)반대 방향으로 이동시킵니다.
zi=qif(qi)×f(qi)/f(qi)2z_i=q_i-f\left(q_i\right) \times \nabla f\left(q_i\right) /\left\|\nabla f\left(q_i\right)\right\|_2
이후 움직인 점들 집합 ZZ가장 가까운 point cloud 점의 집합 NN 사이의 거리를 Loss로 잡아 네트워크를 학습시키게 된다.
L=1Mi[1,M]zini22\mathcal{L}=\frac{1}{M} \sum_{i \in[1, M]}\left\|z_i-n_i\right\|_2^2
이를 통해 f(qi)\nabla f\left(q_i\right)surface로 부터 멀어지는 방향을 의미하게 되며, 3D 공간에서 unsigned distance가 가장 빨리 증가하는 방향을 의미합니다!
위의 과정을 Query의 위치를 다르게 반복하면서 3D query를 더 많이 raw point cloud에 가깝게 위치시켜 네트워크를 학습시킨다.

2. Consistency-Aware 필드 학습하기

위와 같은 방법은 꽤나 그럴듯하게 들리지만, 위의 식으로 Loss를 구하면 queries들이 쉽게 움직이지 못하고 갇히게 된다, 아래 그림을 보자!
Optimization Direction이 충돌하여 이도 저도 아닌 상태를 방지하기 위해, 원래 loss function에 맞게 움직일 방향을 정하고 난 뒤에 거기서의 가까운 point cloud를 찾는 방법을 사용합니다.
LCD=1Mi[1,M]minj[1,N]zipj2+1Nj[1,N]mini[1,M]pjzi2\mathcal{L}_{\mathrm{CD}}=\frac{1}{M} \sum_{i \in[1, M]} \min _{j \in[1, N]}\left\|z_i-p_j\right\|_2+\frac{1}{N} \sum_{j \in[1, N]} \min _{i \in[1, M]}\left\|p_j-z_i\right\|_2
→ 이를 통해 continuous하고 accuratesurface를 얻을 수 있습니다!

3. Progressively하게 Surface 만들기

unsigned distance를 더 정확히 구하고, 자그마한 디테일까지 살리기 위해, Progressive Learning 전략을 선택하였습니다! point cloud와 가까운 query point일수록 surface 리컨하는데 error 값이 작다는 가정하에,
High confidence region → 적은 에러 가진다, 네트워크 학습 과정에서 사용한다.
Low confidence region 높은 에러 가진다, 네트워크를 이용해 포인트를 옮긴다.
이렇게 구성한뒤 다음 학습의 Surface Prior로 사용합니다.
위와 같은 과정들을 거치면 깔끔한 UDF를 아래와 같이 얻을 수 있다고 주장합니다!

4. Surface 추출 알고리즘

SDF에서 surface Extraction을 위해 사용하는 방법은 marching cube이다. 그러나 UDF의 경우 내부/외부 테스트를 진행할수 없기 때문에 트릭을 사용한다.
micro-scale surface에 대해서 공간은 항상 2개 방향으로 나눌수 있다는 가정을 한다.
Qin={qini,i[1,L]},Qout ={qouti,i[1,I]}Q_{i n}=\left\{q_{i n}{ }^i, i \in[1, L]\right\}, Q_{\text {out }}=\left\{q_{out}{ }^i, i \in[1, I]\right\}
여기서는 gradient field f\nabla f 를 이용하여 3D grid 상에서 같은 방향인지 다른 방향을 가리키는지 구분한다.
위의 구분을 통해 두 점들이 같은 side에 있는지 아닌지를 수학적으로 판별할 수 있다.
f(qini)f(qout j)<0\nabla f\left(q_{i n}{ }^i\right) \cdot \nabla f\left(q_{\text {out }}{ }^j\right)<0
f(qini)f(qin j)>0\nabla f\left(q_{i n}{ }^i\right) \cdot \nabla f\left(q_{\text {in }}{ }^j\right)>0

위의 트릭을 이용하여 side를 두가지로 구분할 수 있으므로, marching cube 알고리즘을 사용할 수 있다!

Experiments

1. Qualitative Result (SRB-3DScene-MGD)

2. Quantitative Result

사용하는 metric은 아래와 같습니다.
Chamfer Distance : 두개의 sets of points가 얼마나 다른지를 나타내준다.
Normal Consistency : 한 mesh에 있는 normal과 가장 이웃한 mesh의 normal 간의 absolute dot 연산 결과의 평균
F-Score : 정밀도와 재현율을 결합한 지표이다. (threshold = 0.005/0.01)

3. 실제 돌려본 결과