立體匹配Stereo Matching_Semi-Global Matching之代價聚合Cost Aggregation_Cost Volume

備註:ground truth 關鍵詞解析

ground truth就是參考標準,一般用來做誤差量化

1>> 比方說要根據歷史數據預測某一時間的溫度,ground truth就是那個時間的真實溫度。error就是(predicted temperature - real temperature)。

2>> 全監督學習中,數據是有標籤(label)的的,以(x, t)的形式出現,其中x是輸入數據,t是label。正確的t標籤是ground truth, 錯誤的標籤則不是。


3>> 由模型函數的數據則是由(x, y)的形式出現的。其中x爲之前的輸入數據,y爲模型預測的值。

標註會和模型預測的結果作比較。在損耗函數中會將y 和 t 作比較,從而計算損耗(量化預測值與真實值的差別)。 比如在最小方差中:如果預測標籤不是ground truth,那麼loss的計算將會產生誤差,從而影響到模型質量。
 

一:Stereo Matching

1. 立體匹配概念

立體匹配的意思是基於同一場景得到的多張二維圖,還原場景的三維信息,一般採用的圖像是雙目圖像,如下所示,第一幅圖和第二幅圖分別是雙目相機得到的左圖和右圖,第三幅圖就是視差圖,一看就知道,這就是場景三維圖像。

目前,立體匹配領域,主要有兩個評測網站,一個是KITTI(http://www.cvlibs.net/datasets/kitti/eval_stereo_flow.php?benchmark=stereo),另一個是middlebury(http://vision.middlebury.edu/stereo/),兩個網站上的算法都交叉,但是又不完全一樣,相對來說,KITTI更好一點,對算法的性能評測更好,雖然時間測算的並不準確(CSCA竟然要140s,太離譜了)。

下面說說立體匹配最基本的步驟:
1)代價計算。計算左圖一個像素和右圖一個像素之間的代價。
2)代價聚合。一般基於點之間的匹配很容易受噪聲的影響,往往真實匹配的像素的代價並不是最低。所以有必要在點的周圍建立一個window,讓像素塊和像素塊之間進行比較,這樣肯定靠譜些。代價聚合往往是局部算法或者半全局算法纔會使用全局算法拋棄了window,採用基於全圖信息的方式建立能量函數。
3)深度賦值。這一步可以區分局部算法與全局算法,局部算法直接優化代價聚合模型。而全局算法,要建立一個能量函數,能量函數的數據項往往就是代價聚合公式,例如DoubleBP。輸出的是一個粗略的視差圖。
4)結果優化。對上一步得到的粗估計的視差圖進行精確計算,策略有很多,例如plane fitting,BP,動態規劃等。

根據我的理解,可以看作爲一種全局算法框架,通過融合現有的局部算法,大幅的提高了算法效果。

