利用ceres solver解大規模線性方程組

2021-06-27 10:20:32 字數 1641 閱讀 6268

在工程應用中,最後要求解的線性方程組往往是原來的殘差模型進行線性化後的誤差方程。通常情況下,模型的線性化由人工完成,而求解誤差方程則借助eigen等矩陣運算庫(參考1)來實現。現在,我們有了另一種選擇,那就是ceres solver。ceres是google公司用來解決非線性優化問題的開源庫,主要是為了解決sfm問題中的光束法平差而設計的。與一般的矩陣運算庫不同的是,我們只需要給ceres提供原始的殘差模型就可以了,而無需自己求偏導數。ceres solver的安裝和嚮導可以在下面給出的參考2的鏈結中找到,乙個寫的很好的中文用例可以在參考3的連線中找到。參考3給出的更多的是對參考2的翻譯,最後也給出了乙個空間後方交會的例子,但是未知數的數量只有6個,屬於比較簡單的例子。本文將結合實際應用,給出乙個大規模最小二乘問題的求解例項。

現在有如上所示的乙個能量函式,這個函式的第一項是觀測值約束,第二項是未知數的平滑約束,這是乙個工程領域十分常見的能量函式模型。我們用這個模型是要解決,利用一幅影象中稀疏的深度觀測值來估計出乙個密集的深度圖(圖1)。因此,對於一幅影象而言,每個畫素對應乙個未知數,比如對於1000*1000的一幅影象將會有100w個未知數。公式1是個非線性方程,但是求解這個問題卻可以通過求偏導轉換為乙個線性方程組,具備確定解。但是由於未知數個數很多,所以利用qr分解等直接法不可能求解。好在ceres提供了豐富的選擇可解決這個大規模的稀疏矩陣的求解問題(詳見參考2)。

圖 1. 左邊為稀疏深度圖,右邊為密集深度圖

下面,我們只闡述ceres解決該方程的具體方法,在此之前,要說的是公式1中第二項中的二階偏導可以表示為離散形式:

這樣的話,就可以直接利用ceres直接構建觀測方程並求解了。

struct costfunctor1 

template bool operator()(const t* const depthmap, t* residual) const

static ceres::costfunction* create(const double observed_depth)

double observed_depth;

};struct costfunctor2

template bool operator()(const t* const depthleft, const t* const depth,

const t* const depthright,t* residual) const

static ceres::costfunction* create(const double observed_w)

double observed_w;

};

ceres::problem problem;

for (int i=0;i

參考2:(tutorial-ceres solver)

參考3:(李民錄csdn部落格)

利用runtime進行歸檔解檔

做過ios開發的應該都知道資料的本地化的方式,其中歸檔就是其中的一種。說實話,在本人在專案中並不是很常用歸檔來進行資料的本地儲存。今天之所以寫這篇部落格是因為最近了解到原來我們還能利用runtime進行歸檔和解檔。先來看一下我們之前的歸檔 解檔 例如我們要對person這個擁有name和age屬性的...

9733 大腦的9大未解之謎

大腦的9大未解之謎 1.大腦為什麼有時間的意識 為什麼人人都自帶 生物鬧鐘 比如想要第二天早晨辦的很緊急的事,清晨一起床就想起來了 當然,健忘者另當別論 等待的時間越長,你會感到越急躁。換句話說,你是有意識的。這個複雜的話題從一開始就困擾著科學界,對於意識,只有哲學家給出個乙個詳細的定義,但意識到底...

利用動態規劃的思想求最優解

源自 劍指offer 中的剪繩子問題,書中使用的是c 但是我更喜歡用python實現。這裡按照從上而下的順序計算,也就是說我們先得到f 2 f 3 再得到f 4 f 5 直到得到f n for i in range 4,length 1 max length 0 temp i 2 1 for j i...