PointNet初學理解

論文鏈接:http://openaccess.thecvf.com/content_cvpr_2017/papers/Qi_PointNet_Deep_Learning_CVPR_2017_paper.pdf

代碼地址:https://github.com/fxia22/pointnet.pytorch

PointNet首次將點雲數據直接拿來做端到端的訓練。而在此之前,「體素化(Voxelization)+3d卷積」和「將點雲投影到二維平面」是處理三維數據的常見方法。但3d數據最初始的形態就是點雲,因此體素化和投影會造成一些問題,且3d卷積的代價較大;而且映射到2d會損失一些3d信息。

點雲數據最大的一個問題就是無序性,有三種方法處理這個問題:(1)對無序數據進行排序;(2)將其看成一種序列,用RNN處理;(3)採用一種簡單的對稱函數,消除無序數據的影響,如max,sum,乘法等等。

作者採用了max pooling這一對稱函數(Symmetric function),來解決點雲數據的無序性特徵。也就是說,無論輸入數據的序列是否相同,經對稱函數變換得到的結果都是一致的。
在這裏插入圖片描述
下面分析一下這個max pooling是怎麼作用的,先貼一個PointNet模型結構圖:
在這裏插入圖片描述
上圖中上半部分的藍色區域是分類模型。輸入是batch張點雲圖,每個點雲圖包括n個點數據,每個點數據包括三個維度(x,y,z)座標。因此輸入的維度爲[batch, n, 3]。隨後我們需要得到每一個點的特徵向量,爲了方便1dConv(代碼中是1dConv,圖中是mlp,不過問題不大,都是在做特徵提取),調換第二和第三個維度(先不考慮T-Net的affine變換),此時數據維度變爲[batch, 3, n]。經過一系列網絡的變換,得到維度是[batch, 1024, n]的特徵向量。而max pooling就是求解這n個點在每個維度上最大的的feature,因此每個點雲圖此時對應一個1024維的特徵向量,再經過若干層mlp,得到各自的k維類別向量。

值得注意的是,點雲數據所表示的目標在空間上具有一定的不變性,如平移或旋轉。因此在網絡中有兩個Transform,分別對應輸入點雲圖變換,以及特徵變換。都是通過一個T-Net的結構學習到一個仿射變換矩陣(前者333*3,後者646464*64),以對點雲數據或特徵進行對齊來保證其不變性。

因此對稱函數max pooling的選取,和T-Net的引入以保證不變性,這兩點非常妙。而在語義分割的網絡中,作者還將全局特徵與局部特徵進行融合,這種做法也能一定程度上利用點雲之間存在的空間關係。

在這裏插入圖片描述
PointNet具有較好的魯棒性,在數據缺失20%的情況下,分類的準確率仍然保持較好的水平,其原因是PointNet能夠學習到一些關鍵的點。在沒有數據缺失的正常情況下,精確度與之前的「體素化」和「圖像投影」的方法相比,也是非常優秀的。在分割方面,PointNet的平均IoU也稍優於3dCNN,但其速度是他最大的優勢。

但是PointNet還存在一些缺點,例如在提取特徵的時候都是先提取每個點各自的feature,因此與傳統CNN逐層提取局部特徵的方式不太一樣。而且在classroom數據集做分割時,由於點雲圖過大,將其分割爲若干111*1的block,倘若一個物體正好被攔腰切開,那勢必會造成一些問題。

最後mark一篇個人感覺非常好的PointNet的博文:

https://www.cnblogs.com/Libo-Master/p/9759130.html

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