【轉】SLAM | 視覺SLAM中直接法開源算法:LSD-SLAM、DSO


 

前面的話

 

VSLAM 是利用多視圖幾何理論,根據相機拍攝的圖像信息對相機進行定位並同時構建周圍環境地圖。VSLAM 前端為視覺里程計和回環檢測,相當於是對圖像數據進行關聯;后端是對前端輸出的結果進行優化,利用濾波或非線性優化理論,得到最優的位姿估計和全局一致性地圖。

 

前面已經介紹了系列一:VSLAM的前端:視覺里程計和回環檢測系列二:VSLAM中的后端優化和建圖系列三:VSLAM中特征點法開源算法:PTAM和ORB-SLAM

 

在前面的系列文章中,我們也介紹過特征點法與直接法的區別。並且我們知道,直接法不依賴特征的提取和匹配,直接通過兩幀之間的像素灰度值構建光度誤差來求解相機運動,並且直接法可以在特征缺失的場合下使用。

 

今天,我們主要來關注VSLAM中直接法開源算法。

 

4 直接法開源算法

 

4.1 LSD-SLAM

 

DTAM是直接法的鼻祖, 是 2011 年提出的單目 SLAM算法,對每個像素點進行概率的深度測量,有效降低了位姿的不確定性。該方法通過整幅圖像的對准來獲得稠密地圖和相機位姿,但是需要 GPU 加速,超出了本文的討論范圍。

基於同樣的原理, TUM 機器視覺組的 Engel 等人於2013 年提出了基於直接跟蹤的視覺里程計(semi-dense visual odometry)系統,該 VO 系統是第一個不采用特征的實時的視覺里程計。后來他將地圖優化融入該 VO 系統並擴展為LSD-SLAM,得到了不采用特征的實時SLAM 系統。 該系統通過對圖像光度直接配准和使用概率模型來表示半稠密深度圖,生成具有全局一致性的地圖。

 

它有如下創新點


      a) 使用隨機深度初始化策略類似於濾波器方法的思路來完成初始化。將圖像中的像素以隨機的深度初始化,並利用新產生的數據不斷迭代優化直至收斂,當初始場景的深度方差收斂到最小值時,認為初始化完成。


    b) 通過假設圖像像素逆深度服從高斯分布,對每個像素深度獨立計算,通過卡爾曼濾波更新深度估計, 將深度圖的噪聲融合到圖像跟蹤中,構建半稠密和高精度的三維環境地圖;


    c) 為了避免尺度上的漂移,將估計的深度均值歸一化,而且考慮深度和極線的夾角,在關鍵幀的直接配准上,采用sim3 來衡量其變換,並將光度殘差和深度殘差一起放入優化函數中

其中:兩項分別為被歸一化的光度殘差和深度殘差;表示 Huber 核函數,避免誤差太大而覆蓋其他的正確值。

 

4.1.1 主要結構

 

LSDSLAM 具有圖像跟蹤、深度估計和地圖優化三個線程。

 

 

圖像跟蹤。 主要計算當前幀與參考幀之間的相對變換,有精確方式和快速方式,都采用加權的高斯牛頓優化方法。關於跟蹤失敗后的重定位,在文章里沒有,但是開源代碼里有實現:將當前幀和鄰近的關鍵幀連接起來,計算坐標變換關系,通過打分和遍歷整個附近幀來判斷是否完成重定位。


深度估計。 當相機移動超過了閾值,那么需要創建關鍵幀,將之前關鍵幀的點投影到當前新的關鍵幀上,通過 sim3變換得到該關鍵幀的深度估計。當跟蹤幀沒有變為關鍵幀,文章中用它來更新圖像的像素深度:先采用自適應的方法確定搜索范圍,然后通過卡爾曼濾波不斷地利用觀測值對深度進行修正。


地圖優化。 其目的是利用閉環解決尺度漂移的問題。首先去尋找所有可能相似的關鍵幀,並計算視覺意義上的相似度,並由 appearance-based mapping 算法篩選出來的候選幀,而且需要進行跟蹤檢測,當完成閉環約束以后,再通過全局優化得到全局一致性地圖,其包括關鍵幀組成的姿態圖和對應的半稠密深度圖。

 

4.1.2 優缺點

 

LSDSLAM 是直接法中比較完整的 SLAM 系統,能夠在普通 CPU 上實現半稠密 SLAM(梯度明顯的像素),后續Engel 對LSDSLAM 進行了功能拓展,使其能夠支持雙目相機和全景相機。 

 

但是它存在一定缺點:對相機內參和曝光非常敏感,而且准確性方面不及 ORBSLAM,速度方面不及 DSO。

 

