基於深度學習的三維點雲分類的介紹
轉自博主 particle,該文章翻譯自http://www.itzikbs.com/3d-point-cloud-classification-using-deep-learning
在過去的這些年裡,對二維影象已經有了大量深入的研究,並且有著長足的發展。它在分類任務上取得了極好的結果主要得益於一下兩個關鍵因素:
1.卷積神經網路。
2.資料 - 大量影象資料可用。
但是對於3D點雲,資料正在迅速增長。大有從2D向3D發展的趨勢,比如在opencv中就已經慢慢包含了3D點雲的處理的相關模組,在資料方面點雲的獲取也是有多種渠道, 無論是源於CAD模型還是來自LiDAR感測器或RGBD相機的掃描點雲,無處不在。 另外,大多數系統直接獲取3D點雲而不是拍攝影象並進行處理。
3D點雲應用深度學習面臨的挑戰。首先在神經網路上面臨的挑戰:
(1)非結構化資料(無網格):點雲是分佈在空間中的XYZ點。 沒有結構化的網格來幫助CNN濾波器。
(2)不變性排列:點雲本質上是一長串點(nx3矩陣,其中n是點數)。 在幾何上,點的順序不影響它在底層矩陣結構中的表示方式,例如, 相同的點雲可以由兩個完全不同的矩陣表示。 如下圖所示:
(3)點雲數量上的變化:在影象中,畫素的數量是一個給定的常數,取決於相機。 然而,點雲的數量可能會有很大的變化,這取決於各種感測器。
在點雲資料方面的挑戰:
(1)缺少資料:掃描的模型通常被遮擋,部分資料丟失。
(2)噪音:所有感測器都是嘈雜的。 有幾種型別的噪聲,包括點雲擾動和異常值。 這意味著一個點有一定的概率位於它被取樣的地方(擾動)附近的某一半徑範圍內,或者它可能出現在空間的任意位置(異常值)。
(3)旋轉:一輛車向左轉,同一輛車向右轉,會有不同的點雲代表同一輛車
Princeton’s Modelnet40 dataset。 它包含約40個物件類別(如飛機,表格,植物等),用三角形網格表示的12311個CAD模型。 資料分為9843個培訓模式和2468個測試模式,如下圖
在點雲上應用深度學習的直接方法是將資料轉換為體積表示。 例如體素網格。 這樣我們就可以用沒有神經網路問題的3D濾波器來訓練一個CNN(網格提供了結構,網格的轉換解決了排列問題,體素的數量也是不變的)。 但是,這有一些不利因素。 體積資料可能變得非常大,非常快。 讓我們考慮256×256 = 65536畫素的典型影象大小,現在讓我們新增一個維度256x256x256 = 16777216體素。 這是很大的資料量(儘管GPU一直在發展)。 這也意味著非常緩慢的處理時間。 因此,通常我們需要妥協並採取較低的解析度(一些方法使用64x64x64),但是它帶來了量化誤差的代價。所以,所需的解決方案是一個直接的深度學習的方法,將是3D點雲應用深度學習的重點。
作者調查了三種最近發表的文章,主要針對對點雲進行深度學習的論文。 正如下圖所示,展示了3D點雲分類準確性出版(準確性,年份和資料型別),它總結了資料集上的最新準確性結果。 以及每種方法正在處理的資料的型別。 可以看到,在2015年,大多數方法都用於多檢視資料(這是一種簡短的說法 - 讓我們拍攝3D模型的幾張照片並使用2D方法處理它們),2016年更多的方法使用了體素表示的點雲學習和2017年的基於點的方法有了大幅度的增長。
PointNet(CVPR2017)
開拓者! 來自斯坦福大學,他們的工作引起了很多關注。他們做了一些令人驚訝的簡單的事情,並證明了為什麼它運作良好,他們分別在每個點上訓練了一個MLP(在點之間分享權重)。每個點被“投影”到一個1024維空間。然後,他們用點對稱函式(max-pool)解決了點雲順序問題。這為每個點雲提供了一個1 x 1024的全域性特徵,這些特徵點被送入非線性分類器。利用他們稱為T-net的“迷你網路”解決了旋轉問題。它學習了點(3 x 3)和中級特徵(64 x 64)上的變換矩陣。稱之為“迷你”有點讓人誤解,因為它實際上與主網路的大小有關。另外,由於引數數量的大量增加,引入了一個損失項來約束64×64矩陣接近正交。也使用類似的網路進行零件分割。也做了場景語義分割。做得好!我強烈推薦閱讀(或者您也可以觀看演示視訊)。本文對ModelNet40資料集的準確率高達89.2%。下圖是pointNet點雲分類的框架
引用: Charles R. Qi, Hao Su, Kaichun Mo, and Leonidas J. Guibas. Pointnet: Deep learning on point sets for 3d classication and segmentation. In The IEEE Conference on Computer Vision and Pattern Recognition (CVPR), July 2017.
The code is available on GitHub: PointNet code
Pointnet ++(NIPS 2017)
在PointNet之後不久,引入了Pointnet ++。它本質上是PointNet的分層版本。每個圖層都有三個子階段:取樣,分組和PointNeting。在第一階段,選擇質心,在第二階段,把他們周圍的鄰近點(在給定的半徑內)建立多個子點雲。然後他們將它們給到一個PointNet網路,並獲得這些子點雲的更高維表示。然後,他們重複這個過程(樣本質心,找到他們的鄰居和Pointnet的更高階的表示,以獲得更高維表示)。使用這些網路層中的3個。還測試了不同層級的一些不同聚合方法,以克服取樣密度的差異(對於大多數感測器來說這是一個大問題,當物體接近時密集樣本,遠處時稀疏)。他們在原型PointNet上進行了改進,在ModelNet40上的準確率達到了90.7%。下面是Pointnet++ 架構。
引用: Charles R Qi, Li Yi, Hao Su, and Leonidas J Guibas. Pointnet++: Deep hierarchical feature learning on point sets in a metric space. arXiv preprint arXiv:1706.02413, 2017.
Kd-Network(ICCV 2017)
本文使用著名的Kd樹在點雲中建立一定的順序結構的點雲。一旦點雲被結構化,他們就會學習樹中每個節點的權重(代表沿特定軸的細分)。每個座標軸在單個樹層級上共享權重如下圖中的所有綠色都具有共享權重,因為它們將資料沿x維度細分。測試了隨機和確定性的空間細分,並說明了隨機版本效果最好。但同時也說出了一些缺點。對旋轉(因為它改變樹結構)和噪聲(如果它改變樹結構)敏感。對於每個輸入點雲資料,都需要上取樣,下采樣或訓練一個新模型。
在Modelnet40上報告了1024點(深度10樹)的90.6%準確度資料集和〜32K點(深度15樹)的91.8%。做到了部分點雲分割,形狀檢索,並可以在後期工作中嘗試其他的樹形結構。
引用: Roman Klokov and Victor Lempitsky. Escape from cells: Deep kd-networks for the recognition of 3d point cloud models. arXiv preprint arXiv:1704.01222, 2017.
總結:Pointnet和Pointnet ++使用對稱函式來解決順序問題,而kd-Network使用Kd-tree。 Kd樹也解決了結構問題,而在PointNets MLP每個點分別訓練。