SLAM笔记(五)光束平差法(Bundle Adjustment)
1.什么是光束平差法
前邊的八點法,五點法等可以求出閉式解的前提是已經知道確切的點對。但實際情況中往往存在大量的噪聲,點與點不是精確地對應甚至出現一些錯誤匹配。?
光束平差法由Bundle Adjustment翻譯得來,有兩層意思:?
對場景中任意三維點P,由從每個視圖所對應的的攝像機的光心發射出來并經過圖像中P對應的像素后的光線,都將交于P這一點,對于所有三維點,則形成相當多的光束(bundle);實際過程中由于噪聲等存在,每條光線幾乎不可能匯聚與一點,因此在求解過程中,需要不斷對待求信息進行調整(adjustment),來使得最終光線能交于點P。對m幀,每幀含N個特征點的目標函數如下:?
?
(1)?
其中:表示受白噪聲影響的估計二維點坐標,為投影函數,ruguo 如果點j出現在圖i上,則,否則。?
這是一個非凸問題。?
式子(1)表示對所有點?
以上便是光束平差法目標函數的原理。由于場景中特征點往往較多,該問題是一個巨大的高維非線性優化問題。接下來,需要對上述式子進行求解,這是光束平差法的核心內容。?
針對具體應用場景,光束平差法有不同收斂方法。目前常用的方法有梯度下降法,牛頓法,高斯牛頓法,Levenber-Marquardt等方法。
2.1 一階方法——梯度下降法
所謂一階方法,即對問題的目標函數進行泰勒一階展開后進行迭代求解的方法。梯度下降法是一階方法之一。當梯度為負值時,沿著梯度方向就是函數值f變小最快的方向。梯度下降法就是讓函數沿著下降最快的方向去找函數值的最小值,就像水流沿著斜率最大的方向流去。對于變量都為標量的函數,形象的描述是始終用一條直線來擬合曲線。梯度下降法迭代式子如下:
?
(2)
?
其中,?表示自己設置的迭代步長,可用一維線性搜索動態確定。x表示自變量。
嚴格意義上,梯度下降法并不決定函數f(x)下降方向,因為它僅僅是一個余向量而非向量,只能通過最終標量的正負而非實際的向量指引函數下降方向。梯度下降法的復雜度是Ο(n),其中n為待解決問題的大小,比如矩陣E的行數。實際過程中,常常使用一維線性搜索方法來尋找合適的步長。
2.2 二階方法——牛頓法(Newton Method)
牛頓法是二階優化方法,即會將目標函數展開至泰勒二階項然后進行優化求解。與梯度法相比,它們利用到了目標函數的二階導數。形象地講,如用牛頓法求解自變量為標量的函數時,用二次曲線來擬合最優化點時的函數曲線。
對目標函數E,其二階泰特展開式為:
其中g為E的雅克比矩陣,H為E的海塞矩陣。
由于優化點的導數為0,即:
上式展開,易知x的迭代式子為:
由于牛頓法下降速度很快。實際中往往加上一個步長因子γ?(0,1),來控制收斂的速度:
牛頓法是二階收斂的,收斂速度很快。在實際應用中,向量x往往非常大(每個視圖中圖像處理后特征點數量可能達到萬個以上),海森矩陣H將非常大,求海塞矩陣的逆的運算消耗將非常大,對于牛頓法來說,計算復雜度是O(n3)。此外,由于海塞矩陣不一定可逆。其三,對于大多數一階優化方法,可以采用諸如圖形處理器(Graphics Processing Unit)并行的方式來加速,但對于海塞矩陣求逆來說這顯然無法實現。因此實際中往往出現一階方法比二階方法更快收斂。
2.3 擬牛頓法——高斯牛頓法(Gauss-Newton Method)
所謂擬牛頓法,就是用其他式子來模擬替代海塞矩陣。假如牛頓法中的海塞矩陣不是正定(positive definitive)的,無法求解;此外,海森矩陣H往往非常大,求海塞矩陣的逆的運算消耗也很大(對于牛頓法來說,計算復雜度是O(n3)),因此,引入用擬牛頓法來用正定矩陣代替海塞矩陣和海塞矩陣的逆。常用的擬牛頓法有高斯牛頓法(Gauss-Newton Method)。
假設最小二乘問題目標函數如下:?
其中ri(x)是對應觀測值與預測值之間的殘差。
仿照2.3可以得到牛頓法中的迭代式子(10)。不過其中梯度矩陣g:
海塞矩陣H:
如果對于一個近線性的優化問題,則上式第二項更趨近于0,因此舍棄第二項,上式為:
則:
也即有:
由于采用?,計算量大大減少
應當特別指出,上式成立的條件是。在結構與運動過程中,由于一般認為到場景位置點的距離比較遠的,因此短暫的移動過程中,可以認為從攝像機到場景位置點的距離是近似不變的。在距離不變,也就是一個維度固定的前提下,投影函數π是線性的。因此該近似符合應用場景,是很好的近似。
2.4 Levenberg-Marquardt方法
另外一種思路是將牛頓法和梯度法融合在一起。數學上是阻尼最小二乘法的思路,即近似只有在區間內才可靠。對于
此處μ是信賴區間半徑,D為對?進行轉換的矩陣(在Levenberg的方法中,他將D設置為單位矩陣)。
即加上一個單位矩陣I的倍數和使之成為:
這種方法時保證改進后的海塞矩陣可逆且正定。從效果上,是用λ在牛頓法與梯度法之間做出權衡。當λ很小時,上式幾乎等同與牛頓法式子,當λ很大時,上式等同于梯度下降法的式子。
后來,Levenberg(1944)對此方法進行了改進。他將H替換成高斯牛頓法中的擬合矩陣:
其中:?(15)
但容易出現的問題是,當?很小的時候,λI可能很大。這樣會極大地偏向梯度法,降低收斂速度。因此為了提高收斂速度,Marquardt 提出了一種新的自適應方法:它的迭代式子中:
因此當很小時,該方法也不會特別偏向梯度法。
在L-M方法中,采用了近似程度描述ρ
即ρ=實際下降/近似下降。當ρ太大,則減少近似范圍(增大λ),當p太大,則增加近似范圍(減少λ)。
因此最常使用的光束平差法模型, L-M算法計算步驟如下:
a)給定初始值;?
b)對第k次迭代,求解?
c)計算ρ?
d)若ρ>0.75(經驗值),則μ=2μ(經驗值,實際可視作變化迭代步長);?
若ρ<0.25(經驗值),則μ=0.5μ(經驗值);?
e)如果ρ大于某閾值,則該次近似是可行的,回到b)繼續迭代;否則算法已經收斂,迭代結束。
2.5與高斯牛頓法相比LM算法的優缺點
高斯牛頓法的缺點是:
- 可能是奇異的病態的,無法保證求解的增量的穩定性;
- 步長可能很大從而導致無法滿足高斯牛頓的一階能大致擬合的假設?
優點: - 下降速度比LM快
LM是信賴區域優化法的代表,而加上步長的高斯牛頓法是線搜索方法的代表。
3 關于光束平差法的其他問題
(1)初始值
光束平差法需要比較好的初始值才能比較快地收斂,所以光束平差法一般作為重建流水線的最后一個步驟,在此之前,需要使用多視圖幾何中傳統的八點法,五點法等傳統多視圖幾何算法先算出R,T等信息。
(2)步長控制
引入步長控制,既可以是避免收斂時步長太大而在最優點附近震蕩,也可以加快收斂速度。加入迭代步長的原因,是因為?牛頓法中?下降方向?可能和真實下降方向不一致*?。*比如可能會出現幾個最優點相鄰比較近的情況,那么優化過程將在幾個谷底之間跳來跳去遲遲不收斂。為了避免這種情況,增加收斂速率,加入一個迭代步長γ,來使迭代朝著真實下降方向走。如果在鞍點,在沿著海塞矩陣為負的方向迭代。實際應用中,可以采用每一次迭代后,再對γ進行一維搜索的方法來尋找合適步長。也可以采用L-M的方法,通過改變信任區間的方式,來進行步長控制。?
4.常用優化庫:?
常用BA庫:?
sba: A Generic Sparse Bundle Adjustment C/C++
Apero/MicMac, a free open source photogrammetric software. Cecill-B licence.
Package Based on the Levenberg–Marquardt Algorithm (C, MATLAB). GPL.
cvsba: An OpenCV wrapper for sba library (C++). GPL.
ssba: Simple Sparse Bundle Adjustment package based on the Levenberg–Marquardt Algorithm (C++). LGPL.
OpenCV: Computer Vision library in the contrib module. BSD license.
mcba: Multi-Core Bundle Adjustment (CPU/GPU). GPL3.
libdogleg: General-purpose sparse non-linear least squares solver,based on Powell’s dogleg method. LGPL.?
ceres-solver: A Nonlinear Least Squares Minimizer. BSD license.?
g2o: General Graph Optimization (C++) - framework with solvers for sparse graph-based non-linear error functions. LGPL.
DGAP: The program DGAP implement the photogrammetric method of bundle adjustment invented by Helmut Schmid and Duane Brown. GPL.?
工程上常用的是g2o和ceres-solver。此上列表來源不可考,如有侵權請聯系我以刪除。
總結
以上是生活随笔為你收集整理的SLAM笔记(五)光束平差法(Bundle Adjustment)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《梦仙》第四十四句是什么
- 下一篇: 信用卡一次能取多少钱?