Point-SLAM
Point-SLAM: Dense Neural Point Cloud-based SLAM
https://www.youtube.com/watch?v=QFjtL8XTxlU
https://github.com/eriksandstroem/Point-SLAM
Ⅰ. 연구의 배경
- Scene Representation
- grid 기반
- dense grid, hierarchial octrees, voxel hashing
- 장점: 이웃 탐색(neighborhood look up)과 컨텍스트 집계(context aggregation)가 쉽다.
- 한계: 해상도가 먼저 정의되어야 하며, 중간에 바뀔 수 없다. 즉, 메모리 낭비가 크다.
- point 기반
- 장점: point의 밀도가 미리 정의될 필요가 없다. 또한, surface에 집중되어 free space를 모델링할 필요가 없으므로 메모리 낭비가 적다.
- 한계: 이웃 탐색이 어렵다. (point간의 connectivity가 부족하다.)
- 이웃 탐색의 해결책으로는 projection을 통해 3D탐색→2D탐색으로 바꾸는 것과 grid에 point를 등록하는 것이 있다.
- network 기반
- 장점: 연속적이고 압축적인 형태로, 높은 퀄리티의 매핑을 수행할 수 있다.
- 한계: 지역적 업데이트를 허용하지 않는다. 런타임에서 network의 용량을 확장할 수 없다. (이는 forgetting problem을 일으킨다.)
- 즉, neural point feature을 3D 공간에 고정시키는 방식으로, 지역적 업데이트와 확장을 허용한다.
- 그 외의 기법
- parameterized surface elements: 유연한 형상을 표현하기 어렵다.
- axis aligned feature planes:: 과도하게 압축되어 여러 surface를 가진 경우 표현이 어렵다.
- grid 기반
Ⅱ. Neural Point Cloud
- neural points
- 위치 p (3)
-
geometric/color feature descriptor f_g (32) and f_c (32)
\[P = \{(p_i, f_i^g, f_i^c)|i = 1, ..., N\}\]
- point 추가 전략
- Input: 카메라 포즈, RGB-D 이미지
- point sampling
- image plane에서 X개 픽셀을 uniform sample한다.
- 가장 큰 color gradient를 가진 5Y개의 픽셀 중 Y개 픽셀을 uniform sample한다.
- 3D 탐색
- 역투영 후 반경=r에서 이웃을 탐색한다.
- 이웃이 없으면, ray 상에 3개의 nerual point를 추가한다. (깊이=D, (1-p)D, (1+p)D / p=(0,1) →깊이맵 노이즈 때문)
- 이웃이 있으면 point를 추가하지 않는다.
- 업데이트
- feature vector는 normally distribution으로 초기화된다.
- 깊이맵의 noise를 고려해, 3개의 point는 depth에 따라 update를 제한하는 대역으로 존재한다.
- 따라서 scene이 진행되어도, neural point cloud는 bounded points로 수렴할 수 있다.
- voxel 기반 기법과 달리 scene의 bound를 먼저 정의할 필요가 없다.
- 동적 밀도 (dynamic point density)
- fine/coarse detail을 효과적으로 모델링 가능하다.
- color gradient에 따라 반경=r을 동적으로 조정한다. (linear mapping)
- pixel location (u,v) → gradient ∇I(u, v)
- gradient가 크면 반경이 작고(lower), 작으면 반경이 크다(upper).
- 변화율이 큰 영역은 선명하게 경계가 나누어지는 디테일한 이미지로, 이웃 탐색 반경을 작게 함으로써, 많은 구(sphere?)가 만들어지고, 디테일을 보존한다.
- 변화율이 작은 영역은 세부 사항이 적은 평탄한 이미지로, 이웃 탐색 반경을 크게 함으로써, 적은 구를 만들 수 있고 이는 효율성을 크게 한다.
Ⅲ. 렌더링
-
uniform sampling points near surface
\[x_i = O + z_id, \ i ∈ \{1, ..., M\}\]- 픽셀의 깊이 D 주변, (1-p)D와 (1+p)D 사이에서 5개의 point를 uniform sample한다.
- free space를 sample하지 않고 surface 주변에서만 sample할 수 있다는 장점을 가진다.
- 깊이 값이 없는 경우
- 깊이맵 값이 없는 픽셀에 대해서 30cm부터 1.2D_max (최대 깊이) 까지 ray를 25개 sample (=ray marching) 한다.
- 이는 hole filling의 효과를 준다. (그러나 너무 큰 hole에는 효과 없음)
-
MLP (decoder)
\[o_i = h(x_i, P^g(x_i)) \\ c_i = g_ξ(x_i, P^c(xi))\]- point + geometry feature (from point) ⇒ occupancy
- point + color feature (from point) ⇒ color
- h는 미리 학습된 변하지 않는 MLP이며,
- g는 trainable parameter인 ξ을 가지는 MLP이다.
- h와 g의 구조는 같으며, 이후 Gaussian positional encoding을 적용한다.
- feature
- geometry feature
- 각 point에서 2r만큼의 크기에서 적어도 2개의 이웃을 찾으며, 그 미만이면 zero occupancy이다.
- 가장 가까운 8개의 이웃을 찾고 inverse square distance weight를 통해 geometric feature을 계산한다.
- 즉, 가까울수록 weight가 커지며, geometry feature의 영향이 커진다.
- color feature
- point-nerf에 영향받았다.
- F는 one-layer MLP이며, 128개의 neuron과 softplus activation을 가진다.
- point vector (p-x), 즉 각 이웃으로부터 포인트를 가리키는 벡터에 Gaussian positional encoding을 적용한다. → ?
- geometry feature
- volume rendering
- 전반적인 기법은 nerf와 동일하다.
-
weight function (occupancy)
\[α_i = o_{\textbf{p}_i}\prod_{j=1}^{i-1}(1 − o_{\textbf{p}_j})\] -
rendered depth, rendered color (predicted)
\[\hat{D} =\sum^N_{i=1}α_iz_i,\\ \hat{I} =\sum^N_{i=1}α_i\textbf{c}_i\] -
depth variance (분산)
\[\hat{S}_D = \sum^N_{i=1}α_i(\hat{D }− z_i)^2\]
Ⅳ. 매핑/트래킹
- 매핑
- rendering loss(=mapping loss) 계산을 통해 각 포인트에서 geometric/color feature을 최적화한다. (decoder을 최적화, interpolation decoder F도 포함)
-
L1 loss를 사용하였다. (→why? outlier에 덜 민감하기 때문?)
\[L_{map} = \sum^M_{m=1}|D_m − \hat{D}_m|_1 + λ_m|I_m − \hat{I}_m|_1\] - 처음에는 depth loss만을 이용하여 최적화하지만, 나머지 60퍼센트의 iteration에서는 color loss도 추가한다.
- 왜냐하면 처음에는 color가 매우 부정확하기 때문이다. (추측)
- 키프레임 데이터베이스를 만들어 mapping loss를 정규화한다.
- NICE-SLAM에 영향받았다.
- 키프레임과 현재 프레임의 view frustum이 많이 겹치면, (=카메라가 비슷한 방향에서 바라봄) 키프레임으로부터 픽셀을 sample한다.
- 트래킹
- 카메라 extrinsic (R, t)를 각 프레임마다 최적화한다.
- 한 프레임에서 M_t 픽셀을 샘플한다.
- simple constant speed assumption을 통해 i-2와 i-1번째 프레임의 포즈 변환만큼 i-1와 i번째(현재) 프레임의 포즈 변환을 초기화한다.
- tracking loss는 color loss와 depth loss+표준편차를 결합한다.
- 이는 iMAP에서 따온 것으로 보인다. (추후 NICE-SLAM에서도 적용됨)
- 사물의 경계는 보는 각도에 따라 깊이의 편차가 매우 크게 측정된다. 즉, loss가 큰데, 이를 해결하기 위해 정규화를 적용한 것이다.
The geometric loss measures the depth difference and uses the depth variance as a normalisation factor, down-weighting the loss in uncertain regions such as object borders:
- Exposure Compensation (선처리)
- 프레임들 간 큰 노출의 차이가 있는 경우 (color의 차이가 큼), 픽셀 간 색상 차이를 줄인다.
- per-image latent vector→ exposure MLP Gϕ → affine transformation
- tracking / mapping loss를 게산하기 전에 I^을 변화시킨다.
- MLP Gϕ
- 1 hidden layer, 128 neuron, softplus activation
- input: 8D latent vector
- output: 12D, (3x3 affine matrix + 3x1 translation)
- 다른 potential solution이 있을 수 있음
- exposure mapping을 딥러닝에 맡긴 점이 흥미로웠다..
V. 결론
- synthetic dataset인 Replica에서는 월등한 결과를 보였지만, TUM-RGBD 이나 ScanNet과 같이 실제 깊이 카메라로 촬영하여 noise가 발생하는 경우에는 tracking 성능이 떨어진다.
- 모션 블러나 반사(specularity)에 취약하다.
- 키프레임 선택 전략, 반경(radius)의 선택을 위한 color gradient의 upper/lower bound가 heuristic하게 선정되었다.
- 내 생각
- 이 논문의 contribution이 point sampling / point 추가 전략 (+이웃 탐색 전략)이라고 생각한다.
-
이 전략을 좀 더 발전시킬 수 있지 않을까 생각이 든다. 3D탐색→2D탐색도 괜찮은 생각인 것 같은데…
- 혹은 꼭 point여야 하나?는 생각이 든다. 이것을 gaussian으로 바꾼다면..?