【Survey】截至2024.12SLAM系列工作總結(jié)

@TOC


ORB-SLAM2: an Open-Source SLAM System for Monocular, Stereo and RGB-D Cameras

這篇文章以介紹為主。

ORB-SLAM2是一個用于單目、雙目、RGB-D相機的完整SLAM系統(tǒng),包括地圖復用、回環(huán)檢測和重定位功能。無論是室內(nèi)的小型手持設備,還是工廠中的無人機和城市中行駛的汽車,ORB-SLAM2都能夠在標準CPU上實時工作。ORB-SLAM2后端采用基于BA的優(yōu)化,可以得到公制尺度的精確軌跡估計。此外,ORB-SLAM2包含了一個輕量級的定位模式,該模式利用視覺里程計來追蹤未建圖區(qū)域,以及匹配地圖點實現(xiàn)零漂移定位。29個公共數(shù)據(jù)集測試結(jié)果顯示,在大多數(shù)情況下ORB-SLAM2精度更高。

contributions:

  1. 第一個用于單目、雙目、RGB-D相機的開源SLAM方案,包含回環(huán)檢測、重定位、地圖復用。
  2. RGB-D結(jié)果表明,相較于基于ICP或基于最小化光度、深度誤差的最先進方法,光束平差法(BA)更精確
  3. 聯(lián)合使用單目、近雙目和遠雙目特征點,比直接使用雙目特征點的結(jié)果更精確。
  4. 針對無法建圖的情況,ORB-SLAM2提出了一種輕量級的定位模式。

Total Structure

ORB-SLAM2的總體概述如上,它具有3個主要的并行線程,

  1. 跟蹤線程:查找與局部地圖匹配的特征點,使用運動BA最小化重投影誤差來定位相機。
  2. 局部建圖線程:使用局部BA,管理局部地圖并進行優(yōu)化。
  3. 回環(huán)線程:檢測大型回環(huán),通過位姿圖優(yōu)化校正累計漂移;在完成位姿圖優(yōu)化后,將會啟動第4個線程進行全局BA。

另外,該系統(tǒng)嵌入了基于DBoW2的位置識別模塊,用于在跟蹤失?。ɡ缯趽酰┑那闆r下重新定位或在已建圖的場景中重新初始化,以及用于回環(huán)檢測。

接下來,文章只介紹了ORB-SLAM2對初代ORB-SLAM的改進,譬如,如何利用深度信息,ORB-SLAM2的哪些部分與ORB-SLAM不同。如果需要知道系統(tǒng)的各個模塊的詳細描述,需要查看初代ORB-SLAM文章。

Monocular, Close Stereo and Far Stereo Keypoints

ORB-SLAM2系統(tǒng)對雙目或RGB-D相機的圖像進行預處理,并將特征點分成單目特征點、遠雙目特征點和近雙目特征點,保證其系統(tǒng)的運行都是基于輸入圖像的特征點展開而不是圖像。

雙目特征點由三個坐標定義:

\begin{array}{c} \mathbf{x}_s=(u_L,v_L,u_R),u_L,v_L是左圖像的像素坐標,\\ u_R是右圖像的水平像素坐標。 \end{array}

如果是由RGB-D相機拍攝的,使用如下式子轉(zhuǎn)化為雙目特征點:
\begin{array}{c} u_R= u_L - \frac{f_x b}u0z1t8os,f_x為水平焦距, \\ b為結(jié)構(gòu)光投影器和紅外相機之間的基線。 \end{array}

如果雙目特征點的深度小于雙目/RGB-D基線的40倍,這個特征點就被視為近雙目特征點。近特征點能從單一幀中進行三角化得到精確估計的深度,并能提供尺度、平移和旋轉(zhuǎn)信息。遠點提供精確的旋轉(zhuǎn)信息,但是提供較弱的尺度和平移信息,并且需要多個視角支持遠點才可以三角化。

