一.導論
目前深度學習已經在2D計算機視覺領域取得了非凡的成果,比如使用一張影像進行目標檢測,語義分割,對視訊當中的物體進行目標跟蹤等任務都有非常不錯的效果。傳統的3D計算機視覺則是基於純立體幾何來實現的,而目前我們使用深度學習在3D計算機視覺當中也可以得到一些不錯的效果,目前甚至有超越傳統依靠立體幾何識別準確率的趨勢。因此我們們現在來介紹一下深度學習在3D計算機視覺當中的應用吧!本博文參考了前幾天史丹佛大學最新出的CS231n課程(2020/8/11新出),新課增加了3D計算機視覺和視訊/動作分類的lecture,同時豐富了生成對抗網路(GAN)的內容,但暫時國內還無人翻譯,因此小編將其翻譯整理成博文的形式供大家參考,如有錯誤之處,請大家見諒,同時歡迎大家討論。
二.3D計算機視覺訓練集以及表示方法
在3D計算機視覺當中,我們可以採用於訓練的模型共有以上幾種,分別是:
1.Depth Map(深度圖)
2.Voxel Grid(翻譯過來很奇怪,因此就保留原英語)
3.Implicit Surface(隱表面)
4.PointCloud(三維點雲)
5.Mesh
那麼什麼是Depth Map(深度圖)呢?我們們來看看
三.Depth Map(深度圖)
深度圖的影像如下所示:
在左上角有一張關於史丹佛大學寢室的圖片,我們可以將其轉化為右上角的深度圖,其中深度圖當中不同的顏色表示了不同物體距離攝像頭的距離,距離攝像頭的距離越大,則顯示出來的顏色則越紅。我們假設有一個神經網路,我們只需要輸入一張圖片,就可以得到圖片當中的所有位置距離攝像頭的距離,這樣是不是很酷呢?那麼我們如何使用神經網路對一系列的圖片訓練成為深度圖的形式呢?一些研究人員便立馬想到可以使用全卷積神經網路(Fully convolutional Network)來實現這個過程,全卷積神經網路(Fully convolutional Network)是我們之前在2D計算機視覺當中所採用的用於影像分割的神經網路,之前影像分割得到的是每一個畫素點顯示的是屬於某一個物體類別的概率值,而現在我們把同樣的神經網路用於深度圖當中就可以得到影像當中某一個畫素距離攝像頭的遠近大小。這樣就可以完美得到我們們的深度圖訓練模型了,我們甚至可以把這個全卷積神經網路替換成U-net以期在一些特定資料集上得到更好的效果。模型如下所示:
這個模型首先也是輸出一個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網格表示法
如上圖所示,我們可以將一張二維的圖片轉為一張三維的Mesh圖,什麼是Mesh圖呢?Mesh圖就是在一個三維的,大小為V*V*V的空間立體當中,由一系列1*1*1正方體網格堆砌出來的三維立體圖形,Mesh圖當中的每一個網格只具有兩個值,1或者0,1表示這個地方有正方體,0表示這個地方沒有正方體。一個Mesh圖當中只保留物體的形狀和大小資訊,而不保留物體的顏色以及紋理的資訊。
我們先來看一個有趣的問題,用什麼方法可以對三維Mesh圖進行分類呢?我們暫時不考慮將二維影像恢復到三維Mesh圖的情況的話,常見的手段是使用立體3D卷積,如下圖所示:
3D立體卷積和我們的2D卷積有一點不同之處,那就是卷積核的神奇之處是它竟然一個立體立方體!而不是一個二維的平面!在上圖當中,我們的輸入是一個四通道的1*30*30*30的Mesh圖,輸入的影像可能是一個椅子,也可能是一個床。我們通過三維卷積,不斷地進行卷積以及池化的操作,接著使用全連線神經網路將其展開,最後使用softmax函式將其繼續擰分類。我們使用3D卷積能夠對立體影像的特徵進行更為有效的檢測,因為一個立體的影像不僅僅有長和寬上面的資訊,還有其有關深度的相關資訊,因此需要採用3D卷積。3D卷積的動態圖如下所示,這個例題動態圖當中卷積核的大小為3*3*3:
再回到我們剛才的問題,如何將一個二維的影像轉化為Mesh圖呢,我們可以採用的卷積神經網路如下所示:
首先我們將二維的影像首先送入到一個2D卷積神經網路當中,用於提取這個二維影像的特徵,然後通過全連線神經網路或者Flatten層將其展平一個一維的向量,這樣就可以更加方便地轉化reshape為四通道進行三維卷積的形式,前面我們已經說過三維卷積能夠更好地抽象地還原和提取到影像在三維空間上的個特徵,因此我們對剛才二維影像抽象出來的特徵通過三維卷積進行還原,這是一個通過三維卷積進行上取樣的過程。最後輸出的結果就可以得到我們的Voxels grid圖啦!
但是使用三維卷積常常就會用更為昂貴的代價來換取更為準確的結果,因為三維卷積使用的引數過多,如下圖所示:
我們僅僅儲存1024^3個Voxels grid網格就需要電腦4GB的視訊記憶體,實在是太大了!好多電腦的視訊記憶體還沒有這麼大呢!因此有些研究人員則直接使用二維卷積對影像進行三維的還原,當然效果肯定沒這麼好啦,如下圖所示:
這個思想就很和我們的自編碼器(Auto-Encoders)很像了。
五.採用隱函式
我們還可以採用物體在三維空間當中的函式影像來表示一個立體物體,我們再用神經網路來重新擬合出這個函式就好啦,個人覺得在這種方法不太合理,如下所示:
六.採用3D點雲
採用3D點雲應該是目前比較靠譜的方案,
在3D點雲當中每一個點,都有三個引數,分別是每個點在x,y,z軸上的位置,對3D點雲進行分類的話和對Mesh分類的方法差不多,也是經過一定的神經網路再經過softmax函式就可以得到最後的分類了!如下圖所示:
這就是小編今天分享的全部內容了,終於寫完啦,如果覺得讀了小編的文章您有收穫的話,不要忘記了點選下方的“推薦”哦!您的支援就是對小編創作最大的動力!