前言
繼上次的 3D Deep Learning 入門(一)- Deep learning on regular structures,今天要來講第二部分 - 如何對 3D point cloud 做 deep learning。
為何 point cloud 重要?
因為 point cloud 很接近 sensor 吐出的 raw data,所以若能直接從 point cloud 中學到有用的資訊,就能達到 End-to-end 的學習(也就是直接拿 raw data 跟 ground truth,直接學習),不需要再額外做其他的轉換(例如上次介紹的 multi-view 方法,你還是得決定要從哪些角度拍、拍幾張、距離要多遠等等)。
PointNet - 一個能做 classification 跟 segmentatino 的 seminal work
今天的第一篇,就要來介紹 PointNet 這篇算是一個 milestone 的論文。他具有代表性的地方主要在於提出一個架構,可以直接從 point cloud 學習,而且這個架構稍加變化就可以做到多種 task - classification 跟 segmentation。
point cloud data 的難點 - orderless
Point cloud data 並沒有一個固定的順序,而且在空間中的密度分佈也很不均勻,所以在處理 point cloud data 跟有 regular structure 的 3D data 很不一樣。對於沒有順序這個特性,等於是你的 function(或說 neural net)要能對抗 N! 的 permutation 變化。
PointNet 解決此問題的直覺方法 - 想辦法逼近 symmetric function
因為 symmetric function 本身的特性就是不在乎 input variable 的順序,所以可以想辦法做出一個逼近 symmetric function 的架構。
於是產生出 PointNet 的基本架構:
這邊的 symmetric function 就是用 max pooling,但如果直接對所有點取 max,可想而知結果不會太好,所以他們前面多套了一層 MLP 來學習。
除了 orderless 問題外,point cloud 的 pose 也需要 align
為了避免 point cloud 的 pose 不同影響辨識結果,所以這邊用了額外的 T-Net 來 align point cloud 到同樣的 pose:
PointNet classification 架構
把上面提到的東西組合起來,就可以產生下面的架構啦:
稍微提醒一下,這邊的 classification 是假設輸入的 point cloud 都來自同一物體,所以最後直接取一個 global feature 來產生分類結果。
PointNet segmentation 架構
segmentation 因為會需要切出 point cloud 中間的 parts,所以這邊的做法是把 local features 跟 global features 接起來,再多用一個 function 來計算各 point 的 class。
結果
從結果上看得出來 PointNet 不輸 3D CNN 類型的方法,有些表現甚至還贏。
還有很多實驗結果我就不放了,這邊只放我覺得能夠對直觀理解有幫助的內容。
PointNet 的缺點
雖然 max pooling 解決了 N! permutation 問題,但 PointNet 直接從各個 point 學到 global feature,缺點就是少了局部的 feature:
這會造成 PointNet 很難 generalize 到各種 configuration(例如只要 input point cloud 沒有先做 mean normalization,結果就會不太好),於是作者們又提出了 PointNet++。
PointNet++
主要概念
- 想辦法做到 hierarchical learning,在過程中學到一些 local feature
- 想辦法處理 point cloud 分佈不均勻的問題
Hierarchical learning
首先,對於有 N 個點、每個點有 d+C 維的 vector data(d 是座標維度,以下圖來說 d == 2;C 則是其他的 feature 維度,例如 RGB、normal vector 等等),先 sample 一些點,並用 N1 個小球來分群(同一個球裡面的 point cloud 是同一群),開始有點 local group 的感覺:
這時再接上一個 PointNet,就能學習同一個 local group 裡面的 feature:
繼續擴展,就做到了 hierarchical learning:
這時跟 CNN 比較一下就能直觀理解兩者差別:
PointNet++ for classification
除了 hierarchical 的地方不同,取到 feature 之後的架構跟 PointNet 很像,我就不贅述了。
PointNet++ for segmentation
Density-invariant algorithm
而在處理 point cloud density 不均勻的問題上,作者們用的方法(MSG、MRG)基本上就是 multi-scale 的方法,這個方法從 SIFT 以來已經很常見,我就不贅述了。
結果
PointNet 的 hierarchical learning 能夠更完整的表示 point cloud 裡的 feature,所以分類結果比 PointNet 要好:
而在 density-invariant 方面,有使用 MSG 跟 MRG 的方法,對於 point cloud density 下降有更 robust 的表現:
從下圖中也可以看出,比起 PointNet,PointNet++ 的 generalizability 也進步了不少:
總結
今天延續了上次的筆記,介紹了 3D point cloud 的 deep learning 研究,其實演講中還有提到 3D point cloud synthesis 跟 Primitive-based shapes 的相關研究,不過個人比較沒有興趣,我就不寫啦哈哈,有興趣的話可以去看影片。
下一次就是最終回!之後陸續還會分享一些論文的讀後心得或實作,想入門並建立 3D deep learning 知識體系的讀者可以一起來參與(可以到 CoderBridge 寫文章分享你的知識)。