單目特征點通過左圖坐標(uL,vL)定義,即,無法找到雙目匹配的ORB特征點,和,在RGB-D圖上具有無效深度值的ORB特征點。這些點需要多視角才可以三角化,不能提供尺度信息,但是可以提供旋轉(zhuǎn)和平移的估計信息。

System Bootstrapping

使用雙目/RGB-D相機的主要優(yōu)勢之一為,通過僅從一幀獲得深度信息,不需要像單目相機那樣從運動初始化獲得特定的結(jié)構(gòu)。在系統(tǒng)啟動時,它使用第一幀創(chuàng)建關鍵幀,設置它的位姿為原點,并且從所有雙目特征點創(chuàng)建一張初始地圖。

Bundle Adjustment with Monocular and Stereo Constraints

ORB-SLAM2系統(tǒng)中的存在三種BA,使用g2o實現(xiàn)的Levenberg–Marquardt方法去優(yōu)化:

  1. 跟蹤線程中的運動BA,最小化特征點的重投影誤差,用來優(yōu)化相機的pose,特征點的坐標已知。
  2. 局部BA,重建局部地圖。
  3. 全局BA,地圖中所有的關鍵幀和特征點都被優(yōu)化,除了原點處的關鍵幀被固定。

Loop Closing and Full BA

由于雙目/深度信息使得尺度可觀,幾何校驗和位姿圖優(yōu)化中不再處理尺度漂移問題,并且是基于剛體變換而不是基于相似性。

全局BA將在完成位姿圖優(yōu)化后進行,這種優(yōu)化的成本可能非常高,因此以單獨的線程執(zhí)行,允許系統(tǒng)同時建圖和回環(huán)檢測。然而,如何將BA的輸出結(jié)果與地圖的當前狀態(tài)融合是一個問題。如果在全局BA運行時檢測到新的閉環(huán),將中止全局BA并進行閉環(huán),然后再次啟動完整的全局BA優(yōu)化。當全局BA結(jié)束時,將全局BA優(yōu)化的關鍵幀和點的子集進行更新,并與全局BA運行時未更新的關鍵幀和插入的點進行融合(通過生成樹將更新關鍵幀的校正傳遞到未更新的關鍵幀中,未更新點根據(jù)參考關鍵幀的矯正進行變換)。

Keyframe Insertion

ORB-SLAM2基本遵循單目ORB-SLAM的方法:寬松的關鍵幀插入策略并篩選剔除冗余的關鍵幀。

另外,由于引入了雙目和RGB-D相機,還需要根據(jù)遠近特征點的差異,設置新的關鍵幀插入條件,即:當跟蹤的近特征點小于τt=100且該幀創(chuàng)造大于τc=70個新的近特征點時,插入新的關鍵幀。(因為需要大量的近特征點用于精確估計平移)

Localization Mode

適用于地圖已知的長期定位。此模式下停用局部BA(即停止建圖),回環(huán)檢測線程也停用,始終通過追蹤線程進行重定位。在這種模式下,跟蹤線程利用視覺里程計,將當前幀的特征點和已經(jīng)生成的3D點云(由局部BA優(yōu)化),進行匹配。這些匹配使得定位在未建圖區(qū)域較為魯棒,但是會累積漂移。在已知地圖中,可以通過地圖點匹配,實現(xiàn)零漂移定位。

NICE-SLAM: Neural Implicit Scalable Encoding for SLAM

現(xiàn)有基于NeRF的SLAM系統(tǒng)具有兩個缺陷:1.因為多層感知機傾向于學習低頻數(shù)據(jù),從而忽略高頻數(shù)據(jù),導致場景重建過于平滑;2.多層感知機在不斷接收新的數(shù)據(jù)進行訓練,面臨“遺忘”的問題,導致難以應用于大型場景。

NICE-SLAM是基于神經(jīng)隱式表達NeRF進行建圖的SLAM系統(tǒng),針對以上問題,NICE-SLAM引入了多分辨率的網(wǎng)格模型來分別表示粗尺度、中尺度、細尺度下的場景,并且不同分辨率下的MLP會經(jīng)過預訓練,從而實現(xiàn)了在大型室內(nèi)場景的稠密重建。這種利用grid的思想,在筆者看來,非常類似于Plenoxels和InstantNGP。

