3D Deep Learning 入門(二)- Deep learning on point cloud


Posted by Po-Jen on 2020-11-16

前言

繼上次的 3D Deep Learning 入門(一)- Deep learning on regular structures,今天要來講第二部分 - 如何對 3D point cloud 做 deep learning。

CVPR 2017 3D Deep Learning Tutorial

為何 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++

主要概念

  1. 想辦法做到 hierarchical learning,在過程中學到一些 local feature
  2. 想辦法處理 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 寫文章分享你的知識)。

延伸閱讀

  1. Github repo: 3D Machine Learning
  2. PointNet: Deep Learning on Point Sets for 3D Classification and Segmentation
  3. PointNet++: Deep Hierarchical Feature Learning on Point Sets in a Metric Space

#Self-Driving Car #Deep Learning #PointNet #3D Object Detection









Related Posts

【HTML & CSS】學習筆記 #01

【HTML & CSS】學習筆記 #01

Day 124

Day 124

建立屬於你的 Google Map 地圖標記(二) - 渲染自定參數的地圖元件

建立屬於你的 Google Map 地圖標記(二) - 渲染自定參數的地圖元件




Newsletter




Comments