2. 論文貢獻
文獻《Cross-Scale Cost Aggregation for Stereo Matching》(CSCACVPR2014有三大貢獻,第一,設計了一種一般化的代價聚合模型,可將現有算法作爲其特例。第二,考慮到了多尺度交互(multi-scaleinteraction),形式化爲正則化項,應用於代價聚合(costaggregation)。第三,提出一種框架,可以融合現有多種立體匹配算法。(作者提供了詳細的源代碼,配置運行了一下,效果還真不錯,速度也還可以

本文一直強調利用了不同尺度圖像“間”的信息,不同於一般的立體匹配算法,只採用了同樣尺度下,圖像的“內”部結構信息,CSCA利用了多尺度信息,多尺度從何而來?其實說到底,就是簡單的對圖像進行高斯下采樣,得到的多幅成對圖像(一般是5副),就代表了多尺度信息。爲什麼作者會這麼提,作者也是從生物學的角度來啓發,他說人類就是這麼一個由粗到精的觀察習慣(coarse-to-line)。生物學好奇妙!

該文獻生成的稠密的視差圖,基本方法也是逐像素的(pixelwise),分別對每個像素計算視差值,並沒有採用慣用的圖像分割預處理手段,如此看來運算量還是比較可觀的。

3. CSCA中算法流程

算法流程圖如下所示:

二:代價聚合 Cost Aggregation

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

爲了獲得較好的匹配效果,SGM算法依舊採用全局立體匹配算法的思路,即全局能量最優化策略,簡單來說就是尋找每個像素的最優視差使得整張影像的全局能量函數最小。全局能量函數的定義如公式1所示:

其中,Edata爲數據項,是反應視差圖對應的總體匹配代價的測度;Esmooth是平滑項,爲了讓視差圖滿足某些條件假設的約束,如場景表面的連續性假設,平滑項會對相鄰像素視差變化超過一定像素的情況進行懲罰(對應的能量函數具有較大的值),而圖像邊緣處像素例外,因爲邊緣像素被認爲確實是視差非連續區域的概率較大。圖2爲視差連續區域與非連續區域示意圖。

由於能量函數是二維函數,所以能量函數最小化是一個二維最優問題,這是一個NP完全問題,有很多近似的較爲高效的能量最優策略如圖割、置信度傳播、合作優化等算法被用來解決這個問題,但是效率上依舊需要進一步改進。爲了更高效的解決這個二維最優化問題,SGM算法採用基於類似於掃描線的方法,使用一維路徑聚合的方式來近似二維最優,相比其他解決方法效率更高,效果相當。

  首先,SGM提出的更具體化的能量函數如公式2所示:

其中,C爲匹配代價,公式的第一項是數據項,表示當視差圖爲D時,所有像素的匹配代價的累加,第二項和第三項是平滑項,表示對像素p的Np鄰域內的所有像素q進行懲罰,其中第二項懲罰力度較小(P1較小),對相鄰像素視差變化很小的情況(1個像素)進行懲罰;第二項懲罰力度較大(P2> P1),對相鄰像素視差變化很大(大於1個像素)的情況進行懲罰。較小的懲罰項可以讓算法能夠適應視差變化小的情形,如傾斜的平面或者連續的曲面較大的懲罰項可以讓算法正確處理視差非連續情況,由於影像灰度邊緣處視差非連續的可能性較大,爲了保護真實場景中的視差非連續情況,P2往往是根據相鄰像素的灰度差來動態調整,如公式3所示

P2’爲P2的初始值。

  實際上,式2中的能量函數最優化問題依舊是一個NP完全問題,爲高效的解決它,SGM提出一種路徑代價聚合的思路,即將像素所有視差下的匹配代價進行像素周圍所有路徑上的一維聚合得到路徑下的路徑代價值,然後將所有路徑代價值相加得到該像素聚合後的匹配代價值。像素p沿着某條路徑r的路徑代價計算方法如式4所示:

其中,第一項爲匹配代價值C,屬於數據項;第二項是平滑項,表示的是和式2相同的含義,累加到路徑代價上的值,取不做懲罰、做P1懲罰和做P2懲罰,三種情況中代價最小的值;第三項是爲了保證新的路徑代價值Lr不超過一定數值上限,即

從圖3中可以看到,根據路徑數不同,聚合的方向也有所不同,一般來說,有4路徑(紅色箭頭方向)、8路徑(紅色+黑色箭頭方向)和16路徑(白色箭頭方向)三種聚合方式,路徑數越多效果越好,但是耗時也會越長,往往需要平衡利弊,根據應用的實際要求來選擇合適的路徑數。

  從公式5及6以及路徑數不超過16可以很容易推導出S≤16(Cmax+P2)這個不等式很重要,它表明選擇合適的P2值可以將聚合代價值S控制在一定數值範圍內,減少聚合代價數組對內存的佔用。如採用基於5×5窗口的Census變換的方法計算得到的匹配代價值C最高不超過25(因爲Census變換後的比特串最大有效長度爲25),則匹配代價只需用一個字節來存儲,而當P2 ≤ 65535/16-25 時,S可以只用兩個字節來存儲,因爲存儲代價的C和S空間大小是W×H×D,當影像尺寸較大時,對內存的佔用是巨大的,所以減少元素存儲所需要的字節數是必要的。

三 Cost Volume

論文題目《Pyramid Stereo Matching Network》,被2018CVPR收錄,後將用PSM-Net表示, 論文實現代碼是PyTorch的。

主要的創新點就是引入了空間金字塔池化模塊(spatial pyramid pooling,SPP)。作者談到,當前的方法沒有利用好上下文(context)信息,於是用SPP聚合多尺度的信息。其實多尺度在深度估計/補全的很多方法都用到了,不過SPP的概念應該是在這邊的首次引入吧。摘要中談到的另一個點是堆疊漏斗網絡(stacked hourglass networks是一個用3D卷積做的encoder-decoder結構,然後用了好幾個堆疊stacked起來。

立體匹配這邊得到的都是視差圖,單位是像素,也即左圖某像素點(x,y)在右圖中匹配的像素點爲(x-d,y),d即視差。要轉化爲深度,還需要進行標定,要給出相機的基線B和焦距f。深度z=fB/d。

 

傳統的立體匹配主要是兩步:匹配損失(matching cost)和後處理(post-processing),而神經網絡出現後,很多工作都是基於CNN的。但是隻施加強度一致的信息是不夠的,很多病態區域如遮擋區域、重複出現的表象、低紋理區域、反射表面等。需要全局上下文信息進行整合。SPP和膨脹卷積用來擴大感受野,使得PSM-Net可以將像素級的特徵擴展至多尺度區域級的特徵。全局信息和局部信息結合形成cost volume,再用3D卷積的方式融合多通道信息,正則化cost volume,最終預測視差圖。

 

根據《A taxonomy and evaluation of dense two-frame stereo correspondence algorithms》的總結,傳統的立體匹配方法可以分四步:匹配代價計算;代價聚合;優化;視差調優。看的好多立體匹配的文章都再Related Work裏引這個了,所以過來敲下黑板。還有一個要注意的是發表在17年ICCV上的工作:GC-Net,應該是首次提出cost volume並用3D卷積將其正則化。

網絡結構的示意圖:

 

立體匹配這邊左右視圖提取特徵的網絡都是共享權重的。SPP模塊可以從左下方看到,就是四個不同尺度的池化,再上採樣串聯起來,其實就是整合多尺度的信息。送到cost volume之前左右圖的特徵是(1,32,96,312)維度的,32是通道數,96*312是輸入圖像分辨率的1/4,1是batch size,後面的cost volume的1也是這個。cost volume的維度是(1,64,48,96,312),64的前32個通道是左視圖的,後32個通道是右視圖的;48代表視差等級的維度,即視差爲0-47px(設置最大視差爲191px,後面會上採樣)。貼一下形成cost volume這部分的代碼,比如現在i=10,即cost volume的第三個維度視差爲10px時,第二個維度的前32個通道取左圖x軸上10以後的像素,後32個通道取右圖x軸上去掉最後10像素的所有,其他地方都是0。

得到cost volume之後就是一大堆3D卷積(Stacked hourglass的結構比Basic效果好,反正誰複雜誰強唄...),可以看到右下方有bilinear和regression模塊,就是將低分辨率、低視差等級的圖插值爲(D, H, W)維度的,然後用softmax作用於所有視差等級求出各個視差的概率,加權得到最終各個像素點的視差,即H*W的視差圖。

 

訓練的損失函數是Smooth L1損失,說是比起L2損失對異常點不敏感(low sensitivity to outliers)。訓練集是Scene Flow是一個合成的數據集,然後在KITTI 2015上調優。KITTI 2015 立體匹配數據集規模比較小,訓練集200對雙目圖像、測試集200對,而且視差的真值是稀疏的(約20%的像素有真實視差值數據)。所以現在合成的規模較大的Scene Flow上訓練,再在KITTI 2015上調優。最終的結果:誤差高於3px的點的數量爲1.98%,還是很不錯的。結果下圖:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章