Hierarchical Scene Representation

  • System Overview.

從左到右,NICE-SLAM使用RGB-D圖像作為輸入,使用多分辨率的分層特征網(wǎng)絡表示場景,并使用基于pixel和depth的loss去優(yōu)化grid和pose(BA),即Mapping過程。從右到左,NICE-SLAM使用已經(jīng)訓練好的MLP去進行一個Novel View Synthesis的任務,然后同樣會使用一個基于pixel和depth的loss反傳優(yōu)化相機pose,即tracking過程。Novel View Synthesis的過程就是我們再熟悉不過的NeRF的體渲染。

前三個MLP用于輸出體渲染需要的體素密度數(shù)值,后一個MLP用于輸出這個點的顏色值。這里的MLP起到一個特征解碼器的作用。

\begin{array}{c} f^0表示粗糙級別的網(wǎng)格,f^1表示中級別的網(wǎng)格,f^2表示精細級別的網(wǎng)格。 \end{array}

Mid-&Fine-level Geometric Representation

網(wǎng)絡的分辨率是根據(jù)物理尺寸決定的,譬如,Mid級別的grid的格子邊長為32cm(TUM RGBD數(shù)據(jù)集中為16cm),F(xiàn)ine級別的grid的格子邊長為16cm(TUM RGBD數(shù)據(jù)集中為8cm)。

體渲染所用到的體素密度是通過Mid Level和Fine Level聯(lián)合計算得出,因此,在Mapping過程中,也只會優(yōu)化這兩個級別的特征網(wǎng)格。這些MLP都是預訓練好的,不會進行任何更改。以下就是體素密度的計算過程:

\begin{array}{c} o_\mathbf{p}^1=f^1(\mathbf{p},\phi_\theta^1(\mathbf{p})) ,\\ \Delta o_{\mathbf{p}}^1=f^2(\mathbf{p},\phi_\theta^1(\mathbf{p}),\phi_\theta^2(\mathbf{p})),\\ o_{\mathbf{p}}=o_{\mathbf{p}}^1+\Delta o_{\mathbf{p}}^1 ,\\ \phi_\theta(\mathbf{p})表示特征網(wǎng)絡在點\mathbf{p}處進行三線性插值。 \end{array}

中分辨率能夠有效地優(yōu)化網(wǎng)格特征以適應觀測結(jié)果。為了在場景幾何圖形中捕捉更小的高頻細節(jié),NICE-SLAM以殘差方式添加精細級別的特征。精細級的特征解碼器將相應的中級特征和精細級特征作為輸入,并輸出一個偏移量,把這個偏移量加到中級特征解碼器的輸出上,就是最終的體素密度了。

Coarse-level Geometric Representation

粗級特征網(wǎng)格旨在捕獲場景中大尺度的幾何形狀(例如墻壁、地板等),它的優(yōu)化過程獨立于中級和精細級進行。對于那些未被mid-level和fine-level估計的點,就由coarse-level所估計。這些大尺度的幾何在圖片中通常僅被部分觀察到(例如墻壁、地板等)。為此,coarse-level grid在實現(xiàn)中使用了非常低的分辨率,邊長為2m。它輸出體素密度的過程如出一轍。

o_\mathbf{p}^0=f^0(\mathbf{p},\phi_\theta^0(\mathbf{p})).

在Tracking期間,coarse-level輸出的體素密度同樣僅用于預測先前未觀察到的場景部分。

Pre-training Feature Decoders

NICE-SLAM使用三種不同的固定的多層感知機來將網(wǎng)格特征解碼為體素密度。解碼器作為ConvONet的一部分進行預訓練,它由一個CNN編碼器和一個MLP解碼器組成,并使用預測值和真值之間的交叉熵損失(binary cross-entropy)來訓練編碼器和解碼器。經(jīng)過訓練后,只使用MLP解碼器,因為NICE-SLAM將直接優(yōu)化特征。通過這種方式,預先訓練好的解碼器可以在解碼我們優(yōu)化后的特征時,利用從訓練集學習到的特定于分辨率(resolution-specific)的先驗。