作者后續研究了光度標定,將其擴展應用於 DSO系統(https://github.com/JakobEngel/dso)。

 

4.2 DSO

 

DSO為 Engel 在 2016 年發布的一個視覺里程計方法,因為沒有閉環,所以只能算 SLAM 的一個模塊(后續應該會完善),文中宣稱速度可以達到傳統特征點法的五倍。


直接法因為是比較兩幀圖像之間的像素差異,需要滿足光度不變,但是這是一個很強的假設,尤其是針對普通的自動曝光相機。在做 DSO 工作之前, Engel 先研究了光度標定相關工作, 因為他認為對相機的曝光時間、暗角、伽馬響應等參數進行標定后,能夠讓直接法更加魯棒。這個過程建模了相機的成像過程,對於由相機曝光不同所引起的圖像明暗變化會有更好的表現。 

 

DSO 是一種結合直接法和稀疏法的視覺里程計,它不檢測和計算特征點, 而是采樣圖像內具有強度梯度的像素點;它將光度誤差模型和所有模型參數融入到優化函數中進行聯合優化, 而且該系統結合曝光時間、 透鏡暈影以及非線性響應函數的影響提出了完整的光度標定方法,並在多個數據集上進行了測試,達到了很好的精度和速度, 可以說是 LSDSLAM 的升級版。 

 

進一步地, Engel 小組研究了雙目的 DSO,但並沒有開源代碼(吳佳田、顏沁睿等做了相應的工作(https://github.com/HorizonAD/stereo_dso)),而且包括他們自己在內的很多研究者在 DSO 的基礎上擴展,嘗試給 DSO 添加回環檢測和地圖重用的模塊。

 

4.2.1 具體流程

 

將相機內參和曝光參數作為優化變量引入優化函數,並推導了其相對於殘差的雅可比是 DSO 的最大創新之處。其流程如下圖所示。

 

 

首先是兩幀圖像對齊初始化和地圖點的更新:地圖點在一開始被觀測到時,其深度是未知的,隨着相機的運動, DSO 會采用沿着極線搜索方式在每張圖像上追蹤這些地圖點,跟蹤過程會確定每個地圖點的逆深度和變化范圍;


然后通過相機視野改變、相機平移和曝光時間顯著改變這些參數是否達到閾值來構建關鍵幀。在后端優化過程中, DSO采用由相個關鍵幀組成滑動窗口的方式,不斷地計算需刪除的關鍵幀和添加關鍵幀, 並且將每個先前關鍵幀中的地圖點投影到新關鍵幀中, 形成殘差項,同時在新的關鍵幀中更新地圖點和刪除外點。

 

與 LSD-SLAM 類似, DSO 的前端線程通過匹配新幀與關鍵幀來跟蹤相機的位姿,然后通過一定的條件判斷新幀是否會成為關鍵幀,並將新關鍵幀插入后端優化線程。 DSO 的后端在一個滑動窗口內對維護的 5~7 個關鍵幀進行優化。在各關鍵幀中提取深度收斂的像素點,投影至其他關鍵幀中,得到光度誤差

最后滑動窗口通過優化光度誤差之和

與傳統的捆集調整對全局的關鍵幀和特征點進行優化不同,DSO 中的滑動窗口優化保存一定數量的關鍵幀,需要將多余的幀進行邊緣化處理。滑動窗口優化中的邊緣化通過更新信息矩陣,將被刪除幀的信息作為先驗信息保存在信息矩陣中,控制了優化的計算量,又實現了良好的優化效果。

 

 

3.2.2 具體細節

 

一、在DSO中,有哪些地方用了邊緣化?
首先,DSO的BA,也和傳統BA一樣。因此DSO在解BA時,邊緣化了所有點的信息,計算優化的更新量。然而,與傳統BA不同的是,DSO的左上角部分,即公式中的  ,並非為對角塊,而是有先驗的。傳統BA中,這部分為對角塊,主要原因是不知道相機運動的先驗,而DSO的滑動窗口,則通過一定手段計算了這個先驗。這里的先驗主要來自兩個部分:

  1. 邊緣化某個點時,這個點的共視幀之間產生先驗;
  2. 邊緣化某個幀時,在窗口內其他幀之間產生先驗;

這里的“邊緣化”,是通過舒爾補,用矩陣的一部分去消元另一部分。然而實際操作的含義卻有所不同。在BA的邊緣化中,我們希望用邊緣化加速整個問題的求解,但是解完問題后,這些幀和點仍舊是存在於窗口中的!而滑動窗口中的邊緣化,是指我們不再需要這個點/這個幀。當它被邊緣化時,我們將它的信息傳遞到了之后的先驗中,而不會再利用這個點/這個幀了!請讀者務必理清這層區別,否則在理解過程中會遇到問題。我們不妨將后者稱為“永久邊緣化”,以示區分。那么DSO如何永久邊緣化某個幀或點?它遵循以下幾個准則:

  • 如果一個點已經不在相機視野內,就邊緣化這個點;
  • 如果滑動窗口內的幀數量已經超過設定閾值,那么選擇其中一個幀進行邊緣化;
  • 當某個幀被邊緣化時,以它為主導的地圖點將被移除,不再參與以后的計算。否則這個點將與其他點形成結構先驗,破壞BA中的稀疏結構

在邊緣化的過程,DSO維護了幀與幀間的先驗信息(見EnergyFunctional::HM和bM),並將這些信息利用到BA的求解中去。

二、First-Estimate-Jacobian

在邊緣化的時候,我們需要不斷迭代計算H矩陣和殘差b,而迭代過程中,狀態變量會被不斷更新,計算雅克比時我們要fix the linearization  point。也就是,計算雅克比時求導變量要固定,而不是用每次迭代更新以后的x去求雅克比,這就是所謂的用第一次得到的雅克比(First Estimate Jacobians)

 

在DSO實際使用時,僅在優化的初始時刻計算幾何和光度的雅可比,並讓它們在隨后的迭代過程中保持不變,即First-Estimate-Jacobian。FEJ強制讓每個點在同一個時刻線性化,從而回避了零空間降維的問題,同時可以降低很多計算量


DSO中的每個地圖點,由前面定義的pattern產生8個殘差項,這些殘差項也會共享FEJ。由於幾何和光度函數都比較光滑,實踐當中FEJ近似是十分好用的。

 

3.2.4 優缺點


DSO采用最小化光度誤差的優化算法,並且考慮了光度標定模型,其優化范圍不是所有幀,而是由最近幀及其前幾幀形成的滑動窗口。與現有的直接法不同,優化所有模型參數(包括相機內參,相機外參和逆深度值),但算法效率與間接法中常用的bundle adjustment算法相近。同時,采用和其他直接法相同的地圖點表示方法,即三維點被表示為相應坐標下的逆深度值,因此只有一個自由度。

 

在大部分數據集上,DSO均有較好的表現。雖然DSO要求全局曝光相機,但即使是卷簾快門的相機,只要運動不快,模糊不明顯,DSO也能順利工作。但是,如果出現明顯的模糊、失真,DSO也會丟失。
直接法相比傳統特征點法,最大的貢獻在於,直接法以更整體、更優雅的方式處理了數據關聯問題。特征點法需要依賴重復性較強的特征提取器,以及正確的特征匹配,才能得正確地計算相機運動。在環境紋理較好,角點較多時,這當然是可行的——不過直接法在這種環境下也能正常工作。然而,如果環境中出現了下列情況,對特征點法就不那么友善:

  • 環境中存在許多重復紋理;
  • 環境中缺乏角點,出現許多邊緣或光線變量不明顯區域;

直接法給予我們追蹤邊緣、平滑區塊的能力,但同時也要付出代價——正確的直接法追蹤需要有一個相當不錯的初始估計,還需要一個質量較好的圖像。由於DSO嚴重依賴於使用梯度下降的優化問題求解,而它成功的前提,是目標函數從初始值到最優值之間一直是下降的。在圖像質量不佳或者相機初始位姿給的不對的情況下,這件事情往往無法得到保證,所以DSO也會丟失

 

 DSO 初始化不僅需要較好的初始估計,還比較依賴梯度下降的優化策略, 而它成功的前提要求目標函數是單調的,但這件事情往往無法得到保證。進一步說,如果想在 DSO 上加重定位功能,首先需要保存所有幀,然后需要對相機位姿有一個比較准確的初始估計。但這通常是困難的,因為不知道誤差累積了多少。而在特征點法中,地圖重用則相對簡單。

 

結語

 

直接法是采用大量的像素信息來優化求解相機位姿, 與特征點法相比是數量替代質量的過程,本文只需存儲空間中所有的特征點和它們的特征描述,然后匹配當前圖像中看到的特征,計算位姿即可。從這個角度來看:直接法應該更擅長求解連續圖像的定位,而特征點法則更適合全局匹配與回環檢測。 

 

該篇作為SLAM系列的第四篇,主要介紹了直接法開源算法——LSD-SLAM和DSO。接下來,SLAM系列文章會持續更新,會繼續和大家介紹更多主流框架,VIO多傳感器融合以及激光SLAM等內容,歡迎大家持續關注~

 

 

獲取文中論文原文和閱讀筆記完整版,請關注公眾號留言或掃描下方個人微信。

 

參考:

1. D.Caruso, J. Engel, and D. Cremers. Large-scale direct SLAM for omnidirectionalcameras. In International Conference onIntelligent Robot Systems (IROS), 2015. 4

2.  SLAM中的marginalization 和 Schur complement

3.  https://arxiv.org/pdf/1708.07878.pdf

4. 《視覺SLAM十四講:從理論到實踐 第2版》高翔等人

5. https://zhuanlan.zhihu.com/p/29177540 知乎文章

6. https://www.cnblogs.com/luyb/p/6077478.html

 

 

 

目標檢測系列

 

語義分割系列

 

面試求職系列

 
        

一起學C++系列

 

競賽與工程項目分享系列

 

SLAM系列

 

視覺注意力機制系列

轉自:

  https://mp.weixin.qq.com/s?__biz=MzI0NDYxODM5NA==&mid=2247483959&idx=1&sn=4a40d6a04bb78b3f72d6f3ea990ba6bd&chksm=e95a47c2de2dced4d492bce80931074dd2b73394d6da75eb7eb53b0566ed4fab1bf6bcf00911&scene=21#wechat_redirect


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM