【深度學習】:一文入門3D計算機視覺

一.導論

目前深度學習已經在2D計算機視覺領域取得了非凡的成果,好比使用一張圖像進行目標檢測,語義分割,對視頻當中的物體進行目標跟蹤等任務都有很是不錯的效果。傳統的3D計算機視覺則是基於純立體幾何來實現的,而目前咱們使用深度學習在3D計算機視覺當中也能夠獲得一些不錯的效果,目前甚至有超越傳統依靠立體幾何識別準確率的趨勢。所以我們如今來介紹一下深度學習在3D計算機視覺當中的應用吧!本博文參考了前幾天斯坦福大學最新出的CS231n課程(2020/8/11新出),新課增長了3D計算機視覺視頻/動做分類的lecture,同時豐富了生成對抗網絡(GAN)的內容,但暫時國內還無人翻譯,所以小編將其翻譯整理成博文的形式供你們參考,若有錯誤之處,請你們見諒,同時歡迎你們討論。網絡

二.3D計算機視覺訓練集以及表示方法

 

 

 在3D計算機視覺當中,咱們能夠採用於訓練的模型共有以上幾種,分別是:函數

1.Depth Map(深度圖)學習

2.Voxel Grid(翻譯過來很奇怪,所以就保留原英語)編碼

3.Implicit Surface(隱表面)人工智能

4.PointCloud(三維點雲)spa

5.Mesh翻譯

那麼什麼是Depth Map(深度圖)呢?我們來看看設計

三.Depth Map(深度圖)

深度圖的圖像以下所示:3d

 

 

 在左上角有一張關於斯坦福大學寢室的圖片,咱們能夠將其轉化爲右上角的深度圖,其中深度圖當中不一樣的顏色表示了不一樣物體距離攝像頭的距離,距離攝像頭的距離越大,則顯示出來的顏色則越紅。咱們假設有一個神經網絡,咱們只須要輸入一張圖片,就能夠獲得圖片當中的全部位置距離攝像頭的距離,這樣是否是很酷呢?那麼咱們如何使用神經網絡對一系列的圖片訓練成爲深度圖的形式呢?一些研究人員便立馬想到可使用全卷積神經網絡(Fully convolutional Network)來實現這個過程,全卷積神經網絡(Fully convolutional Network)是咱們以前在2D計算機視覺當中所採用的用於圖像分割的神經網絡,以前圖像分割獲得的是每個像素點顯示的是屬於某一個物體類別的機率值,而如今咱們把一樣的神經網絡用於深度圖當中就能夠獲得圖像當中某一個像素距離攝像頭的遠近大小。這樣就能夠完美獲得我們的深度圖訓練模型了,咱們甚至能夠把這個全卷積神經網絡替換成U-net以期在一些特定數據集上獲得更好的效果。模型以下所示:
code

 

 

這個模型首先也是輸出一個3通道的彩色圖片,通過一個全卷積神經網絡(FCN)而後對深度圖進行估計,輸出的深度圖僅僅具備兩個維度,由於第三個維度爲1,意味着咱們輸出的深度圖其實是黑白的,用黑色或者白色的深度來表示距離攝像頭的距離,圖像當中使用了彩色僅僅是由於看起來更加方便。同時這裏的loss使用了L2距離進行損失函數的編寫。

可是!!!!細心的同窗確定會發現其中有必定的問題,那就是同一個物體,擁有不一樣的大小,他們若是僅僅經過一張圖片來斷定他們離攝像頭的距離是不必定準確的。由於圖片當中並無包含物體有關深度的信息。

好比咱們有兩隻形狀徹底相同的鳥,可是其中一隻鳥是另外一隻鳥大小的2倍,咱們把小鳥放到離攝像頭更近的位置,將大鳥放到離攝像頭更遠的位置,那麼僅僅經過一張圖片咱們就會認爲這兩隻鳥離咱們的攝像頭距離是同樣大的!以下圖所示:

 

 

 那麼這樣咱們又該如何解決呢?聰明的研究人員設計了一個具備尺寸不變特徵的的loss function來解決了這個問題,這個loss function的寫法以下:

 

 

 至於這個公式爲何會讓圖片的深度信息得以保留,這裏再也不贅述,感興趣的同窗能夠翻看一下提出這個loss的論文,在2016年的世界頂級人工智能會議論文NIPS上發表,於紐約大學(New York University)提出,論文的連接以下:https://papers.nips.cc/paper/5539-depth-map-prediction-from-a-single-image-using-a-multi-scale-deep-network.pdf