Color Representation

顏色估計和體素密度的估計過程不太一樣,color-level的解碼器是可以進行優(yōu)化的,因此,color-level解碼器和color-level grid將進行聯(lián)合優(yōu)化。NICE-SLAM稱,這樣可以提高跟蹤性能。但是,與iMAP類似,這可能會導致“遺忘”問題,并且顏色只在局部保持一致。如果想可視化整個場景的顏色,可能需要進行全局優(yōu)化作為后處理步驟。

\mathbf{c_p}=\mathbf{g_\omega}(\mathbf{p},\psi_\omega(\mathbf{p})).

Depth and Color Rendering

體渲染導出pixel的過程我們已經(jīng)很熟練了,這里還要在講一下計算depth的過程,實際上跟計算pixel也如出一轍。

\begin{array}{c} \mathbf{p}_i=\mathbf{o}+d_i \mathbf{r},i \in \{1,...,N\} ,\\ \omega_i = o_{\mathbf{p}_i} \prod^{i-1}_{j=1}(1-o_{\mathbf{p}_j}) ,\\ 深度:\hat{D}=\sum_{i=1}^Nw_id_i ,\\ 顏色:\hat{I}=\sum_{i=1}^Nw_i\mathbf{c}_i . \end{array}

此外,還計算了沿光線的深度的方差:

\hat{D}_{var}^c=\sum_{i=1}^Nw_i^c(\hat{D}^c-d_i)^2 ,\\ \hat{D}_{var}^f=\sum_{i=1}^Nw_i^f(\hat{D}^f-d_i)^2,f \in \{c(coarse),f(fine) \}.

Mapping and Tracking

Mapping

在當前幀和關鍵幀中均勻采樣M個像素,定義幾何損失(geometric loss)和光度損失(photometric loss)如下:

\mathcal{L}_g^l=\frac{1}{M}\sum_{m=1}^M\left|D_m-\hat{D}_m^l\right|,\quad l\in\{c,f\} .\\ \mathcal{L}_p=\frac{1}{M}\sum_{m=1}^M\left|I_m-\hat{I}_m\right|.

然后,這個聯(lián)合優(yōu)化問題就是:

\min_{\theta,\omega,\{\mathbf{R}_i,\mathbf{t}_i\}}(\mathcal{L}_g^c+\mathcal{L}_g^f+\lambda_p\mathcal{L}_p).

Camera Tracking

在當前幀中采樣Mt個像素,修改幾何損失為:

\mathcal{L}_{g \_ var}=\frac{1}{M_t}\sum_{m=1}^{M_t}\frac{\left|D_m-\hat{D}_m^c\right|}{\sqrt{\hat{D}_{var}^c}}+\frac{\left|D_m-\hat{D}_m^f\right|}{\sqrt{\hat{D}_{var}^f}}.

然后,優(yōu)化相機pose的問題就是:
\min_{\mathbf{R},\mathbf{t}}(\mathcal{L}_{g \_ var}+\lambda_{pt}\mathcal{L}_p).

SplaTAM: Splat, Track & Map 3D Gaussians for Dense RGB-D SLAM

