1. 程式人生 > >經典演算法Semi-Global Matching(SGM)文獻筆記(二)

經典演算法Semi-Global Matching(SGM)文獻筆記(二)

SGM的代價聚合,其實仔細看看,這並不是嚴格意義上的代價聚合,因為SGM是為了優化一個能量函式,這和一般的全域性演算法一樣,如何利用優化演算法求解複雜的能量函式才是重中之重,其能量函式如下所示:



其中,C(p, Dp)代表的就是基於互資訊的代價計算項,後面兩項指的是當前畫素p和其鄰域內所有畫素q之間的約束,如果q和p的視差只差了1,那麼懲罰P1,如果大於1,那麼懲罰P2,這麼做基本上是機器學習中的常用方法,即所謂的正則化約束。這裡需要注意的是,P2要大於P1,這麼做真心有用。

1. 假如不考慮畫素之間的制約關係,不假設領域內畫素應該具有相同的視差值,那麼最小化E(D)就是最小化每一個C,這樣的視差圖效果很差,因為影象總會收到光照,噪聲等因素的影響,最小的代價對應的視差往往是“假的”,並且這樣做全然不考慮相鄰之間的畫素關係,例如,一個桌面的視差明顯應該相同,但是可能由於傾斜光照的影響,每個畫素的最小代價往往會不同,所以看起來就會亂七八糟,東一塊西一塊。這就是加上約束的目的。


2. 新增兩個正則化項一方面是為了保證視差圖平滑,另一方面為了保持邊緣。懲罰的越大,說明越不想看到這種情況發生,具體來說,如果q和p之間的視差有所差異但又不大,那麼就要付出代價,你不是想最小化能量函式麼?那麼二者都要小,如果沒有第二項,那麼求出來的視差圖將會有明顯的鋸齒現象,如果只有第三項,那麼求出來的視差圖邊緣部分將會得到保持,但由於沒有對相差為1的相鄰畫素進行懲罰,物體內部很可能出現一個“斜面”。

3. 這事情還沒完,本文中有對這兩項的解釋,原文內容如下所示:



這句話的隱含意思是,如果我們讓P1<P2,那麼會允許出現小的斜面,也會保持邊緣,前面一句我理解,懲罰的力度不大,就會導致這種事情還會發生,這也正是作者想看到的,水至清而無魚嘛,不過,後一句中的P2並不是常數項,是根據相鄰畫素的差距來決定的,括號裡面的“與大小無關”看起來就更加矛盾了,不知道哪位可以給好好解釋一下這句話?


有了能量函式,下面要做的就是求解它了,這個時候問題來了,這個E對p是不可導的,這意味著我們常看到的梯度下降,牛頓高斯等等演算法在這裡都不適用,作者於是採用了動態規劃來解決這一問題,動態規劃相信大家都知道了,但是其真正的精髓卻是深藏不露,我早在大三期間就接觸到了動態規劃演算法,這麼多年過去了,雖然時而會用到這個演算法,但到現在仍舊不敢說自己徹底懂它。。。。

簡單地說,p的代價想要最小,那麼前提必須是鄰域內的點q的代價最小,q想要代價最小,那麼必須保證q的領域點m的代價最小,如此傳遞下去。

本文只說說作者是怎麼利用動態規劃來求解E,其實這個求解問題是NP完全問題,想在2D影象上直接利用動態規劃求解是不可能的,只有沿著每一行或者每一列求解才能夠滿足多項式時間(又叫做掃描線優化),但是這裡問題來了,如果我們只沿著每一行求解,那麼行間的約束完全考慮不到,q是p的領域的點其實這個時候被弱化到了q是p的左側點或者右側點,這樣的求優效果肯定很差。於是,大招來了!!我們索性不要只沿著橫或者縱來進行優化,而是沿著一圈8個或者16個方向進行優化。




這是一幅神奇的圖示,我一直沒有弄明白它到底是什麼意思,笨死了,直到有一天我終於領悟它的真諦(仰天長嘯)。我們先來看看優化求解過程:





每一個點的代價聚合值是“當前代價+min(路徑相鄰點的當前視差代價聚合值 + P1,路徑相鄰點的視差差值為1的代價聚合值 + P1,路徑相鄰點的視差插值大於1的最小代價聚合值 + P2)- 路徑相鄰點的視差插值大於1的最小代價聚合值 ”,聽起來夠繞口的,其實就好比最小代價的蔓延,當前代價聚合值由當前代價和路徑上一點的加了懲罰的最小代價聚合值所決定(最後那一項純粹是為了防止數字過大,這是常用手段)。

