深度學習之單目深度估計:無監督學習篇

點擊上方“3D視覺工坊”,選擇“星標”

乾貨第一時間送達

作者:桔子毛

https://zhuanlan.zhihu.com/p/29968267

本文僅做學術分享,如有侵權,請聯繫刪除。

Previously on 單目深度估計:

chapter.1 基礎篇中,我們主要介紹了一些使用深度學習來進行單目深度估計的例子。Multi-layer的結構,形狀大小各異的知名pre-trained網絡將神經網絡這種函數模擬器的優點發揮的淋漓盡致。但是這類方法有一個缺點就是在訓練的過程中,我們需要預先知道大量的輸入的圖片所對應深度值的參考標準作爲訓練的約束,從而對神經網絡進行反向傳播,訓練出我們的神經網絡用來對於相似的場景進行深度預測。這類方法也就是常說的“監督學習”。但是現實情況下,求取場景所對應的深度值並不是一件容易的事。目前比較常用的方法是從kinect的紅外傳感器中得到深度(NYU Depth V2)或者藉助於激光雷達(KITTI),kinect雖然比較廉價,但是所採集到的深度範圍(超過4m kinect估計的深度的精度就會下降)和精度都有限。而激光雷達的成本就比較高了。那有沒有一種方法能夠在訓練的時候不需要在已知深度的情況下得到一個估計深度的神經網絡呢?本節中我們介紹幾種通過非監督學習的方法進行單目深度估計的例子。

1. 基礎知識

神奇的達爾文進化定律告訴我們,單個眼睛的自然界生物大都滅絕了。自然界的大多物種都是和人一樣,需要兩隻眼睛來做三維空間定位。那爲什麼需要兩隻眼睛呢?

因爲一隻眼睛看到的圖像是二維的,二維的信息是無法用來表示三維的空間的,如上圖所示,雖然處於同一水平面上的照相機L,R拍攝了同一個物體,兩者之間產生的圖片是不同的。並且這種不同是不能通過平移生成的圖片所消除的。離照相機近的物體偏離的位置比較大,離照相機遠的物體偏離的比較少。這種差異性的存在就是三維空間帶來的。同時同一水平線上的兩個照相機拍攝到的照片是服從以下物理規律的:

在圖中, 爲場景所距離我們的深度, 爲三維場景映射到的二維圖像平面,也就是最終我們得到的二維圖像所在的平面。 爲相機的焦距。 爲兩個相機之間的距離, 分別爲相同物體在左右兩個不同相機中成像的座標。根據以上信息,和簡單的三角形相似規律我們可以得到:

這裏 就是我們常說的視差 (disparity), 代表了 這個點在照相機 和照相機 中成像的偏離值。也就是說這個值代表了左照相機中的像素需要通過平移 才能形成右照相機中相應的像素。所以兩個視角之間的關係可以寫作:

假設我們有一個很強大的函數 ,沒錯這個函數就是神經網絡,使得 ,那麼就有:

只要我們以 作爲訓練的輸入, 作爲所對應的參考標準,建立如上關係的神經網絡 ,通過大量的雙目圖片對的訓練,得到的神經網絡 就是一個 輸入一張圖片 來預測所對應的視差 的函數,這樣就將一個沒有約束的問題變成了符合如上規律的問題,就可以採用常規思路進行求解了。同時視差 在已知照相機參數 的情況下,就能求取相對應的深度

總結以上規律我們得到:因爲單目求深度需要昂貴的激光雷達,但是兩個同一水平線上的兩個照相機所拍攝的照片卻相對容易得到。只要我們通過單張輸入圖片求取相對應的disparity ,同時在得知照相機參數( )的情況下也就能求得所對應的深度

這種思路最先應用於使用單張圖片生成新視角問題:DeepStereoDeep3d之中, 在傳統的視角生成問題之中,首先會利用兩張圖(或多張)求取圖片之間的視差d,其次通過得到的視差(相當於三維場景)來生成新視角。深度學習在這方面也有很多漂亮的工作,這個新坑以後再填。

2. 一些細節問題