SplaTAM是首次利用3DGS的SLAM系統(tǒng),實驗表明,SplaTAM在相機姿態(tài)估計、地圖構(gòu)建和新視角生產(chǎn)方面的性能提高了2倍。作者認為,使用3D高斯來進行SLAM的渲染、跟蹤、建圖會帶來以下好處

  • 快速渲染和密集優(yōu)化:由于定制了cuda的并行計算,3D高斯的渲染和優(yōu)化速度比像NeRF那樣的隱式方案快得多。此外,SplaTAM引入了一些簡單的修改,使splat的渲染速度更快,包括:刪除球諧函數(shù)、使用各向同性(球形)高斯。
  • 具有明確空間范圍的地圖:場景的空間邊界,可以通過渲染輪廓輕松地識別出來,這個輪廓是通過視圖的3D高斯的累積不透明度計算的。給定一個新視圖,這允許人們有效地識別場景的哪些部分是新內(nèi)容(在地圖的空間邊界之外)。這對于相機跟蹤至關重要,因為我們只想使用已經(jīng)建模好的場景來優(yōu)化相機姿勢。此外,這使得地圖更新變得容易,可以通過向看不見的區(qū)域添加高斯來擴展地圖,同時仍然允許高保真渲染,即densify。
  • 場景參數(shù)的直接優(yōu)化:場景由具有物理3D位置、顏色和大小的高斯表示,因此參數(shù)和密集光度損失之間存在直接的、幾乎線性(投影)的梯度流。此外,splaTAM還對相機參數(shù)進行了直接梯度處理,從而實現(xiàn)快速優(yōu)化。先前的隱式或體積表示的方案,由于梯度需要流經(jīng)非線性神經(jīng)網(wǎng)絡層,因此不存在這種特性。

Differentiable Rendering via Splatting.

3DGS的體渲染過程我們已經(jīng)很熟悉了,這里再提及一下SplaTAM所用到的深度圖和輪廓圖如何計算的。

\begin{array}{c} 與視角無關的顏色參數(shù):\mathbf{c},高斯點的中心坐標:\mathbf{\mu}, \\ 球半徑:r,著色度:o,空間中一點的坐標:\mathbf{x} \\ 那么,這個點對于這個gaussian的值可以計算為: \\ f(\mathbf{x})=o\exp\left(-\frac{\|\mathbf{x}-\boldsymbol{\mu}\|^2}{2r^2}\right). \end{array}

然后,將一個pixel對應方向上的所有gaussian由深度從小到大進行體渲染即可:

\begin{array}{c} T_{cw}這篇文章中記作E_t,K為相機內(nèi)參,f為焦距。 \\ d=(E_t\boldsymbol{\mu})_z,\quad \boldsymbol{\mu}^{2\mathrm{D}}=K\frac{E_t\boldsymbol{\mu}}u0z1t8os,\quad r^{2\mathrm{D}}=\frac{fr}u0z1t8os. \\ 顏色:C(\mathbf{p})=\sum_{i=1}^n\mathbf{c}_if_i(\mathbf{p})\prod_{j=1}^{i-1}(1-f_j(\mathbf{p})), \\ 深度:D(\mathbf{p})=\sum_{i=1}^nd_if_i(\mathbf{p})\prod_{i=1}^{i-1}(1-f_j(\mathbf{p})), \\ 輪廓:S(\mathbf{p})=\sum_{i=1}^nf_i(\mathbf{p})\prod_{i=1}^{i-1}(1-f_j(\mathbf{p})). \end{array}

SLAM System.

假設有一個現(xiàn)有的地圖(通過一組3D高斯函數(shù)表示),該地圖已根據(jù)一組相機幀1到t進行擬合。給定一個新的RGB-D幀t+1,splaTAM執(zhí)行以下步驟:

  1. Camera Tracking:對t+1幀,最小化相對于相機姿態(tài)參數(shù)的RGB和深度重建誤差,但僅評估可見輪廓內(nèi)像素的誤差。
  2. Gaussian Densification:根據(jù)渲染的輪廓和輸入深度向地圖添加新的高斯。
  3. Map Update:給定從第1幀到t+1幀的相機姿勢,通過最小化t+1幀之前所有圖像的RGB和深度誤差來更新場景中所有高斯的參數(shù)。

Initialization.

對于第一幀,跳過跟蹤步驟,并將相機姿勢設置為單位陣。在致密化步驟中,由于渲染的輪廓是空的,因此所有像素都用于初始化新的高斯。具體來說,對于每個像素,添加一個新的高斯,其顏色為該像素的顏色,中心位于該像素深度的反投影位置,不透明度為0.5,半徑如下初始化,保證了一個gaussian投影到圖像后僅覆蓋一個像素:

