作者:泡椒味的口香糖 |
NeRF這兩年真的是火出天際,ICCV 2023有非常多的NeRF文章,有優(yōu)化速度精度的,也有動(dòng)態(tài)環(huán)境這樣的特殊場(chǎng)景NeRF。但NeRF和SLAM結(jié)合還是一個(gè)很新興的方向,首先實(shí)時(shí)性難以保證,結(jié)合更多的也是去進(jìn)行稠密建圖,像iMAP和NICE-SLAM這樣同時(shí)優(yōu)化位姿和建圖的還比較少見,估計(jì)出的位姿精度也明顯低于傳統(tǒng)SLAM,大尺度范圍建圖存在遺忘問題,包括回環(huán)檢測(cè)的就更少了。
GO-SLAM這項(xiàng)工作似乎在一定程度上解決了這個(gè)問題,來自ICCV 2023最新開源的工作,是一個(gè)實(shí)時(shí)優(yōu)化位姿和稠密建圖的NeRF SLAM框架。筆者覺得最大的亮點(diǎn)在于引入回環(huán)和BA來校正軌跡和3D場(chǎng)景,很大程度上拉近NeRF SLAM和傳統(tǒng)SLAM的軌跡精度,這在以前的工作中是沒有的,因?yàn)榛丨h(huán)很容易讓位姿和NeRF直接割裂。
今天筆者將帶領(lǐng)讀者閱讀這項(xiàng)工作,當(dāng)然筆者水平有限,如何有理解不當(dāng)?shù)牡胤綒g迎大家一起討論。
1. 效果展示
先來看看具體的運(yùn)行效果。
GO-SLAM主要還是基于NeRF進(jìn)行稠密重建,可以發(fā)現(xiàn)相較于NICE-SLAM這些SOTA方案,GO-SLAM重建場(chǎng)景的全局一致性更好,這主要是因?yàn)樗肓嘶丨h(huán)和全局BA來優(yōu)化累計(jì)誤差。
對(duì)于各種室內(nèi)場(chǎng)景的3D稠密重建,都取得了相當(dāng)不錯(cuò)的效果。
還有在EuRoC數(shù)據(jù)集上的定性重建結(jié)果。相較于DROID-SLAM,GO-SLAM的重建效果更加干凈!
2. 摘要
神經(jīng)隱式表示最近在稠密同步定位與地圖構(gòu)建( Simultaneous Localization And Mapping,SLAM )上展示了令人信服的結(jié)果,但在重建過程中存在相機(jī)跟蹤誤差和畸變的積累。為此,本文提出了一種基于深度學(xué)習(xí)的稠密視覺SLAM框架GO-SLAM,對(duì)位姿進(jìn)行全局優(yōu)化,并進(jìn)行實(shí)時(shí)三維重建。魯棒的姿態(tài)估計(jì)是其核心,由有效的閉環(huán)和在線完全BA支持,通過利用輸入幀完整歷史的學(xué)習(xí)全局幾何來優(yōu)化每一幀。同時(shí),我們實(shí)時(shí)更新隱式和連續(xù)的表面表示,以確保三維重建的全局一致性。在各種合成和真實(shí)數(shù)據(jù)集上的實(shí)驗(yàn)結(jié)果表明,GO-SLAM在跟蹤魯棒性和重建精度方面優(yōu)于現(xiàn)有方法。此外,GO-SLAM具有通用性,可以在單目、雙目和RGB-D輸入下運(yùn)行。
3. 算法解析
GO-SLAM是最新的進(jìn)行隱式3D重建的SLAM方案,一方面不斷更新全局位姿,另一方面重建實(shí)時(shí)、連續(xù)的稠密3D場(chǎng)景。
GO-SLAM由三個(gè)并行線程組成:前端跟蹤、后端跟蹤,以及實(shí)例建圖。GO-SLAM的前端跟蹤線程是直接用的DROID-SLAM的跟蹤模塊,后面訓(xùn)練過程也是直接調(diào)的DROID-SLAM的預(yù)訓(xùn)練權(quán)重,只不過加入了新的回環(huán)和BA優(yōu)化。然后使用RAFT來計(jì)算新一幀相對(duì)于最后一個(gè)關(guān)鍵幀的光流,如果平均流大于閾值,則創(chuàng)建新關(guān)鍵幀。后端跟蹤線程的重點(diǎn)是通過全BA生成全局一致的位姿和深度預(yù)測(cè)。最后,實(shí)例建圖線程根據(jù)最新的位姿信息實(shí)時(shí)更新三維重建。GO-SLAM的輸入可以是單目雙目,還可以是RGB-D,非常的通用!
那么回環(huán)檢測(cè)如何實(shí)現(xiàn)呢?
這里還是一個(gè)基于關(guān)鍵幀的圖優(yōu)化問題。這個(gè)回環(huán)過程分為兩步:
(1)選擇最近N個(gè)局部關(guān)鍵幀之間的高可視性連接;
(2)從局部關(guān)鍵幀和局部窗口外的歷史幀檢測(cè)回環(huán)關(guān)系。
具體的實(shí)現(xiàn)過程中,作者為回環(huán)檢測(cè)和BA建立了一個(gè)大的共視矩陣,矩陣元素是通過反投影得到的平均剛體光流。如果平均光流大于閾值,則被認(rèn)為共視程度低,會(huì)被直接濾除掉。共視矩陣的維度就是Nx關(guān)鍵幀數(shù)量。
共視矩陣建立以后,就可以為具有鄰接關(guān)系和高共視關(guān)系的關(guān)鍵幀對(duì)建立優(yōu)化邊,也就是圖中的紅色方框。這里還有一個(gè)trick,就是為了避免冗余,當(dāng)優(yōu)化邊(兩個(gè)關(guān)鍵幀的連接關(guān)系)加入到圖以后,就會(huì)抑制這兩個(gè)關(guān)鍵幀的鄰域關(guān)系。具體的回環(huán)檢測(cè)流程是,從共視矩陣的未探索部分按共視程度降序采樣,連續(xù)檢測(cè)三個(gè)回環(huán)候選幀,如果平均流均低于閾值,則認(rèn)為檢測(cè)到了回環(huán),然后進(jìn)行優(yōu)化。這個(gè)方法其實(shí)和ORB-SLAM2很像。
之后,就可以進(jìn)行優(yōu)化,這里是直接使用DBA層(具體原理可參考DROID-SLAM論文)來求解非線性最小二乘問題,同時(shí)優(yōu)化相機(jī)位姿G和逆深度d。其中(i,j)表示連接關(guān)系,Π表示投影函數(shù),p表示像素位置,公式里面的G表示位姿變換關(guān)系。最后使用高斯牛頓法來優(yōu)化局部關(guān)鍵幀的最優(yōu)位姿和深度。
后端優(yōu)化這一塊,顯然不能直接優(yōu)化所有的歷史幀。作者的做法是,開啟一個(gè)新的共視關(guān)鍵幀圖,在插入新邊以后抑制冗余鄰域邊。這樣就可以很大程度上降低計(jì)算量。GO-SLAM考慮了輸入幀的完整歷史信息,并連續(xù)對(duì)齊所有關(guān)鍵幀位姿。它還使用對(duì)齊策略實(shí)現(xiàn)瞬時(shí)閉環(huán)和全局結(jié)構(gòu)的校正,在內(nèi)存和時(shí)間都很有效率。
現(xiàn)在可以用獲得的位姿和深度圖進(jìn)行NeRF了,那問題又來了,如何確保更新后的重建保持全局一致呢?同時(shí)用所有關(guān)鍵幀來做NeRF肯定可以保證全局一致性,但也就沒辦法實(shí)時(shí)了。
這里作者對(duì)參與稠密重建的關(guān)鍵幀進(jìn)行了篩選:
首先,確保包含最新的兩個(gè)關(guān)鍵幀和未經(jīng)建圖優(yōu)化的關(guān)鍵幀。然后將所有關(guān)鍵幀按照當(dāng)前和上次更新狀態(tài)之間的位姿差降序排列,并從排序列表中選擇前10個(gè)關(guān)鍵幀。最后,為了解決遺忘問題,還使用分層抽樣從所有可用的關(guān)鍵幀中選擇10個(gè)關(guān)鍵幀。
后面NeRF的渲染就是直接使用了現(xiàn)成的NeuS模型。
損失函數(shù)這一塊設(shè)置的比較多,除了比較常用的圖像光度損失和深度損失,還引入了正則化項(xiàng)來優(yōu)化SDF:
為了監(jiān)督SDF進(jìn)行精確的表面重建,還計(jì)算采樣點(diǎn)xi到關(guān)鍵幀深度Dm的距離來近似采樣點(diǎn)xi的真實(shí)SDF。在Dm-預(yù)測(cè)深度(b)為不同值時(shí)采取不同的損失函數(shù)策略:
最終的損失函數(shù)是幾項(xiàng)小損失的加權(quán)和:
4. 實(shí)驗(yàn)
實(shí)驗(yàn)這一塊,運(yùn)行設(shè)備是i9-10920X CPU和一塊3090。作者分別評(píng)估了軌跡精度和建圖精度,更側(cè)重軌跡精度,使用的數(shù)據(jù)集包括TUM RGB-D、EuRoC、ETH3D-SLAM、ScanNet還有Replica,軌跡評(píng)估非常多。評(píng)估指標(biāo)方面,主要就還是使用ATE,其他指標(biāo)包括準(zhǔn)確率、完成率、完成比值,還有F指數(shù),還有用L1評(píng)估了深度估計(jì)的精度。
下面是在TUM數(shù)據(jù)集上的ATE對(duì)比結(jié)果,左側(cè)是單目結(jié)果,右側(cè)是RGB D結(jié)果。GO-SLAM的精度達(dá)到最優(yōu),這也是筆者第一次見到NeRF SLAM的精度超越傳統(tǒng)方法。這個(gè)實(shí)驗(yàn)做的很詳細(xì)的,像之前的NICE-SLAM和iMAP也只是對(duì)比了fr1/desk、fr2/xyz和fr3/office這三個(gè)序列,但是GO-SLAM這一塊對(duì)比的序列很多,還同時(shí)對(duì)比了傳統(tǒng)方法和學(xué)習(xí)方法。但筆者對(duì)ORB-SLAM2/3的結(jié)果有些不認(rèn)可,ORB-SLAM3并沒有在那么多序列上跟蹤失敗。
下面是EuRoC實(shí)驗(yàn),GO-SLAM的精度同樣出彩。值得注意的是,傳統(tǒng)SLAM在單目序列上容易跟蹤失敗,但是GO-SLAM可以保持魯棒性。
還在EuRoC和ETH3D上對(duì)比了稠密重建的效果,GO-SLAM的重建精度優(yōu)于DROID-SLAM。
下面是在ETH3D上的實(shí)驗(yàn),y軸是成功的軌跡,x軸是RMSE精度,最大誤差是2cm。這個(gè)結(jié)果說明GO-SLAM優(yōu)于基于點(diǎn)、基于surfel的、基于體素的方案。BundleFusion和GO-SLAM有點(diǎn)類似,只是更側(cè)重稠密重建。但BundleFusion的姿態(tài)估計(jì)極易受誤差的影響,導(dǎo)致重建質(zhì)量較差。
ScanNet上的結(jié)果表明,DROID-SLAM在短序列和RGB-D輸入上表現(xiàn)較好,但在單目場(chǎng)景下處理較長(zhǎng)序列時(shí),其精度急劇下降。相比之下,GO-SLAM的結(jié)果始終很不錯(cuò)。此外,由于沒有全局優(yōu)化來消除累積誤差,iMAP和NICE-SLAM在位姿估計(jì)和三維重建方面效果不是太好。
最后是Replica實(shí)驗(yàn),對(duì)比的方案也很全,最新的Orbeez-SLAM都有。這里可以看出來NICE-SLAM的運(yùn)行速度還是太慢了。這里也推薦「3D視覺工坊」新課程《徹底剖析激光-視覺-IMU-GPS融合SLAM算法:理論推導(dǎo)、代碼講解和實(shí)戰(zhàn)》。
大家一定很關(guān)心運(yùn)行效率,作者對(duì)比了CPU頻率、GPU顯存、FPS和最終精度。整體來看,GO-SLAM需要的計(jì)算資源還是比較多的,運(yùn)行速度也不快,但是達(dá)到了一個(gè)CPU/GPU需求和精度的平衡。
5. 總結(jié)
NeRF和SLAM結(jié)合是一個(gè)非常新興的方向,有大量的點(diǎn)可以挖掘。GO-SLAM這篇文章是ICCV 2023的最新工作,同時(shí)優(yōu)化SLAM的軌跡軌跡和NeRF的稠密重建,效果非常好。筆者覺得這項(xiàng)工作最大的意義在于第一次在NeRF-based SLAM中引入了回環(huán)檢測(cè)和全局BA,以此來消除累積誤差。這項(xiàng)工作還沒有完全開源,感興趣的小伙伴可以跟蹤一下相關(guān)的Github進(jìn)展。
編輯:黃飛
?
評(píng)論
查看更多