其實為什麼分解為8個方向想想看也很正常,能量函式E中每個p的能量是“自身代價本身+周圍畫素q帶來的懲罰”,周圍畫素足足有8個,想求它們和的最小化十分難,最樸素的想法就是“分而求之”,我們就規定一個方向r,這個方向上p的鄰居q只有一個,那麼沿著這一方向的p的代價聚合值就成為了上面公式的樣子。進一步,將8個方向的代價聚合值都加起來,就形成了p的最終代價聚合值。然後用WTA搞一下得到的視差圖可以得到一個較小的能量E,目的就達到了。

我們來想想SGM的優化過程和DoubleBP有什麼區別。
1. 先看能量函式,DoubleBP是每個畫素自身代價加上週圍畫素的一個二元勢函式值。SGM呢?是自身的代價加上週圍畫素帶來的懲罰。其實二者是一個意思。
2. 再看優化過程,DoubleBP靠的是置信度傳播演算法,最後WTA的目標是一個置信度向量,這個置信度向量其實和向量沒關係,每個分量都是去當前視差d的代價+周圍畫素的訊息,這一點和SGM簡直是太像了。
3. 再說說二者的區別,訊息的每個分量可以理解為q對p取每個視差的支援力度,而SGM索性直接求取最小的懲罰,這點比DoubleBP要直接許多,所以SGM很快,DoubleBP很慢。

我認為這塊內容非常值得單獨拉出來說說,以後有時間好好的寫寫。

最後,我們可以看看SGM的整體流程圖,這麼長的流程圖!!這個沒啥好進一步解釋的,唯一想說的就是我認為II-A那裡多畫了兩個箭頭,指向II-B的箭頭應該只有MI一個。


相關推薦

Stereo Matching文獻筆記經典演算法Semi-Global MatchingSGM之碉堡的動態規劃~