r=\frac{D_{GT}}{f}.

Camera Tracking.

首先,確定第t+1幀的相機位姿的初值:

E_{t+1}=E_{t}+(E_{t}-E_{t-1}).

然后,計算損失并使用梯度下降算法優(yōu)化:

L_\mathfrak{t}=\sum_{\mathbf{p}}\left(S(\mathbf{p})>0.99\right)\left(\mathcal{L}_1\left(D(\mathbf{p})\right)+0.5\mathcal{L}_1\left(C(\mathbf{p})\right)\right).

通過使用輪廓圖,splaTAM僅從地圖優(yōu)化良好的部分計算損失,這對于跟蹤新的相機姿勢非常重要,因為新幀通常包含尚未良好建模的新gaussian,如果計算了這部分gaussian,那么帶來的loss是非常大的。

Gaussian Densification.

splaTAM會根據(jù)每個傳入的在線幀,在地圖中初始化新的gaussian。但是,我們并不想在重建良好的區(qū)域再添加新的gaussian,因此,splaTAM是根據(jù)輪廓圖,在建圖不良好區(qū)域重新初始化。初始化gaussian的策略如上所述。具體會往哪些區(qū)域添加gaussian由下式?jīng)Q定:

\begin{array}{c} M(\mathbf{p}) =\left(S(\mathbf{p})<0.5\right)+ \left(D_{\mathrm{GT}}(\mathbf{p})<D(\mathbf{p})\right)\left(\mathcal{L}_1\left(D(\mathbf{p})\right)>\lambda\mathrm{MDE}\right). \\ \mathrm{MDE}表示median\quad depth \quad error,即這張圖片上深度誤差的均值。\\ \lambda是超參數(shù),經(jīng)驗上設置為50。 \end{array}

以上這個掩碼指示,在未建圖區(qū)域S(p)<0.5和重建質(zhì)量差的區(qū)域去初始化新的gaussian。

Gaussian Map Updating.

更新gaussian的過程我們同樣已經(jīng)很熟悉了,就是3DGS的優(yōu)化過程。具體而言,splaTAM系統(tǒng)利用給定迄今為止相機pose的集合,更新3D高斯地圖的參數(shù)。這是通過可微渲染和基于梯度的優(yōu)化完成的,但是與tracking不同,在mapping中,相機pose是固定的,gaussian的參數(shù)被更新。

除此之外,splaTAM做了兩個重要的修改。第一,優(yōu)化不是從頭開始,而是從最近構(gòu)建的地圖開始優(yōu)化。第二,也不直接選擇所有先前的(關鍵)幀,而是選擇盡可能包含新gaussian的幀。具體選擇方案是:第n幀為關鍵幀,一共選擇k幀進行優(yōu)化,包括當前幀、最近的關鍵幀以及與當前幀重疊度最高的k-2個先前關鍵幀。重疊度計算方式為:一,獲取當前幀深度圖的點云;二,確定關鍵幀的視錐體內(nèi)的包含了多少個上述點,包含的點越多的關鍵幀優(yōu)先被選擇。

此階段使用與跟蹤期間類似的損失,但不使用輪廓圖進行篩選,因為需要利用所有像素進行優(yōu)化。此外,splaTAM在體渲染中添加了結(jié)構(gòu)相似性(SSIM)損失,并剔除不透明度接近0或太大的無用高斯,類似3DGS的剪枝策略。

Gaussian Splatting SLAM

GS-SLAM同樣是使用3DGS進行場景重建的SLAM方法,與splaTAM不同的是,GS-SLAM完成了單目SLAM的任務,而不是splaTAM的RGB-D輸入,因此,GS-SLAM需要來自SFM估計的準確位姿。GS-SLAM也可以無縫拓展到RGB-D的SLAM。此外,通過利用gaussian的顯式性質(zhì),GS-SLAM引入幾何驗證和正則化來處理gaussian在densify中出現(xiàn)的歧義。

