PointNet
PointNet發(fā)布于2017CVPR。
《PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation》
題外話
PointNet對于3D點云分割的意義有點像FCN對語義分割的意義。PointNet不同以往的voxel-based的模型,它試圖通過直接對點云數據中每一個點進行處理,來分析點云中每一個點的信息,提取特征,做分類或分割的task。也就是說,PointNet為點云分割提供了另一條道路,即point-based的方法。
1引言
老生常談,每一種數據結構都有其存在的道理和意義,點云(Point Cloud)也是如此,對于真實世界,光靠簡單的2D RGB圖片信息并不能很好的理解。而3D 結構則能夠更好的去重現真實世界的場景,因此對于3D數據的處理也是未來的一個重要的發(fā)展方向。
通常,點云是一個無序的點集。這些點集分布在空間中,就如同云一樣,形成了我們能看到的一些物體。當然,需要注意,這里的無序指的是點云中的點可以被保存在這個點集文件中的任意位置,只要你將點集讀取出來并映射在空間中,這個點還是原來空間中的那一個點,它的空間位置信息并不會因為你把它保存在什么位置而改變。不同于點云,2D圖像中的每一個點的位置就是固定的,改變了點的位置,圖像就自然改變了。
在這里我們就引入了點云的一個特性,也就是無序性。當然,點云還有其他特性:一是旋轉、平移不變性,也就是點云可以旋轉任何角度、平移任何距離,它整體還是同一個點云,點與點之間的相對位置信息是不變的;二是點的交互性:點云中的點并不是孤立的,每一個點都會和周圍點進行交互,即空間中的點在小范圍內形成有意義的子集。就像很多點可以集成變成一把椅子這樣。
1.1 voxel-based和point-based的優(yōu)缺點
正如我們上面提到,點云是無序的,當我們輸入一個點云,想對它實現semantic segmentation任務時,該如何確定點與點之間的相對關系呢?有了這一疑問,voxel-based的方法提出將點云分割為一個又一個規(guī)則的voxel,這樣,相鄰的點就會被歸類到同一個voxel中。然后簡單的取一個voxel中所有點的平均xyzrgb,用來指代這個voxel的特征。這種方法變相降低了計算復雜度,并且將點云中所有點的相對關系給確定了。之后,再用經典的CNN卷積即可實現點云的特征處理。
但是,我們也很容易能想到,簡單的將一些點歸類到一個voxel中并賦予其平均值作為特征,這就會導致一些重要的點被忽略,同時也會導致最終結果誤差增大。
而point-based的方法,則是保留了所有點的原始特征,直接對所有點進行處理,但是這里還是沒有提到解決點云無序的問題。在PointNet中,使用了Max-Pooling的方法來解決這一問題。這也很好理解,既然事先輸入的點集是無序的,而在空間中又是固定位置,那只需要進行Max-Pooling操作即可保留點云的相對位置信息。同時又可以將點的特征聚合起來,形成全局特征。
個人認為,這一思想類似于點云的sub-sampling。你對一個點云下采樣兩倍、四倍等等,它還是能保留一個人能直觀分辨的結果。只不過Max-Pooling是對特征進行處理,sub-sampling是對點進行處理。
2 PointNet結構
Point的模型圖也十分簡潔明了,幾個關鍵地方為input transform和feature transform中的T-Net、max pool、local和global feature的融合。
2.1 使用對稱函數來解決無序性問題
由于點云的數據是無序的,那么就得想讓模型來適應這個無序的數據或者讓數據變得“有序”。那么解決這一問題主要有三個方法
- 將點云中的點進行排序,使其成為一種規(guī)范的結構。
- 用一個RNN網絡來學習點云數據的“排列順序”。
- 使用對稱函數來匯總每一個點的信息。
對于第一個方法,排序或許是個簡單的方法。至少我們或多或少接觸過冒泡、歸并等等排序算法,但是,點云是三維空間中的數據結構,并不是簡單的一個數字比大小。在高維空間中,想要保證排出來順序是有序的,這是比較難辦到的事情。相當于將一個高維空間映射成一個射線,反過來,還得保證這條射線能夠還原這個高維空間,對于人類而言,貌似有點困難。即便排成功了,如果其中有個別點不穩(wěn)定,整個映射結構可能就會奔潰。
對于第二個方法,作為循環(huán)網絡,RNN對于序列數據的敏感度是遠強于CNN的。不過對于一個巨大的點云數據,動不動就是幾十萬的點集,一個小小的RNN可能難以獲得一個較好的魯棒性。當然,在文章的結尾,作者也比較了使用RNN的方法和PointNet的方法之間的效果差異。
不同于以上兩點,使用一個對稱函數來匯聚信息或許是一個更為高效簡潔的方法。這里的對稱函數可以理解為對輸入順序不敏感的操作。比如加、乘、池化pooling。
f ( { x 1 , … , x n } ) ≈ g ( h ( x 1 ) , … , h ( x n ) ) f\left(\left\{x_{1}, \ldots, x_{n}\right\}\right) \approx g\left(h\left(x_{1}\right), \ldots, h\left(x_{n}\right)\right) f({x1?,…,xn?})≈g(h(x1?),…,h(xn?))
其中 x 1 、 x 2 . . . x n x_{1}、x_{2}...x_{n} x1?、x2?...xn?為輸入的點, g g g則是一個對稱函數,在模型中就是Max-Pooling, h h h則是一個MLP。也就是通過MLP和MaxPooling來擬合函數 f f f。至少,在經驗上和實踐上,PointNet的這個方法是成功的。
在文章最后,作者設計實驗比較了幾種方法來解決點云無序性問題得到的accuracy結果。
通過對比RNN、LSTM的輸入時排序和對稱函數如Attention sum、Average pooling、MaxPooling的方法,結果證明Max Pooling效果是最好的。
注:表的上半部分為輸入時通過循環(huán)網絡排序,下半部分則是使用對稱函數進行信息聚合。
2.2 Local和Global的特征聚合
經過對稱函數MaxPooling輸出出來的特征為聚合了每個點信息的全局特征,形成了一個特征向量 [ f 1 , . . . , f k ] [f_1, ..., f_k] [f1?,...,fk?],在圖中也就是長度為1024的global feature向量。
對于分類任務而言,這個global feature已經足夠了,只需要再其后面添加一個簡單的SVM或者MLP即可完成點云分類的task。但是,對于分割而言,global feature是顯然不夠的,這一點在2D的圖像分割已經證明了(這也是Unet為什么好的原因)。因此,需要將Local和Global的Feature進行相應的融合。在這里,融合方式也十分簡單,只需將兩個特征進行連接操作(concat),然后將其輸入到MLP中反饋給每一個點,既可以根據這個合并好的特征從點云中提取新的特征。當完成這一步時,每一個特征中都會包含點云的局部和全局信息。這在2D語義分割中是比較常見和有效的操作。
2.3 特征對齊網絡
對于一個點云而言,我們可以將其看成一個剛體(也就是不會產生形變,無論怎么旋轉平移,它都會保留原始形狀)。那么,點云進行剛性變化(旋轉平移等),點云本身不變,其標簽自然也不變。因此,我們希望PointNet能夠學習到這種變換,或者說,希望PointNet能夠認出旋轉任意角度、平移任意距離的點云物體。
有一個簡單的方法就是,在輸入點云之前,事先將點云數據按照一定的規(guī)范,將點云旋轉、平移到相同的角度和位置。類似于對2D圖像進行一個resize到統(tǒng)一大小的操作。
在這里,我們還得先理解如何對點云數據進行剛性變化。其實十分簡單,對于3維的物體,我們想對其進行平移、旋轉,只需要相應乘上一個平移矩陣、旋轉矩陣即可。
在這里,作者通過一個T-Net來學習這種平移、旋轉關系,也就是說讓模型自己去擬合這個平移矩陣、旋轉矩陣。
同時,作者將這一思想拓展到了點云的特征空間,用同樣的方法對特征進行對齊,即feature transform??梢栽邳c特征上插入另一個對齊網絡,并預測一個特征變換矩陣來對齊來自不同輸入點云的特征。不過,特征空間的變換矩陣比空間變換矩陣的維度高得多,這大大增加了優(yōu)化的難度。因此,作者在訓練的損失計算中加入了一個正則化項,以此將特征轉換矩陣限制在接近正交矩陣的范圍內。
L r e g = ∥ I ? A A T ∥ F 2 L_{reg} = \parallel I-A A^T \parallel^{2}_F Lreg?=∥I?AAT∥F2?
其中, A A A就是T-Net學習到的變換矩陣。
3 總結
總結一下,PointNet為3D點云分割、分類開拓了一條新的道路,也就是Point-base的方法。從對體素voxel的處理轉為對點point進行直接處理,提高了效率,同時也獲得十分優(yōu)秀的效果。文章來源:http://www.zghlxwxcb.cn/news/detail-801897.html
PointNet中出彩的地方包括使用T-Net來學習點云的剛性變換、使用MaxPooling來解決點云輸入無序性的問題。文章來源地址http://www.zghlxwxcb.cn/news/detail-801897.html
到了這里,關于3D點云分割系列1:PointNet,從Voxel-base到Point-base的進階之路的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!