class: center, middle, inverse, title-slide .title[ # GSO-SLAM: Bidirectionally Coupled Gaussian Splatting and Direct Visual Odometry ] .subtitle[ ## 2026 (RA-L) ] .author[ ###
Jiung Yeon, Seongbo Ha, Hyeonwoo Yu† Sungkyunkwan University
] .date[ ### 2026.02.27 ] --- <style type="text/css"> .title-slide .remark-slide-number { display: none; } .contents-list { font-size: 30px; font-family: 'Trebuchet MS', sans-serif; line-height: 1.5; } .main-text { font-size: 30px; font-family: 'Trebuchet MS', sans-serif; line-height: 1.5; } .remark-slide-content ul { font-size: 20px; } .remark-slide-content ul ul { font-size: 18px; } .remark-slide-content ul ul ul { font-size: 15px; } .remark-slide-number { font-size: 16px; bottom: 40px; right: 10px; } .remark-slide-content:not(.title-slide)::before { content: ""; position: absolute; bottom: 8px; right: 10px; width: 80px; height: 30px; background: url('fig/lab_logo.jpg') no-repeat center; background-size: contain; } .bottom-center-img { position: absolute; bottom: 60px; left: 50%; transform: translateX(-50%); max-width: 80%; } .bottom-right-img { position: absolute; bottom: 60px; right: 20px; max-width: 40%; } .pull-left, .pull-right { width: 48%; } .pull-left { margin-top: 30px; } .pull-left img, .pull-right img { display: block; width: 100%; } .caption-left { position: absolute; bottom: 50px; left: 25%; transform: translateX(-50%); font-size: 16px; font-style: italic; } .caption-right { position: absolute; bottom: 50px; right: 25%; transform: translateX(50%); font-size: 16px; font-style: italic; } /* .title-slide::after { content: "Computer Vision and Robotics Laboratory, Minsu Kim"; position: absolute; bottom: 30px; left: 50%; transform: translateX(-50%); font-size: 22px; color: #ffffff; font-weight: bold; } */ </style> <!-- class: title-slide count: false --> # Contents .contents-list[ 1. Introduction 2. Method 3. Experiments 4. Conclusion ] --- # Introduction .pull-left[ - SLAM(Simultaneous Localization and Mapping)은 로봇, AR/VR 등에서 필수적인 기술 - 정확한 pose estimation뿐 아니라, 기하학적으로 정밀한 dense reconstruction에 대한 수요 증가 - INR(Implicit Neural Representation) 기반 SLAM이 등장했으나, 높은 연산 비용으로 실시간 적용에 한계 - iMAP, NICE-SLAM, Co-SLAM, Point-SLAM 등 - Gaussian Splatting(GS) 기반 SLAM이 대안으로 부상 - 명시적 Gaussian primitive와 GPU 가속 rasterization 기반 렌더링 - MonoGS, SplaTAM, GS-SLAM 등 → GS의 dense SLAM에서의 효과성 입증 ] .pull-right[ <img src="fig/fig_1.png" width="60%"/> ] --- # Introduction ### Limitations of Existing GS-SLAM Methods - **Coupled 방식** (MonoGS, SplaTAM, GS-SLAM): - 통합된 scene을 tracking과 mapping에 공유하여 re-rendering loss 기반 tracking 수행 - 하지만 tracking에 반복적인 rendering과 optimization이 필요 → **실시간 처리 어려움** - **Loosely coupled 방식** (Photo-SLAM, MGSO): - ORB-SLAM3, DSO 등 기존 tracking framework와 GS를 독립적으로 통합 - 속도 문제는 해결하지만, tracking과 mapping이 **독립적으로 동작** → dense scene을 tracking에 활용 불가 - Scene geometry 정보가 scene optimization에 제한적으로만 반영 --- # Introduction ### GSO-SLAM의 제안 - **Bidirectional Coupling**: Visual Odometry(VO)와 Gaussian Splatting(GS)을 양방향으로 결합 - DSO(Direct Sparse Odometry)와 2D Gaussian Splatting 기반 mapping의 joint optimization - **EM(Expectation-Maximization) Framework**: - Joint optimization을 EM으로 정식화 → **추가 연산 비용 없이** VO의 semi-dense depth와 GS representation을 동시에 최적화 - **Gaussian Splat Initialization**: - DSO의 image gradient, keyframe pose, pixel association을 활용하여 초기 Gaussian 파라미터를 결정 - Heuristic 초기화 방법 불필요 → 수렴 가속화 .center[ <img src="fig/fig_2.png" width="60%"/> ] --- # Method ### Preliminaries - Direct Sparse Odometry (DSO) - Direct Sparse Odometry (DSO)는, 이미지를 사용해서 loss를 구하는 photometric loss기반이라 'Direct'라 씀 - 하지만, 모든 이미지 픽셀을 사용하는것은 쉽지 않다.(연산량 너무많음) - 따라서, 그 중 gradient가 큰 픽셀만 선택해서 사용하기에 'Sparse'라고 함 - 그래서 'Direct Sparse Odometry'라고 불리는 것 - DSO는, 이미지 `\(I\)`로부터, 최적의 camera poses `\(P^*\)`와 depth maps `\(D^*\)`를 추정하는 문제로 정의 - 관측된 이미지 `\(I\)`를 가장 잘 설명하는 `\(P^*\)`와 `\(D^*\)`를 찾자..! `$$P^*, D^* = \arg\max_{P,D} p(I \mid P, D)$$` - 어떻게..? - Phtometric loss를 구해서, 오차를 최소화하는 방식 --- # Method `$$E_{pj} = \sum_{\mathbf{p} \in \mathcal{N}_p}\left\| \left(I_j[\mathbf{p}'] - b_j\right) - \frac{t_j e^{a_j}}{t_i e^{a_i}}\left(I_i[\mathbf{p}] - b_i\right)\right\|$$` - 여기서 `\(E_{pj}\)`는, reference frame `\(i\)`의 pixel `\(\mathbf{p}\)`와 target frame `\(j\)`의 reprojected pixel `\(\mathbf{p}'\)` 간의 photometric error - Sparse라며,, `\(\mathbf{p}\)`는 어떻게 찾는가? - 32x32 크기의 block으로 이미지를 나누고, 각 pixel gradient의 절댓값중 중앙값에서 + 7 threshold로 설정 - 이렇게 하면, 하얀 벽처럼 textureless한 곳에서도 픽셀을 뽑을 수 있음(well-distributed) - 선택된 pixel `\(\mathbf{p}\)`는, 특정 pattern을 만들어, 이들은 `\(\mathcal{N}_p\)`에 속함 <img src="fig/pattern_compare.png" style="position: absolute; top: 450px; left: 200px; width: 40%;"/> <img src="fig/pattern_detail.png" style="position: absolute; top: 450px; left: 750px; width: 17%;"/> --- # Method `$$E_{pj} = \sum_{\mathbf{p} \in \mathcal{N}_p}\left\| \left(I_j[\mathbf{p}'] - b_j\right) - \frac{t_j e^{a_j}}{t_i e^{a_i}}\left(I_i[\mathbf{p}] - b_i\right)\right\|$$` - `\(\mathbf{p}'\)`은, 아래와 같이 reprojection으로 구할 수 있음 `$$\mathbf{p}' = \Pi_c\left(\mathbf{R}\,\Pi_c^{-1}(\mathbf{p}, d_p) + \mathbf{t}\right)$$` - 여기서, `\(d_p\)`는 pixel의 inverse depth이고, reference frame에서의 pixel을 unprojection하고, 좌표계 변환을 거친 뒤 re-projection을 통해 current frame에서의 pixel `\(\mathbf{p}'\)`를 구할 수 있음 - 여기서, 조도의 변화를 보정하기 위해 bias를 빼고, exposure time을 보정하는 항이 추가됨 - 마지막으로 앞서 구한 photometric error를 모든 keyframe과 선정된 pixel들에 대해 합산하면 photometric loss가 됨 - 이 loss가 곧 M-step에서 최적화하려는 loss가 됨(이따뒤에서 만나요🖐️) `$$E_{\text{photo}} := \sum_{i \in \mathcal{F}} \sum_{\mathbf{p} \in \mathcal{P}_i} \sum_{j \in \text{obs}(\mathbf{p})} E_{\mathbf{p}j}$$` --- # Method ### Preliminaries - 2D Gaussian Splatting (2DGS) - 3D가 아닌 **2DGS**를 썼다 왜? - 이미지만으로 dense 3D geometry를 추정하는 것은 정보가 부족(2D로부터 3D)한 까다로운 문제(ill-posed)이므로, 이를 효과적으로 모델링하기 위해 2D Gaussian Splatting 사용 - 각 2D 가우시안은 (`\(\mu, \Sigma, \alpha, c\)`)으로 정의되며, 렌더링과 최적화 과정의 연산 부담을 줄이기 위해 복잡한 Spherical Harmonics(SH) 제외(RGB color만 사용?) - 3D 공간의 교차점을 평가하는 3DGS와 달리, 2DGS는 **ray와 2DGS의 교차(ray-splat intersection)** 방식을 사용하여 기하학적 모호함을 줄임. - 이러한 2DGS의 고유한 렌더링 방식 덕분에 **다양한 시점에서 봐도 일관된 깊이(multi-view consistent depth)**를 얻을 수 있어, SLAM이나 표면 재구성(surface reconstruction) 작업에서 기하학적 정확도가 훨씬 뛰어남. --- # Method ### Joint optimization - 단순히 Bundle Adjustment(BA)를 통해 얻은 pose와 point로 2DGS에게 넘겨줘서 최적화 하는 방식은, photometric loss로 2DGS만 최적화되는데, pose가 정확하지 않을 때에는 error을 가진채로 열심히 최적화 - 이상한 곳으로 빠져 열심히 이상한 일을 한다. - 따라서, 본 논문에서는 **Joint optimization**을 통해 BA와 2DGS가 서로 영향을 주고받으며 최적화 되도록 제안 - DSO tracking과 dense reconstruction이 상호작용하여, 통합된 프레임워크 내에서 error를 공동으로 수정 - SLAM에선 Joint optimization, tightly coupled 방식이라고 하기도 하지요..? --- # Method ### Joint optimization - EM Algorithm - Expectation & Maximization (EM) 알고리즘은, Hard assignment인 K-means clustering과 달리, latent variable의 확률적 분포를 고려하여 최적화하는 방법, **Soft assignment..!** - EM 증명을 위해서, PRML책의 내용을 따라가보면,,, - GMM의 확률분포는 아래와 같이 표현 `$$p(\mathbf{x}) = \sum_{k=1}^{K} \pi_k \mathcal{N}(\mathbf{x} \mid \boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k)$$` - 여기서, `\(\mathbf{x}\)`가 어느 distribution에 속하는지 모르기에, K-dimensional binary random variable `\(z\)`를 추가 - latent variable의 등장, 1-of-K encoding, (`\(0 \leq \pi_k \leq 1\)`) `$$p(z_k = 1) = \pi_k, \quad \sum_{k=1}^{K} \pi_k = 1,\quad p(\mathbf{z}) = \prod_{k=1}^{K} \pi_k^{z_k}$$` --- # Method - 즉, latent variable인 `\(z_k\)`가 1일때, `\(\mathbf{x}\)`가 `\(k\)`번째 Gaussian에서 나올 확률 `$$p(\mathbf{x}|z_k = 1) = \mathcal{N}(\mathbf{x}|\boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k)$$` - 따라서, 모든 경우의 수를 고려해서 수식을 general하게 다시 쓰면, `$$p(\mathbf{x}|\mathbf{z}) = \prod_{k=1}^{K} \mathcal{N}(\mathbf{x}|\boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k)^{z_k}$$` - 앞서 만든 latent variable의 확률과, conditional probability를 곱하면? joint probability!(product rule) $$ p(\mathbf{z})p(\mathbf{x}|\mathbf{z}) = p(\mathbf{x}, \mathbf{z}) = \prod_{k=1}^{K} \pi_k^{z_k} \mathcal{N}(\mathbf{x}|\boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k)^{z_k}$$ - 여기서, Sum rule을 이용해서 latent variable을 marginalized out 하면, 우리가 원래 구하려던 GMM의 확률분포! `$$p(\mathbf{x}) = \sum_{\mathbf{z}} p(\mathbf{z})p(\mathbf{x}|\mathbf{z}) = \sum_{k=1}^{K} \pi_k \mathcal{N}(\mathbf{x}|\boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k)$$` --- # Method - 즉, GMM의 확률분포는, latent variable `\(z\)`가 1인 경우의 확률과, `\(z\)`의 확률을 곱해서 모든 경우의 수를 고려한 joint probability를 구하고, - 이 joint probability에서 latent variable을 marginalized out 하면, 우리가 원래 구하려던 GMM의 확률분포가 나옴 - 여기서, **responsibility** `\(\gamma(z_k)\)`는, `\(\mathbf{x}\)`가 주어졌을 때 `\(k\)`번째 component에 속할 사후 확률(posterior, Bayes' rule) $$ p(\mathbf{z} | \mathbf{x}) = \frac{p(\mathbf{z}) p(\mathbf{x}|\mathbf{z}) }{p(\mathbf{x})} $$ `$$\gamma(z_k) \equiv p(z_k = 1 \mid \mathbf{x}) = \frac{p(z_k=1)\,p(\mathbf{x}|z_k=1)}{\displaystyle\sum_{j=1}^{K} p(z_j=1)\,p(\mathbf{x}|z_j=1)} = \frac{\pi_k \mathcal{N}(\mathbf{x}|\boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k)}{\displaystyle\sum_{j=1}^{K} \pi_j \mathcal{N}(\mathbf{x}|\boldsymbol{\mu}_j, \boldsymbol{\Sigma}_j)}$$` - 이것이 **E step**에 해당한다! --- # Method - 다음은 **M step**에서, 이 responsibility를 이용해서 GMM의 파라미터 `\(\pi_k, \boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k\)`를 업데이트 하는 것 - Point가 여러개 주어졌을 때, 그리고 업데이트할 파라미터들을 추가하고 log를 씌워 수식을 다시 써보면, `$$\ln p(\mathbf{X}|\boldsymbol{\pi}, \boldsymbol{\mu}, \boldsymbol{\Sigma}) = \sum_{n=1}^{N} \ln \left\{ \sum_{k=1}^{K} \pi_k \mathcal{N}(\mathbf{x}_n | \boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k) \right\}$$` - 위 식을 `\(\boldsymbol{\mu}_k\)`에 대해 미분해서 0으로 놓고 풀면, `\(\boldsymbol{\mu}_k\)`의 closed-form 해를 얻을 수 있음 `$$0 = -\sum_{n=1}^{N} \underbrace{\frac{\pi_k \mathcal{N}(\mathbf{x}_n|\boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k)}{\sum_j \pi_j \mathcal{N}(\mathbf{x}_n|\boldsymbol{\mu}_j, \boldsymbol{\Sigma}_j)}}_{\gamma(z_{nk})} \boldsymbol{\Sigma}_k^{-1}(\mathbf{x}_n - \boldsymbol{\mu}_k)$$` - `\(\boldsymbol{\Sigma}_k\)`을 곱하고 정리하면 `\(\boldsymbol{\mu}_k\)`의 closed-form 해: `$$\qquad \boldsymbol{\mu}_k = \frac{1}{N_k}\sum_{n=1}^{N}\gamma(z_{nk})\mathbf{x}_n, \qquad N_k = \sum_{n=1}^{N}\gamma(z_{nk})$$` --- # Method .pull-left[ - 양변에 `\(\boldsymbol{\Sigma}_k\)`를 곱해서 역행렬 제거 `$$0 = \sum_{n=1}^{N}\gamma(z_{nk})(\mathbf{x}_n - \boldsymbol{\mu}_k)$$` - 분배하고 `$$0 = \sum_{n=1}^{N}\gamma(z_{nk})\mathbf{x}_n - \sum_{n=1}^{N}\gamma(z_{nk})\boldsymbol{\mu}_k$$` - 넘겨서 정리하고 `$$\sum_{n=1}^{N}\gamma(z_{nk})\mathbf{x}_n = \sum_{n=1}^{N}\gamma(z_{nk})\boldsymbol{\mu}_k$$` ] .pull-right[ - `\(\boldsymbol{\mu}_k\)`는 `\(n\)`에 의존하지 않으므로, `\(\boldsymbol{\mu}_k\)`를 합 밖으로 빼내고 `$$\sum_{n=1}^{N}\gamma(z_{nk})\mathbf{x}_n = \boldsymbol{\mu}_k\!\left(\sum_{n=1}^{N}\gamma(z_{nk})\right)$$` - 나눠주면 `$$\boldsymbol{\mu}_k = \frac{\displaystyle\sum_{n=1}^{N}\gamma(z_{nk})\mathbf{x}_n}{\displaystyle\sum_{n=1}^{N}\gamma(z_{nk})}$$` - 뿅 `$$\qquad \boldsymbol{\mu}_k = \frac{1}{N_k}\sum_{n=1}^{N}\gamma(z_{nk})\mathbf{x}_n, \quad N_k = \sum_{n=1}^{N}\gamma(z_{nk})$$` ] --- # Method - 같은 방식으로 `\(\boldsymbol{\Sigma}_k\)`에 대해 미분하면: `$$\boldsymbol{\Sigma}_k = \frac{1}{N_k}\sum_{n=1}^{N}\gamma(z_{nk})(\mathbf{x}_n - \boldsymbol{\mu}_k)(\mathbf{x}_n - \boldsymbol{\mu}_k)^\top$$` - `\(\pi_k\)`는 `\(\sum_k \pi_k = 1\)` 제약 하에 Lagrange multiplier로 최대화: `$$\ln p(\mathbf{X}|\boldsymbol{\pi}, \boldsymbol{\mu}, \boldsymbol{\Sigma}) + \lambda\!\left(\sum_{k=1}^{K}\pi_k - 1\right), \quad 0 = \sum_{n=1}^{N}\frac{\mathcal{N}(\mathbf{x}_n|\boldsymbol{\mu}_k,\boldsymbol{\Sigma}_k)}{\sum_j \pi_j \mathcal{N}(\mathbf{x}_n|\boldsymbol{\mu}_j,\boldsymbol{\Sigma}_j)} + \lambda , \quad \lambda = -N$$` - 위의 식 정리하고, 양변에 `\(\pi_k\)`를 곱하면, `\(\pi_k\)`의 closed-form 해: `$$\pi_k = \frac{N_k}{N}$$` --- # Method ### General EM Algorithm - 앞서 GMM에서 EM 알고리즘을 유도한 과정을 일반적인 모델로 확장하면, EM 알고리즘의 일반적인 형태를 얻을 수 있음 - Latent variable `\(\mathbf{Z}\)`가 있는 모델에서, 관측된 데이터 `\(\mathbf{X}\)`의 log-likelihood를 최대화하는 문제 - 잠재변수 외에, 최적화하고자 하는 파라미터를 `\(\theta\)`로 두고, 아래와 같이 쓸 수 있다 `$$\ln p(x) = \ln \sum_{\mathbf{z}} p(x, \mathbf{z})$$` `$$\ln p(\mathbf{X}|\theta) = \ln \left\{ \sum_{\mathbf{Z}} p(\mathbf{X}, \mathbf{Z}|\theta) \right\}$$` - 이 문제는, 앞과 똑같이, logarithm 내에 sum이 들어가있는 풀기 어려운 구조 - 따라서, complete-data라고 **가정**해서 문제를 풀어보자 - complete-data likelihood는, 관측된 데이터 `\(\mathbf{X}\)`와 latent variable `\(\mathbf{Z}\)`가 모두 주어졌을 때의 likelihood - Complete data set `$$\left\{ \mathbf{X}, \mathbf{Z} \right\}$$` --- # Method - Complete-data 의 likelihood는, 파라미터가 주어졌을 때 $$ \ln p(\mathbf{X}, \mathbf{Z}|\theta) $$ - 다만, 현실은 incomplete-data이므로 보통 `\(\mathbf{X}\)`만 주어지는데, 따라서 우리가 아는 정보는 $$ p(\mathbf{Z}|\mathbf{X}, \theta) $$ - 완전한 정보를 알 수 없기때문에, 우리가 아는 정보로 complete-data likelihood의 기대값을 구해보자 `\(\rightarrow\)` E step! - E step에서는 `\(\mathbf{X}\)`를 알고있고, 현재 알고있는, 고정된 파라미터를 `\(\theta _{old}\)`라고 함 $$ p(\mathbf{Z}|\mathbf{X}, \theta_{old}) $$ - 이를 이용해서 complete-data log-likelihood의 기대값 `\(\mathcal{Q}(\boldsymbol{\theta}, \boldsymbol{\theta}^{\text{old}})\)`를 정의하고(E step), M step에서는 이 `\(\mathcal{Q}\)`를 최대화하는 `\(\boldsymbol{\theta}\)`를 찾음: `$$\mathcal{Q}(\boldsymbol{\theta}, \boldsymbol{\theta}^{\text{old}}) = \sum_{\mathbf{Z}} p(\mathbf{Z}|\mathbf{X}, \boldsymbol{\theta}^{\text{old}}) \ln p(\mathbf{X}, \mathbf{Z}|\boldsymbol{\theta}) , \quad \boldsymbol{\theta}^{\text{new}} = \underset{\boldsymbol{\theta}}{\arg\max}\; \mathcal{Q}(\boldsymbol{\theta}, \boldsymbol{\theta}^{\text{old}})$$` --- # Method - GMM으로 다시 위 수식을 써보면, --- # Method --- # Method <img src="fig/PRML_em.png" style="position: absolute; top: 100px; left: 200px; width: 70%;"/> --- # Method ### EM Algorithm의 GSO-SLAM으로의 적용 - PRML의 GMM에서 봤던 EM과 동일한 구조 → GSO-SLAM에 그대로 적용 | PRML (GMM) | GSO-SLAM | |---|---| | Observed data `\(\mathbf{X}\)` | 이미지 시퀀스 `\(I\)` | | Latent variable `\(\mathbf{Z}\)` | 2D Gaussian scene `\(\mathcal{G}\)` | | Parameters `\(\boldsymbol{\theta} = (\boldsymbol{\pi}, \boldsymbol{\mu}, \boldsymbol{\Sigma})\)` | Camera pose & depth `\((P, D)\)` | | E-step: responsibility `\(\gamma(z_{nk})\)` 계산 | E-step: `\(\mathcal{G}^*\)` MAP 추정 (scene 업데이트) | | M-step: `\(\boldsymbol{\mu}_k, \boldsymbol{\Sigma}_k, \pi_k\)` 업데이트 | M-step: `\((P, D)\)` 업데이트 (BA + Depth Reg.) | --- # Method ### Complete-data Likelihood - 논문에서는 `\(p(I, \mathcal{G}|P, D)\)` 대신 **algebraic convenience**를 위해 `\(p(I, D, \mathcal{G}|P)\)`를 사용 `$$p(I, D, \mathcal{G}|P) = p(I, \mathcal{G}|D, P) \cdot p(D|P)$$` - 치환해서 쓰면: `$$A=(I,\mathcal{G}),\; B=D,\; C=P, \quad p(A, B|C) = p(A|B,C)\,p(B|C)$$` `$$p(I, \mathcal{G}, D\,|\,P) = p(I, \mathcal{G}\,|\,D, P)\cdot p(D\,|\,P)$$` - log를 취하면: `$$\ln p(I, \mathcal{G}, D\,|\,P) = \ln p(I, \mathcal{G}\,|\,D, P) + \underbrace{\ln p(D\,|\,P)}_{\text{uniform prior} \;\Rightarrow\; \text{const}} = \log p(I, \mathcal{G}\,|\,D, P) + C$$` --- # Method ### Joint Optimization: E-step - `\(P\)`와 `\(D\)`를 고정, `\(\mathcal{G}\)`를 MAP로 업데이트: `$$\mathcal{L}(q, P, D) = \mathbb{E}_{q(\mathcal{G})}[\log p(I, D, \mathcal{G}|P)] \tag{5}$$` - `\(q(\mathcal{G}) \approx \delta(\mathcal{G} - \mathcal{G}^*)\)` (`\(\delta\)`-function 근사) → MAP estimation으로 단순화: `$$\mathcal{G}^* = \underset{\mathcal{G}}{\arg\max}\log p(\mathcal{G}|I,D,P) \propto \underset{\mathcal{G}}{\arg\max}\log p(I|\mathcal{G},D,P)\,p(D|\mathcal{G},P)\,p(\mathcal{G}|P)$$` `$$= \underset{\mathcal{G}}{\arg\min}\; \underbrace{-\log p(I|\mathcal{G},D,P)}_{\text{RGB Rendering Loss}} \underbrace{-\log p(D|\mathcal{G},P)}_{\text{Semi-dense Depth Loss}} \underbrace{-\log p(\mathcal{G}|P)}_{\text{Normal Consistency Loss}} \tag{6}$$` - 각 loss를 구체화하면: `$$\mathcal{G}^* = \underset{\mathcal{G}}{\arg\min}\; \underbrace{(1-\lambda)\mathcal{L}_1(I_r, I_{gt}) + \lambda\,\mathcal{L}_{D\text{-SSIM}}(I_r, I_{gt})}_{\text{RGB}} + \underbrace{\lambda_d \mathcal{L}_1(D_r, D)}_{\text{Depth}} + \underbrace{\lambda_n \mathcal{L}_n}_{\text{Normal}} \tag{7}$$` --- # Method ### Joint Optimization: M-step - E-step에서 얻은 `\(\mathcal{G}^*\)`를 고정, `\(P\)`와 `\(D\)`를 업데이트: `$$P^*, D^* = \underset{P,D}{\arg\max}\log p(I, D, \mathcal{G}^*|P)$$` `$$= \underset{P,D}{\arg\min}\; \underbrace{-\log p(I|\mathcal{G}^*,D,P)}_{\text{BA Term}} \underbrace{-\log p(D|\mathcal{G}^*,P)}_{\text{Depth Regularization Term}} - \log p(\mathcal{G}^*|P) \tag{8}$$` - **BA Term**: 기존 DSO의 photometric loss (`\(E_\text{photo}\)`) 그대로 사용 - `\(\mathcal{G}^*\)` 고정 시 `\(-\log p(\mathcal{G}^*|P)\)`는 `\(P\)`에 대한 영향 미미 → 무시 - **Depth Regularization Term**: E-step의 `\(\mathcal{G}^*\)`에서 렌더링한 depth와 DSO depth의 **weighted average** - 매 iteration마다 depth re-rendering은 연산 과다 → averaging으로 대체 - Basin of attraction 내에서 안정적인 초기화 역할 → high-frequency geometric detail 복원 유리 --- # Method ### Joint Optimization: EM에서 Loss 유도 정리 .pull-left[ **PRML EM 일반 형태:** 1. E-step: `\(q(\mathbf{Z}) = p(\mathbf{Z}|\mathbf{X}, \boldsymbol{\theta}^{\text{old}})\)` 2. M-step: `\(\boldsymbol{\theta}^{\text{new}} = \arg\max_{\boldsymbol{\theta}} \mathcal{Q}(\boldsymbol{\theta}, \boldsymbol{\theta}^{\text{old}})\)` **$\delta$-function 근사 시:** 1. E-step: `\(\mathbf{Z}^* = \arg\max_{\mathbf{Z}} \; p(\mathbf{Z}|\mathbf{X}, \boldsymbol{\theta})\)` 2. M-step: `\(\boldsymbol{\theta}^* = \arg\max_{\boldsymbol{\theta}} \log p(\mathbf{X}, \mathbf{Z}^*|\boldsymbol{\theta})\)` ] .pull-right[ **GSO-SLAM에서:** 1. **E-step** (`\(P, D\)` 고정, `\(\mathcal{G}\)` 최적화): - `\(\mathcal{G}^* = \arg\min_{\mathcal{G}} \; \mathcal{L}_{\text{E-step}}\)` (Eq. 7) - RGB loss + Depth loss + Normal loss 2. **M-step** (`\(\mathcal{G}^*\)` 고정, `\(P, D\)` 최적화): - `\((P^*, D^*) = \arg\min_{P,D} \; \mathcal{L}_{\text{M-step}}\)` (Eq. 8) - BA Term + Depth Regularization 3. 반복 → **수렴 보장** (ELBO 단조 증가) ] --- # Method ### Joint Optimization: 수렴성 연결 - PRML의 EM 수렴성 증명에서 보았듯이: `$$\ln p(I|\boldsymbol{\theta}^{\text{new}}) \geq \ln p(I|\boldsymbol{\theta}^{\text{old}})$$` - GSO-SLAM에서 `\(\boldsymbol{\theta} = (P, D)\)`이고, `\(\delta\)`-function 근사를 사용하므로: - E-step에서 `\(\mathcal{G}^*\)`를 MAP로 찾으면, `\(\mathcal{L}(q, \boldsymbol{\theta})\)`를 최대화 (lower bound tight) - M-step에서 `\((P, D)\)`를 최적화하면, lower bound를 올림 - 함께 log-likelihood를 **단조 증가**시킴 - **실제 구현에서의 핵심**: - E-step (2DGS optimization)은 별도 thread에서 병렬 실행 - M-step (DSO의 BA)은 main thread에서 실행 - 추가 연산 비용 없이 bidirectional coupling 달성 --- # Method ### Gaussian Splat Initialization: 개요 - DSO는 최적화 과정에서 **image gradient를 이미 계산** → 이를 재활용 - Image gradient를 projected Gaussian Splat distribution의 확률적 추정으로 사용 - 추가 연산 없이 초기 Gaussian 파라미터 결정 - 3단계 프로세스: 1. Keyframe의 image intensity와 gradient로부터 **2D covariance** 추정 2. Multiple keyframe의 2D covariance를 결합하여 **3D covariance** 계산 3. Eigen-decomposition으로 rotation과 scaling 파라미터 추출 .center[ <img src="fig/fig_3.png" width="75%"/> ] --- # Method ### Gaussian Splat Initialization: 2D Covariance 추정 - Image intensity가 Gaussian distribution을 따른다고 가정: `$$I(x, y) = \frac{1}{2\pi |\Sigma_{2D}|^{1/2}} \exp\left( -\frac{1}{2} (\mathbf{r} - \mathbf{p})^\top (\Sigma_{2D})^{-1} (\mathbf{r} - \mathbf{p}) \right) \tag{9}$$` - `\(\mathbf{r} = [x, y]^\top\)`: image 좌표 - `\(\mathbf{p} = [p_x, p_y]^\top\)`: distribution의 center - Log-probability의 gradient를 계산: `$$\nabla_{\mathbf{r}} \log I(x, y) = -\alpha (\Sigma_{2D})^{-1} (\mathbf{r} - \mathbf{p}) \tag{10}$$` - `\(\alpha\)`: scaling factor - 다양한 `\(\mathbf{r}\)`에 대해 이 식을 세우고, **least-squares**로 `\(\Sigma_{2D}\)`를 추정 --- # Method ### Gaussian Splat Initialization: 2D → 3D Covariance - 동일한 3D point가 여러 keyframe `\(\text{obs}(\mathbf{p})\)`에서 관측됨 - 각 keyframe `\(i\)`에서의 2D covariance `\(\Sigma_i^{2D}\)`는 하나의 3D covariance `\(\Sigma_{3D}\)`에 대응 - 2D-3D covariance 관계 (EWA Splatting): `$$\Sigma_i^{2D} = J_i W_i \Sigma_{3D} W_i^\top J_i^\top, \quad i \in \text{obs}(\mathbf{p}) \tag{11}$$` - `\(J\)`: 3D point → image plane의 Jacobian matrix - `\(W\)`: world → camera 좌표 변환 - 모든 observation의 방정식을 선형화하여 **least-squares**로 `\(\Sigma_{3D}\)` 추정 --- # Method ### Gaussian Splat Initialization: Covariance 보정 - Closed-form 해로 얻은 covariance가 유효한 covariance matrix의 조건을 만족하지 못할 수 있음 - Covariance matrix는 **symmetric positive semi-definite**이어야 함 - 보정 전략: `$$\tilde{\Sigma}_{3D} = \begin{cases} \Sigma_{3D} + \epsilon \mathbf{I} & \text{(Regularization)} \\ U \tilde{\Lambda} U^\top & \text{(Eigenvalue clipping)} \end{cases} \tag{12}$$` - `\(\epsilon > 0\)`: 작은 상수 - `\(U\)`: `\(\Sigma_{3D}\)`의 eigenvector matrix - `\(\tilde{\Lambda} = \text{diag}(\max(\lambda_i, \epsilon))\)`: 음의 eigenvalue를 clip - Eigen-decomposition으로 최종 파라미터 추출: - Eigenvector matrix → **Rotation matrix** `\(R\)` - Eigenvalue의 대각 행렬 → **Scaling matrix** `\(S\)` (최소 eigenvalue를 0으로 설정 → 2DGS) - `\(\alpha\)`: `\(S\)`의 최대 원소로 나눈 preset 값으로 정의하여 regularize --- # Method ### SLAM Framework: Localization & M-step 1. **새 frame 도착 시**: Eq. (2)의 energy function으로 two-frame direct image alignment → pose 추정 2. **Keyframe 선택**: FOV 변화, translation, exposure time 기반 - 새 keyframe이 선택되면 sliding window에 추가 3. **Local BA (M-step)**: - Camera pose, affine brightness parameter, inverse depth, camera intrinsic 최적화 - 이것이 EM의 **M-step**에 해당 4. **Depth Regularization**: - Keyframe의 sparse depth map + 이전 E-step에서 업데이트된 2DGS rendered depth map - 두 depth의 **평균**을 초기 depth estimate로 사용 - Dense reconstruction의 이점을 활용하면서 DSO-derived depth의 신뢰성 보존 - 이후 Eq. (3)으로 camera pose와 semi-dense depth map을 최적화 --- # Method ### SLAM Framework: E-step Optimization - Main thread가 tracking과 keyframe 선택을 처리하는 동안, **2DGS scene optimization은 병렬 thread**에서 실행 - 새 keyframe이 선택될 때마다: 1. **Gaussian Splat Initialization** (Sec. III-C)으로 새 Gaussian splat의 초기 형태 정의 2. Reconstructed scene에 삽입 3. 원본 GS의 **densification** 기법도 추가로 적용하여 finer detail 개선 - **Windowed refinement**: - 최근 추가된 keyframe을 우선적으로 최적화 - Active window가 충분히 학습되면, 추가 keyframe을 샘플링하여 다양한 viewpoint 반영 - **Real-time 성능 보장**: - E-step이 별도 thread에서 지속적으로 scene Gaussian을 refine - Front-end는 real-time으로 유지 --- # Experiments ### Implementation Details - **구현**: C++, 2DGS는 LibTorch 기반 - **Loss hyperparameters** (Eq. 7): `\(\lambda = 0.2\)`, `\(\lambda_d = 500\)`, `\(\lambda_n = 0.1\)` - **Hardware**: Ryzen 5900X CPU, 64GB RAM, NVIDIA RTX 4090 GPU ### Datasets & Metrics - **Replica** (synthetic): 8개 scene - **TUM-RGBD** (real-world, Kinect v1): 3개 sequence - **INS Dataset**: Large-scale indoor corridor - **Self-captured**: Quadrupedal robot - **Metrics**: ATE RMSE (tracking), PSNR/SSIM/LPIPS (photometric), L1 depth (geometric) --- # Experiments ### Tracking Accuracy — Replica .center[ <img src="fig/table1.png" width="85%"/> ] - RGB 기반 방법 중 대부분의 scene에서 **최고 성능** - Photo-SLAM 대비 최대 **50% 낮은 tracking error** - RGB-D 기반 방법과도 **비슷한 수준**의 정확도 --- # Experiments ### Tracking Accuracy — TUM-RGBD .center[ <img src="fig/table2.png" width="80%"/> ] - TUM-RGBD는 Kinect v1의 심한 noise가 있어 direct method에게는 불리 - Feature-based 방법(Orbeez, Photo-SLAM)보다 다소 낮은 tracking accuracy - 그러나 **MGSO* 대비 높은 tracking accuracy** → Joint optimization이 tracking robustness를 강화 --- # Experiments ### Reconstruction Quality & System Speed — Replica .center[ <img src="fig/table3.png" width="85%"/> ] - **PSNR 34.48 dB**, **LPIPS 0.060**, **Depth L1 8.12 cm** — 대부분의 metric에서 최고 성능 - MonoGS 대비 **36배 빠름**, SplaTAM 대비 **141배 빠름** (30 FPS) - Gaussian Initialization이 최적화를 가속화한 결과 --- # Experiments ### Qualitative Results — Replica .center[ <img src="fig/fig_4.png" width="75%"/> ] - 다른 방법들에 비해 **우수한 geometric accuracy와 photometric fidelity** --- # Experiments ### Reconstruction Quality — TUM-RGBD .center[ <img src="fig/table4.png" width="80%"/> ] - TUM의 심한 noise에도 불구하고, feature-based 방법 (Orbeez-SLAM, Photo-SLAM)보다 풍부한 geometry 추출 - MonoGS가 fr1, fr3에서 약간 더 높은 quality를 달성하지만, 속도가 **9.6배 느림** --- # Experiments ### Real-world & Scalability .pull-left[ **Self-captured Dataset (Quadrupedal Robot)**: - 상당한 camera motion jitter에도 불구하고 우수한 map reconstruction quality .center[ <img src="fig/fig_5.png" width="90%"/> ] ] .pull-right[ **Large-scale INS Dataset**: .center[ <img src="fig/table5.png" width="100%"/> ] - Pure VO로 MonoGS보다 높은 정확도 - Photo-SLAM (Loop Closure 있음)보다 LC_3, LC_4에서 우수 - **Loop Closing 없이도** 누적 drift 최소화 - PSNR: 23.11 dB vs MonoGS 16.76 / Photo-SLAM 17.62 ] --- # Experiments ### Runtime Analysis .center[ <img src="fig/table6.png" width="70%"/> ] - Tracking: 항상 low latency (local keyframe 기반) - M-step: windowed optimization → scene scale에 무관하게 **일정한 복잡도** - 카메라 모션이 runtime에 더 큰 영향 (handheld > smooth trajectory) - GPU memory: Small 2.8GB / Large 5.8GB --- # Experiments ### Ablation Study: Gaussian Splat Initialization .center[ <img src="fig/table7.png" width="70%"/> ] - **KNN 기반**: 기존 GS/Photo-SLAM 방식, PSNR 25.51, 추가 2700 iter (64.4s) 필요 - **Constant (Isotropic)**: PSNR 31.68, 추가 1200 iter (20.4s) 필요 - **Obs (제안)**: PSNR **34.48**, 추가 iteration/시간 불필요 - Image structural information을 활용하는 것이 geometric distribution만 사용하는 것보다 효과적 --- # Experiments ### Ablation Study: Joint Optimization .center[ <img src="fig/table8.png" width="60%"/> ] - Joint Optimization 없이 (naive coupling): PSNR 34.10, ATE 0.688, Depth L1 9.744 - Joint Optimization 적용: PSNR **34.48**, ATE **0.462**, Depth L1 **8.124** - Scene geometry가 제대로 공유되면 tracking과 mapping **모두 개선** --- # Experiments ### Failure Cases .center[ <img src="fig/fig_6.png" width="70%"/> ] - **(a, b)**: 안정적인 motion → robust - **(c, d)**: 심한 motion blur → photometric consistency 위반 → tracking drift → geometric distortions - **(e, f, g)**: Textureless region (흰 벽) → image gradient 부족 → sampling 불가 → 불완전한 geometry - 그럼에도 제안된 initialization은 PSNR 25.51로 Constant (22.27), KNN (25.23) 대비 우수 --- # Conclusion 1. **Bidirectional Coupling**: VO와 GS를 seamless하게 통합 - 추가 연산 비용 없이 tracking과 mapping 성능 모두 향상 2. **EM Framework**: Joint optimization을 EM으로 정식화 - E-step: `\(\mathcal{G}\)`를 MAP로 추정 (RGB + Depth + Normal loss) - M-step: `\((P, D)\)`를 BA + Depth Regularization으로 최적화 - PRML의 수렴성 보장 → log-likelihood 단조 증가 3. **Gaussian Splat Initialization**: DSO의 image gradient 재활용 - 2D covariance → 3D covariance 추정 → Eigen-decomposition - Heuristic 초기화 대비 수렴 가속화 및 reconstruction quality 향상 4. **성능**: Real-time (30 FPS)으로 SOTA 수준의 photometric/geometric fidelity 및 tracking accuracy 달성 --- # Conclusion ### 한계 및 향후 연구 - Direct method 특성상 **severe motion blur**에 취약 - Photometric consistency 가정 위반 시 tracking drift 발생 - **Textureless region**에서 initialization이 sparse해짐 - Image gradient 기반이므로 uniform surface에서 샘플링 어려움 - 현재 semi-dense map을 **discrete point 집합으로 모델링** - 향후 image structure를 고려한 더 정밀한 모델링으로 coupled approach의 이점 극대화 예정 ### 느낀 점 - EM으로 tracking과 mapping을 jointly optimize하는 접근이 깔끔 - DSO의 기존 연산(image gradient)을 재활용하여 추가 비용 없이 초기화하는 아이디어가 인상적 - Loop closure 없이도 large-scale에서 낮은 drift를 보여 VO의 견고함을 입증