GS-SLAM的貢獻為:

  1. 第一個使用3DGS的近實時SLAM系統(tǒng),3fps,并且能處理僅單目的輸入。
  2. 分析了直接用于相機位姿估計的雅可比矩陣,提出了gaussian形狀的各向同性正則化和幾何驗證。
  3. 對單目和RGB-D的各種數(shù)據(jù)集進行了廣泛的評估,展示了具有競爭力的性能,特別是在現(xiàn)實場景中。

Gaussian Splatting

GS-SLAM用的是原始的計算方案,沒有使用像splaTAM那樣的球形高斯。

\begin{array}{c} 第i個gaussian:\mathcal{G}^{i},顏色:c^i,著色度:\alpha^i,\\ 中心坐標:\boldsymbol{\mu}_{W}^{i},協(xié)方差矩陣:\boldsymbol{\Sigma}_{W}^{i}。 \\ \mathcal{C}_{p}=\sum_{i \in \mathcal{N}} c_{i} \alpha_{i} \prod_{j=1}^{i-1}\left(1-\alpha_{j}\right) \end{array}

投影到像素坐標系:

\begin{array}{c} \boldsymbol{\mu}_{I}=\pi \left(\mathbf{T}_{CW} \cdot \boldsymbol{\mu}_{W}\right),\boldsymbol{\Sigma}_{I}=\boldsymbol{J}\boldsymbol{W}\boldsymbol{\Sigma}_{W}\boldsymbol{W}^{T}\boldsymbol{J}^{T}, \\ \pi 表示相機坐標系到像素坐標系的投影操作,\\ \boldsymbol{J}是投影變換的線性近似的雅克比矩陣,\\ \boldsymbol{W}是\mathbf{T}_{CW}的旋轉(zhuǎn)部分。 \end{array}

Camera Pose Optimisation

為了實現(xiàn)準確的跟蹤,GS-SLAM通常需要每幀至少50次梯度下降迭代。為了避免自動微分的開銷,同樣使用CUDA實現(xiàn)光柵化,并為所有顯式計算的參數(shù)提供導數(shù)。由于光柵化對性能至關重要,因此GS-SLAM明確地推導了相機位姿的雅可比矩陣。

\begin{aligned} & \frac{\partial\boldsymbol{\mu}_I}{\partial\boldsymbol{T}_{CW}}=\frac{\partial\boldsymbol{\mu}_I}{\partial\boldsymbol{\mu}_C}\frac{\mathcal{D}\boldsymbol{\mu}_C}{\mathcal{D}\boldsymbol{T}_{CW}}, \\ & \frac{\partial\boldsymbol{\Sigma}_I}{\partial\boldsymbol{T}_{CW}}=\frac{\partial\boldsymbol{\Sigma}_I}{\partial\mathbf{J}}\frac{\partial\mathbf{J}}{\partial\boldsymbol{\mu}_C}\frac{\mathcal{D}\boldsymbol{\mu}_C}{\mathcal{D}\boldsymbol{T}_{CW}}+\frac{\partial\boldsymbol{\Sigma}_I}{\partial\mathbf{W}}\frac{\mathcal{D}\mathbf{W}}{\mathcal{D}\boldsymbol{T}_{CW}}, \\ & \frac{\mathcal{D}\boldsymbol{\mu}_C}{\mathcal{D}\boldsymbol{T}_{CW}}= \begin{bmatrix} \boldsymbol{I} & -\boldsymbol{\mu}_C^\times \end{bmatrix},\frac{\mathcal{D}\mathbf{W}}{\mathcal{D}\boldsymbol{T}_{CW}}= \begin{bmatrix} \boldsymbol{0} & -\mathbf{W}_{:,1}^\times \\ \boldsymbol{0} & -\mathbf{W}_{:,2}^\times \\ \boldsymbol{0} & -\mathbf{W}_{:,3}^\times \end{bmatrix}. \end{aligned}

SLAM