在之前我們將單目深度估計問題寫成了一個簡單的函數:

通過本篇文章第一節的內容,這個函數可以進化成如下形式:

其中 爲所預測的深度, 爲固定相機下的視差, 爲相機兩個鏡頭之間的距離, 爲焦距。

那我們知道, 這種關係可以輕而易舉的使用CNN模擬出來,而(3)中的關係就有一個問題,我們預測到的d是連續的浮點數,如果使用 的套路,那麼很有可能會落入到不在(整數)像素點的位置,同時由於不同位置 不同,也有可能有一個 中的像素點 接受多個來自 的像素點顏色,因爲它們都滿足 。而也有一些點並沒有相符合的 ,因爲這些點由於視差的原因在原圖中可能根本不可見。爲了解決這個問題,一般採用backward(reverse) mapping的方法,如下圖所示:

這兩種方法的區別在於,在forward mapping中,我們得到 中的點可能會落在不是整數像素點的位置,這時只能通過最近原則將原圖 中的像素點對應到 中去,而在Inverse mapping中,我們從 出發(也就是 ),去尋找相對應的原圖中的點,這樣能夠確保 中的每一個點都有賦值不會出現空洞,並且如果 得到的原圖中的點不屬於(整數)像素點,這時可以通過插值的方法求得所對應非像素點的位置。一般在這裏採用雙線性插值的方法,而且它在sub-pixel level是可導的[Spatial Transformer Networks]。所以我們就可以end-to-end的來訓練網絡啦。

所以在訓練的時候我們的網絡分爲了以下步奏:

而所對應的損失函數爲:

至此,正向傳播過程通過 來得到所對應的視差 ,mapping過程將右圖轉換成左圖,損失函數計算當前的準確度並且進入優化過程,反向傳播過程如下式所述:

上式中, 中需要優化的神經網絡的參數, 由損失函數得到, 由mapping方法提供, 由神經網絡自己back-propagation得到。測試過程只需要將 傳入神經網絡 就能得到所對應的視差,結合相機參數,就能求得深度。大功告成!接下來看看各路神仙都是怎麼用這個思路來做深度預測的吧!

3. Naive 方法

Unsupervised CNN for Single View Depth Estimation: Geometry to the Rescue(ECCV 2016)

這篇文章所採用的方法和我上述描述稍有不同,我所採用的是:

而文章中所採用的是:

第一個不同在於mapping方程的求導方法上,在這篇文章中爲了求得mapping相對於d的導數,使用泰勒展開式來得到。相當於一個numeric的求導過程:

而我們上一節中介紹的方法是通過線性插值來求導,更快,準確度更高。

第二個不同就是它通過 來map回 ,同時約束了輸入圖 與生成的輸入圖 之間的關係。但是不要小看這個區別,我的方法所預測的disparity描述了 經過 生成 的過程,而文章中預測到的disparity描述了 通過 生成 的過程。根據本文之前討論的,輸入圖片的內容中由於不同視角物體的遮擋關係,原圖 所表現出來的像素點位置可能在新視角 中並不存在。所以我預測到的 所對應的深度,而文章中預測到的則是 所對應的深度,雖然這兩者在大部分的像素點的深度範圍都相同,但也就是這樣的細節告訴了我們,爲什麼人家的方法能夠發ECCV而我只能發知乎專欄都是有原因的。

在網絡方面,這篇文章採用了一個類似FCN的結構,沒有全連接層的參與,體量小速度快。同時skip-connect的參與保證了輸出特徵細節的相對完整性,再其次就是可以使用pre-trained的網絡結構作爲encoder部分,在數據不足的情況下也能達到相對好的效果。

4. Unsupervised Monocular Depth Estimation with Left-Right Consistency

在剛纔的文章中,我們介紹了Naive的方法來求解深度,同時也指出了我介紹的方法的不足,但是有沒有方法能夠結合這兩種估計深度的方法得到更多的約束呢?接下來我們就來介紹一種robust,multi-level,multi-loss的方法用來做非監督的深度估計。

Unsupervised Monocular Depth Estimation with Left-Right Consistency(2017 CVPR)

