1 前言
對於自動駕駛應用來說,最終還是需要對3D場景進行感知。道理很簡單,車輛不能靠著一張影象上得到感知結果來行駛,就算是人類司機也不能對著一張影象來開車。因為物體的距離和場景的和深度資訊在2D感知結果上是體現不出來的,而這些資訊才是自動駕駛系統對周圍環境作出正確判斷的關鍵。
一般來說,自動駕駛車輛的視覺感測器(比如攝像頭)安裝在車身上方或者車內後視鏡上。無論哪個位置,攝像頭所得到的都是真實世界在透視檢視(Perspective View)下的投影(世界座標系到影象座標系)。這種檢視與人類的視覺系統很類似,因此很容易被人類駕駛員理解。但是透視檢視有一個致命的問題,就是物體的尺度隨著距離而變化。因此,當感知系統從影象上檢測到了前方有一個障礙物時,它並不知道這個障礙物距離車輛的距離,也不知道障礙物的實際三維形狀和大小。
影象座標系(透視檢視)vs. 世界座標系(鳥瞰檢視)[IPM-BEV]
想要得到3D空間的資訊,一個最直接的方法就是採用鐳射雷達(LiDAR)。一方面,LiDAR輸出的3D點雲可以直接用來獲取障礙物的距離和大小(3D物體檢測),以及場景的深度(3D語義分割)。另一方面,3D點雲也可以與2D影象進行融合,以充分利用兩者所提供的不同資訊:點雲的優勢在於距離和深度感知精確,而影象的優勢在於語義資訊更加豐富。
但是,LiDAR也有其缺點,比如成本較高,車規級產品量產困難,受天氣影響較大等等。因此,單純基於攝像頭的3D感知仍然是一個非常有意義和價值的研究方向。本文以下的部分會詳細介紹基於單攝像頭和雙攝像頭的3D感知演算法。
2 單目3D感知
基於單攝像頭影象來感知3D環境是一個病態問題,但是可以利用一些幾何約束和先驗知識來輔助完成這個任務,也可以採用深度神經網路端對端的學習如何從影象特徵來預測3D資訊。
2.1 物體檢測
單攝像頭3D物體檢測(圖片來自M3D-RPN)
影象反變換
前面提到,影象是從真實世界的3D座標到2D平面座標的投影,因此從影象來進行3D物體檢測的一個很直接的思路就是將2D影象反變換到3D世界座標,然後在世界座標系下進行物體檢測。理論上說這是一個病態問題,但是可以透過一些額外資訊(比如深度估計)或者幾何假設(比如畫素位於地面)來輔助解決。
BEV-IPM[1]中提出將影象從透視檢視轉換到鳥瞰檢視(BEV)。這裡有兩個假設:一是路面與世界座標系平行並且高度為零,二是車輛自身的座標系與世界座標系平行。前者在路面非平坦的情況下並不滿足,後者則可以透過車輛姿態引數(Pitch和Roll)來校正,其實就是車輛座標系和世界座標系的Calibration。假設影象中所有畫素在真實世界的高度都為零,那麼就可以採用Homography變換將影象轉換到BEV檢視。在BEV檢視下采用基於YOLO網路的方法檢測目標的Bottom Box,也就是與路面接觸部分的矩形。Bottom Box的高度為零,因此可以準確的投影到BEV檢視上作為GroudTruth來訓練神經網路,同時神經網路預測的Box也可以準確的估計其距離。這裡的假設是目標需要與路面接觸,這對於車輛和行人目標來說一般是滿足的。
BEV-IPM
另外一種反變換的方法採用Orthographic Feature Transform (OFT)[2]。其思路是採用CNN提取多尺度的影象特徵,然後將這些影象特徵變換到BEV檢視,最後在BEV特徵上進行3D物體檢測。首先需要構建BEV視角下的3D網格(文中實驗的網格範圍為80米x80米x4米,網格大小為0.5m)。每個網格透過透視變換對應影象上的一塊區域(簡單起見就定義為矩形區域),將這個區域內的影象特徵的均值作為該網格的特徵,這樣就得到了3D網格特。為了減小計算量,3D網格特徵在高度這一維上進行壓縮(加權平均),得到2D網格特徵。最終的物體檢測在2D網格特徵上進行。3D網格到2D影象畫素的投影並不是一一對應的,多個網格會對應臨近的影象區域,導致網格特徵出現歧義性。所以這裡也需要假設待檢測的物體都在路面上,高度的範圍很窄。所以文中實驗採用了的3D網格高度只有4米,這足以覆蓋地面上的車輛和行人。但是如果要檢測交通標誌的話,這類假設物體都貼近地面的方法就不適用了。
Orthographic Feature Transform
以上這個兩個方法都是基於物體位於地面的假設。除此之外,另外一個思路是採用深度估計的結果來生成偽點雲資料,其中一個典型的工作就是Pseudo-LiDAR[3]。深度估計的結果一般被看作額外的影象通道(類似RGB-D資料),基於影象的物體檢測網路被直接用來生成3D物體邊框。作者在文章中指出,基於深度估計的3D物體檢測之所以準確度比基於LiDAR的方法差很多,主要原因不在於深度估計的精度不夠,而是在於資料表示的方法有問題。首先,在影象資料上,遠處的物體面積非常小,這使得遠處物體的檢測非常不準確。其次,深度上相鄰畫素的深度差可能是非常大的(比如在物體的邊緣處),此時採用卷積操作來提取特徵就會有問題。考慮到這兩點,作者提出依據深度圖將輸入影象轉換為類似LiDAR生成的點雲資料,然後採用點雲和影象融合的演算法(比如AVOD和F-PointNet)來檢測3D物體。Pseudo-LiDAR的方法並不依賴於特定的深度估計算法,任何來自單目或雙目的深度估計都可以直接使用。透過這種特殊的資料表示方法,Pseudo-LiDAR在30米範圍內可以將物體檢測的準確率從22%提高到74%。
Pseudo-LiDAR
與真實的LiDAR點雲相比,Pseudo-LiDAR方法在3D物體檢測的準確率上還是有著一定的差距,這主要是由於深度估計的精度不夠導致的(雙目比單目效果好一些),尤其是物體周邊的深度估計誤差會對檢測帶來很大的影響。因此,Pseudo-LiDAR之後也進行了很多擴充套件。Pseudo-LiDAR++[4]採用低線束的LiDAR來增強虛擬的點雲。Pseudo-Lidar End2End[5]採用例項分割來代替F-PointNet中的物體框。RefinedMPL[6]只在前景點上生成虛擬點雲,將點雲的數量降低到原來的10%,可以有效地降低誤檢的數量和演算法的計算量。
關鍵點和3D模型
在自動駕駛應用中,很多需要檢測的目標(比如車輛和行人)其大小和形狀相對比較固定,而且是已知的。這些先驗知識可以被用來估計目標的3D資訊。
DeepMANTA[7]是這個方向的開創性工作之一。首先,採用傳統的影象物體檢測演算法比如Faster RNN來得到2D的物體框,同時也檢測車輛上的關鍵點。然後,將這些2D物體框和關鍵點與資料庫中的多種3D車輛CAD模型分別進行匹配,選擇相似度最高的模型作為3D物體檢測的輸出。
Deep MANTA
3D-RCNN[8]提出採用Inverse-Graphics方法,基於影象來恢復場景中各個目標的3D形狀和姿態。其基本思路是從目標的3D模型出發,透過引數搜尋找到與影象中的目標最匹配的模型。這些3D模型通常都有很多控制引數,搜尋空間很大,因此傳統的方法在高維引數空間搜尋最優效果並不好。3D-RCNN採用PCA對引數空間進行降維(10-D),並且利用深度神經網路(R-CNN)來預測每個目標的低維模型引數。預測的模型引數可以用來生成每個目標的二維影象或者深度圖,與GroudTruth資料對比得到的Loss可以用來指導神經網路的學習。這個Loss稱之為Render-and-Compare Loss,是基於OpenGL來實現的。3D-RCNN方法需要的輸入資料比較多,Loss的設計也相對複雜,工程實現上難度較大。
3D-RCNN
MonoGRNet[9]提出將單目3D物體檢測分成四個步驟,分別用來預測2D物體框,物體3D中心的深度,物體3D中心的2D投影位置和8個角點的3D位置。首先,影象中預測的2D物體框透過ROIAlign操作,得到物體的視覺特徵。然後,而這些特徵被用來預測物體3D中心的深度和3D中心的2D投影位置。有了這兩個資訊後,就可以得到物體3D中心點的位置。最後,根據3D中心的位置再來預測8個角點的相對位置。MonoGRNet可以被認為是隻採用物體中心的作為關鍵點,2D和3D的匹配也就是點距離的計算。MonoGRNetV2[10]將中心點擴充套件到多個關鍵點,並採用3D CAD物體模型來進行深度估計,這與之前介紹的DeepMANTA和3D-RCNN就很類似了。
MonoGRNet
Monoloco[11]主要解決行人的3D檢測問題。行人是非剛性物體,姿態和變形也更加多樣,因此比車輛檢測更加具有挑戰性。Monoloco也是基於關鍵點檢測,關鍵點先驗的相對3D位置可以被用來進行深度估記。比如,以行人肩部到臀部50釐米的長度為基準來估計行人的距離。以此長度作為基準的原因是,人體的這個部分可以產生的變形最小,用來做深度估記準確度也最高。當然,其他的關鍵點也可以作為輔助共同來完成深度估記的任務。Monoloco採用多層全連線網路,從關鍵點的位置來預測一個行人的距離,同時也給出預測的不確定性。
Monoloco
總結一下,以上方法都是從2D影象中提取關鍵點,並且與3D模型進行匹配,從而得到目標的3D資訊。這類方法假設目標有相對固定的形狀模型,對於車輛來說一般是滿足的,對於行人來說就相對困難一些。此外,這類方法需要在2D影象上標註多個關鍵點,這也是非常費時的。
2D/3D幾何約束
Deep3DBox[12]是這個方向早期的並且很有代表性的工作。3D物體框需要9維變數來表示,分別是中心,大小和朝向(3D朝向可以簡化為Yaw,因此變為7維變數)。影象2D物體檢測可以提供2D物體框,包含4個已知變數(2D中心和2D大小),這不足以求解具有7維或者9維自由度的變數。在這三組變數中,大小和朝向與視覺特徵的關係相對緊密。比如物體的3D大小與其類別(行人,腳踏車,小轎車,公交車,卡車等)相關性非常大,而物體類別是可以透過視覺特徵來預測的。對於中心點3D位置來說,由於透視投影產生的歧義性,單純透過視覺特徵是很難預測的。因此,Deep3DBox提出首先用2D物體框內的影象特徵來估計物體大小和朝向。然後,再透過一個2D/3D的幾何約束來求解中心點3D位置。這個約束就是3D物體框在影象上的投影是被2D物體框緊密的包圍的,也就是在2D物體框的每條邊上都至少能找到一個3D物體框的角點。透過之前已經預測的大小和朝向,再配合上相機的Calibration引數,就可以求解中心點的3D位置。
2D和3D物體框之間的幾何約束(圖片來源於文獻[9])
這種利用2D/3D約束的方法需要非常精確的2D物體框檢測。在Deep3DBox的框架下,2D物體框上很小的誤差都可能會導致3D物體框預測的失敗。Shift R-CNN[13]的前兩個階段與Deep3DBox非常相似,都是透過2D物體框和視覺特徵來預測3D大小和朝向,然後通過幾何約束來求解3D位置。但是,Shift R-CNN增加了第三個階段,將前兩個階段得到的2D物體框,3D物體框以及相機引數合併起來作為輸入,採用全連線網路預測更為精確的3D位置。
Shift R-CNN
在利用2D/3D幾何約束時,上述方法都是透過求解一組超約束方程來得到物體的3D位置,而這個過程是作為一個後處理步驟,並不在神經網路之內。Shift R-CNN的第一和第三階段也是分開訓練的。MVRA[14]將這個超約束方程的求解過程建成一個網路,並設計了影象座標下的IoU Loss和BEV座標下的L2 Loss分別來衡量物體框和距離估計的誤差,以輔助完成端對端的訓練。這樣一來,物體3D位置預測的質量也會對之前的3D大小和朝向預測產生反饋作用。
直接生成3D物體框
之前介紹的三類方法都是從2D影象出發,有的將影象變換到BEV檢視,有的檢測2D關鍵點並與3D模型匹配,還有的採用2D和3D物體框的幾何約束。除此之外,還有一類方法從稠密的3D物體候選出發,透過2D影象上的特徵對所有的候選框進行評分,評分高的候選框既是最終的輸出。這種策略有些類似物體檢測中傳統的Sliding Window方法。
Mono3D[15]是這類方法中的代表。首先,基於目標先驗位置(z座標位於地面)和大小來生成稠密的3D候選框。在KITTI資料集上,每幀大約生成40K(車輛)或70K(行人和腳踏車)個候選框。這些3D候選框投影到影象座標後,透過2D影象上特徵進行評分。這些特徵來自語義分割,例項分割,上下文,形狀以及位置先驗資訊。所有這些特徵融合起來對候選框進行評分,然後選出分數較高的作為最終的候選。這些候選再透過CNN再進行下一輪的評分,以得到最終的3D物體框。
Mono3D
M3D-RPN[16]是一種基於Anchor的方法。該方法定義了2D和3D的Anchor,分別表示2D和3D物體框。2D Anchor透過影象上稠密取樣得到,而3D Anchor的引數是基於透過訓練集資料得到的先驗知識確定的。具體來說,每個2D Anchor與影象中標註的2D物體框按照IoU進行匹配,對應的3D物體框的均值用來定義3D Anchor的引數。值得一提的是,M3D-RPN中同時採用了標準卷積操作(具有空間不變性)和Depth-Aware卷積。後者將影象的行(Y座標)分成多個組,每個組對應不同的場景深度,採用不同的卷積核來處理。
M3D-RPN中的Anchor設計和Depth-Aware卷積
雖然利用了一些先驗知識,Mono3D和M3D-RPN生成物體候選或者Anchor時還是基於稠密取樣的方式,因此需要的計算量非常大,實用性受到很大影響。後續一些方法提出採用二維影象上檢測結果來進一步減少搜尋的空間。
TLNet[17]在二維平面密集的放置Anchor。Anchor間隔為0.25米,朝向為0度和90度,大小為目標的平均值。影象上的二維檢測結果在三維空間內形成多個視錐,透過這這些視錐可以過濾掉大量背景上的Anchor,從而提高演算法的效率。過濾後的Anchor投影到影象上,進行ROI Pooling後得到的特徵用來進一步細化3D物體框的引數。
TLTNet
SS3D[18]則採用更為高效的單階段檢測,用類似於CenterNet結構的網路直接從影象輸出多種2D和3D資訊,比如物體類別,2D物體框,3D物體框。需要注意的是,這裡的3D物體框並不是一般的9D或7D表示(這種表示很難直接從影象預測),而是採用更容易從影象預測也包含更多冗餘的2D表示,包括距離(1-d),朝向(2-d,sin和cos),大小(3-d),8個角點的影象座標(16-d)。再加上2D物體框的4-d表示,一共是26D的特徵。所有這些特徵都被用來進行3D物體框的預測,預測的過程其實就是找到一個與26D特徵最為匹配3D物體框。比較特殊的一點是,這個求解的過程是在神經網路內部進行,所以必須是可導的,這也是該文章一個主要亮點。受益於簡單的結構和實現,SS3D的執行速度可以達到20FPS。
SS3D
FCOS3D[19]也是一個單階段的檢測方法,但是比SS3D更加簡潔。3D物體框的中心投影到2D影象,得到2.5D中心(X,Y,Depth),以此作為迴歸的目標之一。此外,迴歸的目標還有3D大小和朝向。這裡的朝向採用角度(0-pi)+heading聯合的方式來表示。
FCOS3D
SMOKE[20]也提出了類似的思路,透過類似CenterNet的結構從影象直接預測2D和3D資訊。2D資訊包括物體關鍵點(中心點和角點)在影象上的投影位置,3D資訊包括中心點深度,尺寸和朝向。透過中心點的影象位置和深度,可以恢復物體的3D位置。再透過3D尺寸和朝向可以恢復各個角點的3D位置。
以上介紹的這幾種單階段網路的思路就是直接從影象迴歸3D資訊,不需要複雜的前處理(比如影象反變換)和後處理(比如3D模型匹配),也不需要精確的幾何約束(比如2D物體框的每條邊上都至少能找到一個3D物體框的角點)。這些方法只用到了少量的先驗知識,比如各類物體實際大小的均值,以及由此得到的2D物體尺寸與深度的對應關係。這些先驗知識定義了物體3D引數的初始值,而神經網路只需要迴歸與實際值的偏差即可,這就大大降低的搜尋空間,也因此降低了網路學習的難度。
2.2 深度估記
上一小節裡介紹了單目3D物體檢測的代表性方法,其思路從早期的影象變換,3D模型匹配和2D/3D幾何約束,到近期的直接透過影象預測3D資訊。這種思路上的變化很大程度上來源於卷積神經網在深度估計上的進展。之前介紹的單階段3D物體檢測網路中大多都包含了深度估計的分支。這裡的深度估計雖然只是在稀疏的目標級別,而不是稠密的畫素級別,但是對於物體檢測來說已經足夠了。
除了物體檢測,自動駕駛感知還有另外一個重要任務,那就是語義分割。語義分割從2D擴充套件到3D,一種最直接的方式就是採用稠密的深度圖,這樣每個畫素點的語義和深度資訊就都有了。
綜合以上兩點,單目深度估計在3D感知任務中起到了非常重要的作用。從上一節3D物體檢測方法的介紹可以類推,全卷積的神經網路也可以用來進行稠密的深度估計。下面我們來介紹一下這個方向的發展現狀。
單目深度估計的輸入是一張影象,輸出也是一張影象(一般與輸入相同大小),其上的每個畫素值對應輸入影象的場景深度。這個任務有些類似影象語義分割,只不過語義分割輸出的是每個畫素的語義分類。當然,輸入也可以是影片序列,利用相機或者物體運動帶來的額外資訊來提高深度估計的準確度(對應影片語義分割)。
前面提到過,從2D影象預測3D資訊是一個病態問題,因此傳統的方法會利用幾何資訊,運動資訊等線索,透過手工設計的特徵來預測畫素深度。與語義分割類似,超畫素(SuperPixel)和條件隨機場(CRF)這兩個方法也經常被用來提高估計的精度。近年來,深度神經網路在各種影象感知任務上都取得了突破性的進展,深度估計當然也不例外。大量的工作都表明,深度神經網路可以透過訓練資料學習到比手工設計更加優越的特徵。這一小節主要介紹這種基於監督學習的方法。其它一些非監督學習的思路,比如利用雙目的視差資訊,單目雙畫素(Dual Pixel)的差異資訊,影片的運動資訊等等,留待後面再來介紹。
這個方向早期的一個代表性工作是由Eigen等人提出的基於全域性和區域性線索融合的方法[21]。單目深度估計歧義性主要來自於全域性的尺度。比如,文中提到一個真實的房間和一個玩具房間可能從影象上看來差別很小,但是實際的景深卻差別很大。雖然這是一個極端的例子,但是真實的資料集中依然存在房間和傢俱尺寸的變化。因此,該方法提出將影象進行多層卷積和下采樣,得到整個場景的描述特徵,並以此來預測全域性的深度。然後,透過另外一個區域性分支(相對較高的解析度)來預測影象區域性的深度。這裡全域性深度會作為區域性分支的一個輸入來輔助區域性深度的預測。
全域性和區域性資訊融合[21]
文獻[22]進一步提出採用卷積神經網路輸出的多尺度特徵圖來預測不同解析度的的深度圖([21]中只有兩種解析度)。這些不同解析度的特徵圖透過連續MRF進行融合後得到與輸入影象對應的深度圖。
多尺度資訊融合[22]
以上兩篇文章都是採用卷積神經網路來回歸深度圖,另外一個思路是把迴歸問題轉換為分類問題,也就是將連續的深度值劃分為離散的區間,每個區間作為一個類別。這個方向的代表性工作是DORN[23]。DORN框架中的神經網路也是一個編碼解碼的結構,不過細節上有些差別,比如採用全連線層解碼,膨脹卷積進行特徵提取等。
DORN深度分類
前面提到,深度估計與語義分割任務有著相似之處,因此感受野的大小對深度估計來說也是非常重要的。除了以上提到的金字塔結和膨脹卷積,最近非常流行的Transformer結構具有全域性的感受野,因此也非常適合此類任務。文獻[24]中就提出採用Transformer和多尺度結構來同時保證預測的區域性精確性和全域性一致性。
Transformer for Dense Prediction
3 雙目3D感知
雖然可以利用先驗知識和影象中的上下文資訊,基於單目的3D感知的準確度並不能完全令人滿意。尤其是當採用深度學習的策略時,演算法的準確度非常依賴於資料集的大小和質量。對於資料集中沒有出現過的場景,演算法在深度估記和物體檢測上都會有較大的偏差。
雙目視覺可以解決透視變換帶來的歧義性,因此從理論上來說可以提高3D感知的準確度。但是雙目系在硬體和軟體上要求都比較高。硬體上來說需要兩個精確配準的攝像頭,而且需要保證在車輛執行過程中始終保持配準的正確性。軟體上來說演算法需要同時處理來自兩個攝像頭的資料,計算複雜度較高,保證演算法的實時性就更加困難。
總的來說,與單目視覺感知相比,雙目視覺感知的工作相對較少,下面會挑選幾篇典型的文章進行介紹。此外,還有一些基於多目的工作,但是偏向於系統應用的層面,比如說特斯拉在AI Day上展示的360°感知系統。這部分內容之後會在介紹不同感知系統方案時再詳細介紹。
3.1 物體檢測
3DOP[25]首先利用來自雙攝像頭的影象生成深度圖,將深度圖轉化為點雲後再將其量化為網格資料結構,並以此為輸入來生成3D物體候選。生成候選時用到了一些直覺和先驗的的知識,比如候選框中點雲的密度足夠大,高度與實際物體一致並且與框外的點雲高度相差足夠大,候選框與Free Space的重疊足夠小。透過這些條件最終在3D空間中取樣出大約2K個3D物體候選。這些候選對映到2D影象上,透過ROI Pooling進行特徵提取,用來預測物體的類別和細化物體框。這裡的影象輸入可以是來自一個攝像頭的RGB影象,或者深度圖。
總的來說,這是一個兩階段的檢測方法。第一階段採用深度資訊(點雲)生成物體候選,第二階段採用影象資訊(或者深度)再進行細化。理論上說,第一階段的點雲生成也可以用LiDAR代替,作者也因此進行了實驗對比。LiDAR的優勢在於測距精確,因此對於小物體,部分遮擋的物體和遠處的物體來說效果較好。雙目視據的優勢在於點雲密度高,因此在近距離遮擋較少,物體也相對較大的情況下效果更好。當然在不考慮成本和計算複雜度的前提下,將二者融合會得到最好的效果。
3DOP
3DOP與上一節中介紹的Pseudo-LiDAR[3]有著類似的思路,都是將稠密的深度圖(來自單目,雙目甚至低線數LiDAR)轉換為點雲,然後再應用點雲物體檢測領域的演算法。
從影象估計深度圖,再由深度圖生成點雲,最後再應用點雲物體檢測演算法,這個流程的各個步驟是分開進行的,無法進行端對端的訓練。DSGN[26]提出了一個單階段的演算法,從左右影象出發,透過Plane-Sweep Volume這種中間表示來生成BEV檢視下的3D表示,並且同時進行深度估計和物體檢測。這個流程的所有步驟都是可以求導的,因此可以進行端對端的訓練。
DSGN
深度圖是一種稠密的表示,其實對於物體學習來說並不需要在場景的所有位置上獲得深度資訊,而只需要在感興趣的物體位置進行估計就可以了。之前在介紹單目演算法也提到了類似的想法。Stereo R-CNN[27]中並沒有估計深度圖,而是在RPN的框架下將來自兩個攝像頭的特徵圖疊放在一起來生成物體候選。這裡將左右攝像頭的資訊關聯在一起的關鍵在於標註資料的變化。如下圖所示,除了左右兩個標註框,還增加了左右兩個標註框的Union。與左右任意一個框IoU超過0.7的Anchor作為Positive樣本,與Union框IoU小於0.3的Anchor作為Negative樣本。Positive的Anchor會同時迴歸左右標註框的位置和大小。除了物體框,該方法還採用了角點作為輔助。有了所有這些資訊後就可以恢復3D物體框。
Stereo R-CNN
對整個場景進行稠密的深度估計,甚至會對物體檢測帶來不好的影響。比如物體邊緣由於與背景重疊導致深度估計偏差較大,整個場景深度範圍很大也會影響演算法的速度。因此,與Stereo RCNN類似,文獻[28]中也提出只在感興趣的物體處估計深度,並且只生成物體上的點雲。這些以物體為中心的點雲最後被用來預測物體的3D資訊。
Object-Centric Stereo Matching
3.2 深度估計
與單目感知演算法類似,深度估計在雙目感知中也是關鍵的步驟。從上一小節對雙目物體檢測的介紹來看,很多演算法都採用了深度估計,包括場景級的深度估計和物體級的深度估計。下面就簡單回顧一下雙目深度估計的基本原理和幾個代表性的工作。
雙目深度估計的原理其實也很簡單,就是根據左右兩張影象上同一個3D點之間的距離d(假設兩個相機保持同一高度,因此只考慮水平方向的距離),相機的焦距f,以及兩個相機之間的距離B(基線長度),來估計3D點的深度。
在雙目系統中,f和B是固定的,因此只需要估計距離d,也就是視差。對於每個畫素點來說,需要做的就是找到另一張影象中匹配的點。距離d的範圍是有限的,因此匹配的搜尋範圍也是有限的。對於每一個可能的d,都可以計算每個畫素點處的匹配誤差,因此就得到了一個三維的誤差資料,稱之為Cost Volume。在計算匹配誤差時,一般都會考慮畫素點附近的區域性區域,一個最簡單的方法就是對區域性區域內所有對應畫素值的差進行求和:
MC-CNN[29]把匹配過程形式化為計算兩個影象塊的相似度,並且透過神經網路來學習影象塊的特徵。透過標註資料,可以構建一個訓練集。在每個畫素點處,都生成一個正樣本和負樣本,每個樣本都是一對影象塊。其中正樣本是來自同一個3D點的兩個影象塊(深度相同),負樣本則是來自不同3D點的影象塊(深度不同)。負樣本的選擇有很多,為了保持正負樣本的平衡,只隨機取樣一個。有了正負樣本,就可以訓練神經網路來預測相似度。這裡的核心思想其實就是透過監督訊號來指導神經網路學習適用於匹配任務的影象特徵。
MC-CNN
MC-Net主要有兩點不足:1)Cost Volumn的計算依賴於區域性影象塊,這在一些紋理較少或者模式重複出現的區域會帶來較大的誤差;2)後處理的步驟依賴於手工設計,需要花費大量時間,也很難保證最優。GC-Net[30]針對這兩點進行了改進。首先,在左右影象上進行多層卷積和下采樣操作,以更好的提取語義特徵。對於每一個視差級別(以畫素為單位),將左右特徵圖進行對齊(畫素偏移)後再進行拼接,就得到了該視差級別的特徵圖。所有視差級別的特徵圖合併在一起,就得到了4D的Cost Volumn(高度,寬度,視差,特徵)。Cost Volumn只包含了來自單個影象的資訊,影象之間並沒有互動。因此,下一個步驟是採用3D卷積處理Cost Volumn,這樣可以同時提取左右影象之間的相關資訊以及不同視差級別之間的資訊。這一步的輸出是3D的Cost Volumn(高度,寬度,視差)。最後,我們需要在視差這個維度上求Argmin,以得到最優的視差值,但是標準的Argmin是無法求導的。GC-Net中採用Soft Argmin,解決的求導的問題,從而使整個網路可以進行端對端的訓練。
GC-Net
PSMNet[31]與GC-Net的結構非常相似,但是在兩個方面進行了改進:1)採用金字塔結構和空洞卷積來提取多解析度的資訊並且擴大感受野。得益於全域性和區域性特徵的融合,Cost Volumn的估計也更加準確。2)採用多個疊加的Hour-Glass結構來增強3D卷積。全域性資訊的利用被更進一步強化了。總的來說,PSMNet在全域性資訊的利用上做了改進,從而使視差的估計更多依賴於不同尺度的上下文資訊而不是畫素級別的區域性資訊。
PSMNet
Cost Volumn中的,視差級別是離散的(以畫素為單位),神經網路所學習的是在這些離散點上的Cost分佈,而分佈的極值點就對應了當前位置的視差值。但是視差(深度)值其實應該是連續的,用離散的點來估計會帶來誤差。CDN[32]中提出了連續估計的概念,除了離散點的分佈以外,還估記了每個點處的偏移。離散點和偏移量一起,就構成了連續的視差估計。