上一篇部落格中提到了SGM的第一部分,基於分層互資訊(HMI)的代價計算,本文繼續說說自己對SGM代價聚合部分的理解。 (轉載請註明:http://blog.csdn.net/wsj998689aa/article/details/50488249, 作者:迷霧forest

經典演算法Semi-Global MatchingSGM文獻筆記

SGM的代價聚合,其實仔細看看,這並不是嚴格意義上的代價聚合,因為SGM是為了優化一個能量函式,這和一般的全域性演算法一樣,如何利用優化演算法求解複雜的能量函式才是重中之重,其能量函式如下所示:其中,C(p, Dp)代表的就是基於互資訊的代價計算項,後面兩項指的是當前畫素p和其鄰域內所有畫素q之間的約束,如果

Stereo Matching文獻筆記經典演算法Semi-Global MatchingSGM之碉堡的動態規劃

上一篇部落格中提到了SGM的第一部分,基於分層互資訊(HMI)的代價計算,本文繼續說說自己對SGM代價聚合部分的理解。 (轉載:http://blog.csdn.net/wsj998689aa/article/details/50488249, 作者:迷霧forest)

我的第一個spring boot程序spring boot 學習筆記

獲取json 了解 訪問 static 依賴 過程 public 獲取數據 gap 第一個spring boot程序 寫在前面:鑒於spring註解以及springMVC的配置有大量細節和知識點,在學習理解之後,我們將直接進入spring boot的學習,在後續學習中用到註

雙目立體匹配經典演算法Semi-Global MatchingSGM概述:視差計算、視差優化

文章目錄 視差計算 視差優化 剔除錯誤匹配 提高視差精度 抑制噪聲 視差計算   在SGM演算法中,視差計算採用贏家通吃(WTA)演算法,每個畫素選擇最小聚

雙目立體匹配經典演算法Semi-Global MatchingSGM概述:代價聚合Cost Aggregation

  由於代價計算步驟只考慮了局部的相關性,對噪聲非常敏感,無法直接用來計算最優視差,所以SGM演算法通過代價聚合步驟,使聚合後的代價值能夠更準確的反應畫素之間的相關性,如圖1所示。聚合後的新的代價值儲存在與匹配代價空間C同樣大小的聚合代價空間S中,且元素位置一一對應。 圖1:代價聚合

雙目立體匹配經典演算法Semi-Global MatchingSGM概述:匹配代價計算之Census變換Census Transform,CT

  基於互資訊的匹配代價計算由於需要初始視差值,所以需要通過分層迭代的方式得到較為準確的匹配代價值,而且概率分佈計算稍顯複雜,這導致代價計算的效率並不高。學者Zabih和Woodfill 1 提出的基於Census變換法也被廣泛用於匹配代價計算。Census變換是使用畫素鄰域內的區域性灰

雙目立體匹配經典演算法Semi-Global MatchingSGM概述:匹配代價計算之互資訊Mutual Information,MI

  半全域性立體匹配演算法Semi-Global Matching,SGM由學者Hirschmüller在2005年所提出1,提出的背景是一方面高效率的區域性演算法由於所基於的區域性視窗視差相同的假設在很多情況下並不成立導致匹配效果較差;而另一方面全域性演算法雖然通過二維相鄰畫素視差之間

Semi-Global MatchingSGM演算法原文理解

  參考:@迷霧forest http://blog.csdn.net/wsj998689aa/article/details/49464017,原博主對SGM演算法的精髓理解的很透,我是在參考他文章的基礎上,才能看懂SGM演算法幾處關鍵的地方。本文的不同在於加入了一些我自

演算法導論 第七章:快速排序 筆記快速排序的描述、快速排序的效能、快速排序的隨機化版本、快速排序分析

快速排序的最壞情況時間複雜度為Θ(n^2)。雖然最壞情況時間複雜度很差,但是快速排序通常是實際排序應用中最好的選擇,因為它的平均效能很好。它的期望執行時間複雜度為Θ(n lg n),而且Θ(n lg n)中蘊含的常數因子非常小,而且它還是原址排序的。 快速排序是一種排序演算法,對包含n個數的

演算法導論 第六章:堆排序 筆記堆、維護堆的性質、建堆、堆排序演算法、優先順序佇列、堆排序的程式碼實現

堆排序(heapsort) 像合併排序而不像插入順序,堆排序的執行時間為O(nlgn) 。像插入排序而不像合併排序,它是一種原地( in place) 排序演算法:在任何時候,陣列中只有常數個元素儲存在輸入陣列以外。 堆: (二叉)堆資料結構是一種陣列物件,它可以被視為一棵完全二叉樹。樹

使用k-近鄰演算法改進約會網站的配對效果--學習筆記python3版本

本文取自《機器學習實戰》第二章,原始為python2實現,現將程式碼移植到python3,且原始程式碼非常整潔,所以這本書的程式碼很值得學習一下。 k-近鄰演算法概述 工作原理:存在一個樣本資料集合,也稱作訓練樣本集,並且樣本集中每個資料都存在標籤,即我們知道樣本集中

模式識別Pattern Recognition學習筆記三十六-- 動態聚類演算法

如果不估計樣本的概率分佈,就無法從概率分佈的角度來定義聚類,這時我們就需要有一種新的對聚類的定義,一般的,根據樣本間的某種距離或某種相似性度量來定義聚類,即把相似的或距離近的樣本聚為一類,而把不相似或距離遠的樣本聚在其他類,這種基於相似性度量的聚類方法在實際應用中非常常用,

模式識別Pattern Recognition學習筆記十七-- 基於樹搜尋演算法的快速近鄰法

       近鄰法中計算距離需要遍歷,帶來很大的計算量和儲存量,為了改善這兩方面的效能,有人提出採用分枝界定演算法(Branch-Bound  Algorithm)來改進近鄰法,主要分為兩個階段:1)利用人工劃分或K-means聚類演算法或其他動態聚類演算法將樣本集X劃分

模式識別Pattern Recognition學習筆記--BP演算法

1.引言        在無法像線性感知器一樣利用梯度下降學習引數這一問題阻礙了MLP長達25年後的一天,有人給出了一種有效的求解這些引數的方法,就是大名鼎鼎的反向傳播演算法(Back Propagation),簡稱為我們熟知的BP演算法(特別注意,BP演算法是一種演算法,

數據結構與算法刺猬書讀書筆記1----數組

split() ring 此外 結果 shift 即使 cnblogs 操作符 main 在JavaScript中,數組其實是一種特殊的對象,用來表示偏移量的索引是該對象的屬性,所以JavaScript的數組本質上是對象。同時這些數字索引在內部會被轉換成為字符串類型,因為J

Pandas 10分鐘入門官方文檔註釋版

logs ble light col util nump std 我們 部分 本文接續註釋版1,前文重點講述了如何創建一個panads對象,本文重點講述如何查看這些已經創建的對象。 【查看數據】 See the top & bottom ro

算法第四版學習筆記——初級排序算法

space 倒序 優勢 name 算法 turn 資料 eply n) 時間復雜度(Time Complexity): 總運算次數表達式中受n的變化影響最大的那一項(不含系數)(註:若算法中語句執行次數為一個常數,則時間復雜度為O(1)) 若T(n)/f(n)求極限可得

重修課程day44mysql八之索引查詢

war 添加 label 單個 專用 ima fec 詳細資料 not 一 索引的創建  索引減慢了 寫的操作,優化了讀取的時間  index:普通索引,加速了查找的時間。  fulltext:全文索引,可以選用占用空間非常大的文本信息的字段作為索引的字段。使用fullte

JavaEE互聯網輕量級框架整合開發書籍閱讀筆記1:Mybatis和Hibernate概念理解

bat 特定 定義 理解 緩存 面向 ont span 等待 一、關鍵字說明: oop:面向對象 aop:面向切面 ioc:控制反轉 orm:對象關系映射 pojo:數據庫表映射的java實體類 二、常識說明:1.hibernate和mybatis都屬於持久層、orm