Tracking

跟蹤時,所用的loss如下:

\begin{array}{c} 深度圖渲染:\mathcal{D}_p=\sum_{i\in\mathcal{N}}z_i\alpha_i\prod_{j=1}^{i-1}(1-\alpha_j) ,\\ 光度損失:E_{pho}=\left\|I(\mathcal{G},\boldsymbol{T}_{CW})-\bar{I}\right\|_1 ,\\ 幾何損失:E_{geo}=\left\|D(\mathcal{G},\boldsymbol{T}_{CW})-\bar{D}\right\|_1 .\\ loss = \lambda_{pho}E_{pho}+(1-\lambda_{pho})E_{geo} .\\ 幾何損失只在RGB-D輸入時啟用。\\ z_i表示\boldsymbol{\mu}_{W}^{i}的z坐標,I就是渲染得出的RGB圖。 \end{array}

Keyframing

直接使用視頻流中的所有圖像來在線聯(lián)合優(yōu)化高斯和相機姿勢是不可行的,因此需要維護一組基于幀間共視性精心選擇的關鍵幀。理想的一組關鍵幀將選擇觀察同一區(qū)域的不同視角,以提供更好的多視圖約束。

  • Selection and Management.

根據(jù)以上這個標準,只需通過測量當前幀i和最后一個關鍵幀j之間觀察到的gaussian的并集來衡量共可見性。如果共可見性下降到閾值以下,亦或者如果gaussian的相對平移大于深度的中值,則這一幀i就被標記為關鍵幀。有添加就有刪除,為了提高效率,系統(tǒng)僅維護少量關鍵幀。如果某一關鍵幀與最新關鍵幀的共可見性低于閾值,則刪除這一關鍵幀。

  • Gaussian Covisibility.

衡量一個gaussian的可見性非常容易,只需要計算在體渲染中沿著光線累計的不透明度,只要不透明度小于0.5,那么此前的gaussian都視為可見;如果超過0.5,那么此后的gaussian視為不可見。

  • Gaussian Insertion and Pruning.

如果使用RGB-D的圖像,那么新增的gaussian可以直接使用深度進行反投影從而初始化。在單目情況下,對于具有深度估計的像素,則根據(jù)低方差的深度值進行初始化;對于沒有深度估計的像素,則在渲染圖中使用這些gaussian深度的中值的鄰近值初始化新的gaussian。

在單目情況下,許多新插入的gaussian的位置是不正確的。大多數(shù)在優(yōu)化過程中會很快消失,因為它們違反了多視圖一致性,系統(tǒng)還通過檢查關鍵幀集合中的可見性來進一步修剪多余的gaussian。如果最后3個關鍵幀中插入的gaussian未被至少3個其他幀觀察到,就將它們修剪掉,因為它們在幾何上不穩(wěn)定。

Mapping

建圖的目的是保持一致的3D結(jié)構(gòu)并優(yōu)化新插入的gaussian。在建圖過程中,關鍵幀集合用于重建當前可見區(qū)域。此外,每次迭代都會選擇兩個隨機的過去關鍵幀以避免忘記全局地圖。

splaTAM直接使用了球形gaussian,而GS-SLAM也有類似的做法,就是引入各向同性正則化,促進gaussian的球形度,從而避免了gaussian因拉長而產(chǎn)生偽影的問題:

E_{\text {iso }}=\sum_{i=1}^{|\mathcal{G}|}\left\|\mathbf{s}_{i}-\tilde{\mathbf{s}_{i}} \cdot \mathbf{1}\right\|_{1} ,\\ \min_{\substack{\boldsymbol{T}_{C W}^{k} \in \boldsymbol{S E}(3), \mathcal{G}, \forall k \in \mathcal{W}}} \sum_{\forall k \in \mathcal{W}} E_{p h o}^{k}+\lambda_{i s o} E_{i s o}

如果深度值可用,那么深度損失也會加入總loss。

本文由博客一文多發(fā)平臺 OpenWrite 發(fā)布!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容