這篇文章方法上的貢獻點可以參考上圖,naive可以說是ECCV 2016的方法,No LR是本文之前介紹的方法,這篇文章相當於結合了這兩個方法得到的結果。通過 進入神經網絡可以求得 , 通過輸入不同的參考圖片在mapping中可以得到相對應的原圖 和右圖 。所以ECCV2016的損失函數僅僅是 ,而這一篇文章可以加的約束就多很多了:

如上圖所示,第一對 表示了圖片重建的損失函數,在這裏,作者採用了一個SSIM和L1相結合的損失函數,因爲L1並不能很好的表示真實的圖片分佈(相關討論可以看損失函數的討論SRGAN):

其次,理想狀況下, 之間也存在着與原圖相同的視差關係,也就是說:

所以,當預測的深度達到最優時,以下損失函數達到最小值,同理,交換 的位置所得等式依舊成立,這一項也就是本節文章題目中所說得到的left-right Consistency

關於損失函數中的 部分,作者提出了一個edge preserving的損失函數,主要的意圖是因爲depth的不連續性往往發生在邊緣附近。提出了這個損失函數用來保證所得到的深度圖的光滑性與圖像梯度一致。

說完了損失函數再來說說網絡:

這篇文章所使用的網絡和之前的方法類似,均採用了FCN的方法進行訓練,不同的是在decoder部分的最外面4層,作者都估計了當前特徵大小所對應的視差的值,並且將它上採樣後傳遞給了decoder的下層,這樣能確保每一層都在做提取disparity這件事,同時也相當於做了一個coarse-to-fine的深度預測,同時由於我們採用了雙線性差值,梯度的範圍始終來自於周圍的4個座標點,coarse-to-fine的預測能夠讓梯度來自於離當前位置更遠的座標點,6中也討論了這個問題。

對於一個robust的系統來說 ,這篇文章可以說是典範了。各種novel的損失函數,multi-level的結果,solid的實驗結果,加上簡單有效的貢獻點。五星推薦。所以這篇文章出來之後,就有人想,能不能結合有監督學習和無監督學習來共同進行深度預測?

5. Semi-Supervised Deep Learning for Monocular Depth Map Prediction

Semi-Supervised Deep Learning for Monocular Depth Map Prediction(2017 CVPR)

理解了上一篇就知道作者爲什麼要來寫這一篇了。既然無監督學習深度能夠取得好的效果,那麼我們將傳感器得到的稀疏的深度作爲參考標準,和4中提到的完全非監督的方法共同去估計深度應該也會有好的效果。所以這篇文章的貢獻點主要集中在損失函數部分,既有監督學習得到的loss(稀疏深度和預測到的深度的差值),又有非監督學習得到的loss(生成的新視角圖片之間的差值),還有深度域上的正則項(depth梯度的正則)。結合以上一起用來訓練。這篇文章的對比實驗部分很詳細,感覺可以挖掘出很多信息。

如圖所示,[9]爲我們之前在4中介紹過的"Unsupervised Monocular Depth Estimation with Left-Right Consistency”,[6]爲我們在3中介紹過的"Unsupervised CNN for Single View Depth Estimation: Geometry to the Rescue",可以看到當前的方法僅僅採用非監督學習的方法是要差於[9]的,因爲[9]中用了multi-scale的深度估計,left-right consistency的損失項等等。

同理我們再來比較一下每一個貢獻點之間方法關係:

效果提升最明顯有以下幾個部分:1. 非監督學習和監督學習相結合,更多的監督數據得到更好的效果。2. skip-connection。3. Gaussian smoothing 也就是文章所說的正則項。第一個可以說是它這篇文章的主要貢獻點,第二個則是一個非常general的方法。第三個算是一個很小的貢獻點(這種smooth在上篇文章中也有用到)。所以這篇文章的自身的貢獻點還是集中於非監督學習和監督學習的結合。

所以這篇文章(CVPR Spotlight)是沒有上一篇文章(CVPR oral)好的。

6. Unsupervised Learning of Depth and Ego-Motion from Video