同時呢,在深度圖當中還有一種圖叫作垂直表面法向量圖,它的圖像以下所示:

 

 

 最後輸出圖像當中的不一樣顏色表明了這個物體的表面所朝空間當中的方向,好比綠色表明這個物體的表面是朝向右邊的,而紅色則表明這個物體的表面是朝向左邊的。咱們也可使用全卷積神經網絡(Fully convolutional Network)對這種輸出的圖像進行處理,其中的結構以下所示:

 

 最後的Loss採用了(x*y)/(|x|*|y||)的方法,由於咱們所預測的圖像具有圖像的方向和深度的信息,而圖像的方向和大小正好能夠由向量表示,豈不美哉?每個訓練集當中的圖片的其中一個像素點均可以由一個向量來表示,同時具有深度(長度)和方向的信息。而原圖當中某個像素點的大小能夠表示爲向量x,經過神經網絡推測以後的同一個像素點則能夠表示爲向量y,所以咱們可使用公式(x*y)/(|x|*|y||)來衡量這兩個向量之間的差距,其中(x*y)中的乘法使用了點乘,所以上下相除可得cos(theta)也就是圖片當中某個像素點所具有的loss的大小,將整個圖片當中全部像素點的大小加起來則能夠獲得整個圖像當中loss的大小了。

 

四.Voxel Grid網格表示法

 

 

 如上圖所示,咱們能夠將一張二維的圖片轉爲一張三維的Voxel grid圖,什麼是Voxel grid圖呢?Voxel grid圖就是在一個三維的,大小爲V*V*V的空間立體當中,由一系列1*1*1正方體網格堆砌出來的三維立體圖形,Voxel grid圖當中的每個網格只具備兩個值,1或者0,1表示這個地方有正方體,0表示這個地方沒有正方體。一個Mesh圖當中只保留物體的形狀和大小信息,而不保留物體的顏色以及紋理的信息。

咱們先來看一個有趣的問題,用什麼方法能夠對三維Voxel grid圖進行分類呢?咱們暫時不考慮將二維圖像恢復到三維Voxel grid圖的狀況的話,常見的手段是使用立體3D卷積,以下圖所示:

 

 

 3D立體卷積和咱們的2D卷積有一點不一樣之處,那就是卷積核的神奇之處是它居然是一個正立方體!而不是一個二維的平面!在上圖當中,咱們的輸入是一個四通道的1*30*30*30的Voxel grid圖,輸入的圖像多是一個椅子,也多是一個牀。咱們經過三維卷積,不斷地進行卷積以及池化的操做,接着使用全鏈接神經網絡將其展開,最後使用softmax函數將其繼續擰分類。咱們使用3D卷積可以對立體圖像的特徵進行更爲有效的檢測,由於一個立體的圖像不只僅有長和寬上面的信息,還有其有關深度的相關信息,所以須要採用3D卷積。3D卷積的動態圖以下所示,這個例題動態圖當中卷積核的大小爲3*3*3

 

 

 再回到咱們剛纔的問題,如何將一個二維的圖像轉化爲Voxel grid圖呢,咱們能夠採用的卷積神經網絡以下所示:

 

 首先咱們將二維的圖像首先送入到一個2D卷積神經網絡當中,用於提取這個二維圖像的特徵,而後經過全鏈接神經網絡或者Flatten層將其展平一個一維的向量,這樣就能夠更加方便地轉化reshape爲四通道進行三維卷積的形式,前面咱們已經說過三維卷積可以更好地抽象地還原和提取到圖像在三維空間上的個特徵,所以咱們對剛纔二維圖像抽象出來的特徵經過三維卷積進行還原,這是一個經過三維卷積進行上採樣的過程。最後輸出的結果就能夠獲得咱們的Voxels grid圖啦!

可是使用三維卷積經常就會用更爲昂貴的代價來換取更爲準確的結果,由於三維卷積使用的參數過多,以下圖所示:

 

 咱們僅僅儲存1024^3個Voxels grid網格就須要電腦4GB的顯存,實在是太大了!好多電腦的顯存尚未這麼大呢!所以有些研究人員則直接使用二維卷積對圖像進行三維的還原,固然效果確定沒這麼好啦,以下圖所示:

 

 這個思想就很和咱們的自編碼器(Auto-Encoders)很像了。

 

五.採用隱函數

咱們還能夠採用物體在三維空間當中的函數圖像來表示一個立體物體,咱們再用神經網絡來從新擬合出這個函數就好啦,我的以爲在這種方法不太合理,以下所示:

 

 六.採用3D點雲

採用3D點雲應該是目前比較靠譜的方案,

 

 在3D點雲當中每個點,都有三個參數,分別是每一個點在x,y,z軸上的位置,對3D點雲進行分類的話和對Mesh分類的方法差很少,也是通過必定的神經網絡再通過softmax函數就能夠獲得最後的分類了!以下圖所示

 

這就是小編今天分享的所有內容了,終於寫完啦,若是以爲讀了小編的文章您有收穫的話,不要忘記了點擊下方的「推薦哦!您的支持就是對小編創做最大的動力!

相關文章
相關標籤/搜索