Unsupervised Learning of Depth and Ego-Motion from Video(CVPR 2017)

這篇文章的方法可以說是繼承與ECCV2016這篇文章。在之前的文章中我們介紹到,在已知相機參數的情況下,我們可以通過視差 來得到相對應的深度 。那如果相機不在同一個平面並且參數我們也不知道呢?

如下圖所示,先將 輸入到Depth CNN 中用來預測深度 ,其次將 輸入到pose CNN中來預測得到的照相機參數,所以就有 。這裏G代表了depthCNN, F代表poseCNN, 通過深度 和照相機的參數 和兩者之間的關係V,能夠算出在t-1時刻或者t 1時刻所得到的重建圖 ,以視角合成問題作爲監督學習,所預測到的深度depth 和照相機的pose都是通過非監督學習過程得到的。網絡方面這篇文章還是採用了FCN的結構(看來FCN這種結構已經制霸image-to-image translation領域了)

同時這篇文章的損失函數是很有意思的,這一系列視頻幀中其實只是有一部分出現在了最後重建的結果之中,那麼就需要對於每一幀有一個mask能夠讓我們挑選出出現在最終結果之中的部分,也就是這裏的 用來過濾沒有用的信息。我們知道,如果非監督學習來做這個問題我們拿到的數據就只有視頻幀,是沒有mask的參考標準的,如果我們通過如下損失函數去進行預測,那麼當E中所有的值爲0時,損失函數達到最小。但是這並不是我們想要的。所以這裏作者使用了一個約束,用來得到E:假設mask所有的值都爲1,然後使得像素值均爲1的mask和 之間的交叉熵(cross-entropy loss)儘可能小(意味着兩者更相似)。這也就意味着,我們需要得到一個儘可能大的mask,並且這個mask能夠讓重建的損失函數達到最小!

個人覺得是很聰明的做法,所以整個損失函數就變成了,其中smooth爲預測的深度圖的正則項:

還有就是因爲這篇文章中的算法是純非監督學習的(甚至是照相機的參數),所以預測得到的深度相比前兩篇CVPR的文章稍差一點。不過我覺得方法和適用性可以說是這三者裏最好的一個了。

7.參考

部分圖片來自於:

http://www.cs.tut.fi/~suominen/SGN-1656-stereo/stereo_instructions.pdf

https://courses.cs.washington.edu/courses/cse455/09wi/Lects/lect16.pdf

https://www.comp.nus.edu.sg/~cs4340/lecture/imorph.pdf

推薦閱讀

重磅!3DCVer-學術論文寫作投稿 交流羣已成立

掃碼添加小助手微信,可申請加入3D視覺工坊-學術論文寫作與投稿 微信交流羣,旨在交流頂會、頂刊、SCI、EI等寫作與投稿事宜。

同時也可申請加入我們的細分方向交流羣,目前主要有3D視覺CV&深度學習SLAM三維重建點雲後處理自動駕駛、CV入門、三維測量、VR/AR、3D人臉識別、醫療影像、缺陷檢測、行人重識別、目標跟蹤、視覺產品落地、視覺競賽、車牌識別、硬件選型、學術交流、求職交流等微信羣,請掃描下面微信號加羣,備註:”研究方向+學校/公司+暱稱“,例如:”3D視覺 + 上海交大 + 靜靜“。請按照格式備註,否則不予通過。添加成功後會根據研究方向邀請進去相關微信羣。原創投稿也請聯繫。

▲長按加微信羣或投稿

▲長按關注公衆號

3D視覺從入門到精通知識星球:針對3D視覺領域的知識點彙總、入門進階學習路線、最新paper分享、疑問解答四個方面進行深耕,更有各類大廠的算法工程人員進行技術指導。與此同時,星球將聯合知名企業發佈3D視覺相關算法開發崗位以及項目對接信息,打造成集技術與就業爲一體的鐵桿粉絲聚集區,近1000+星球成員爲創造更好的AI世界共同進步,知識星球入口:

學習3D視覺核心技術,掃描查看介紹,3天內無條件退款

 圈裏有高質量教程資料、可答疑解惑、助你高效解決問題

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