這篇部落格會介紹點雲的基本知識,重點介紹最近兩年發表的部分經典論文,有什麼建議歡迎留言!
點雲基本介紹
點雲是某個座標系下的點的資料集,包含了豐富的資訊,可以是三維座標X,Y,Z、顏色、強度值、時間等等。下面兩張圖分別展示了點雲在三維空間視覺化以後的效果和資料格式。點雲的資料獲取方式有很多種,比較常見的是三維鐳射掃描器進行資料採集,它有三大類:
- 星載(星載LiDAR採用衛星平臺,執行軌道高、觀測視野廣,基本可以測量到地球的每一個角落,為三維控制點和數字高程模型的獲取提供了新的途徑,有些星載鐳射雷達還具有觀察整個天體的能力)
- 機載:機載主要藉助無人機(UAV/UAS)進行大規模的點雲資料採集。
- 地面分為三小種:地上三維鐳射掃描、車載MMS、手持鐳射掃描。
兔子形狀的點雲
三維點雲的資料示例
從上面的資料示例可以看出,點雲本質上是一長串點(Nx3矩陣,其中n是點數),這帶來兩個問題。第一,在幾何上,點的順序不影響它在空間中對整體形狀的表示,例如,相同的點雲可以由兩個完全不同的矩陣表示,如下圖所示。我們希望不論點雲順序怎樣,模型可以從中得到相同的特徵。第二,點雲在空間中經過剛性變換後,如旋轉或者平移,點雲的座標會變。有時我們為了方便對點雲做處理(如分類等),需要將其旋轉到正面或者側面(做旋轉),此時,模型得到的點雲資料(N*3矩陣)將會完全不同。我們希望點雲做變換之後不會影響模型的結果。
傳統的點雲處理方式包括兩大類:
- 將點雲資料投影到二維平面。此種方式不直接處理三維的點雲資料,而是先將點雲投影到某些特定視角再處理,如前視視角和鳥瞰視角。同時,也可以融合使用來自相機的影象資訊。通過將這些不同視角的資料相結合,來實現點雲資料的認知任務。比較典型的演算法有MV3D和AVOD。
- 將點雲資料劃分到有空間依賴關係的體素(voxel)。此種方式通過分割三維空間,引入空間依賴關係到點雲資料中,再使用3D卷積等方式來進行處理。這種方法的精度依賴於三維空間的分割細膩度,而且3D卷積的運算複雜度也較高。
接下來我們會介紹從17年至今比較經典的關於點雲的論文,包括PointNet,PointNet++,GeoNet,Kd-Net、SO-Net以及做資料上取樣的PU-Net。
PointNet
此處是PointNet的位置
PointNet++
此處是PointNet++的位置
GeoNet
- 論文名 GeoNet: Deep Geodesic Networks for Point Cloud Analysis
- 作者 Tong He,Haibin Huang,Li Yi等
GeoNet是一種基於測地距離的點雲分析深度網路,發表在2019年的CVPR上。論文貢獻包括兩個:開發了一種資料表示以及提出瞭如何將其運用到下游任務中的方法。為了方便理解論文內容,我們首先來介紹一下測地距離這個概念。
測地距離
我們先從點雲的研究任務說起。點雲的形狀分析是點雲的重要任務之一,主要包括三個方面的特徵,集合特徵、統計特徵和拓撲特徵。集合特徵主要有法向量、曲率等,統計特徵主要包括模型頂點間的集合關係、頂點的曲率分佈等,拓撲特徵主要有突出的特徵點、臨界點、骨架、Reeb圖等,其中骨架是對點雲主要特徵的一種視覺化描述,符合人類的視覺特徵。
從目前已有的工作來看,拓撲特徵是點雲的重要特徵之一,對點雲的分類、簡化、檢索等研究有重要的作用。尋找提取點雲拓撲特徵的簡單、有效、快速的方法對點雲的形狀分析與理解具有重要的意義,測地線就是其中的一種。
測地線是連線曲面上給定的兩點之間的最短路徑,測地線的長度就是這兩點之間的測地距離。根據計算結果的精確性,三維模型的測地距離的計算方法可以分為兩大類:精確的方法和近似的方法。可以看做是圖論上計算兩個點之間的最短路徑的計算方法,採用dijkstra等。
GeoNet計算測地距離
GeoNet其實就是利用網路來計算測地距離。我們假設\(\chi = \{ x_{i} \}\)表示點雲,每個點的維度為3 。那麼我們可以為點\(x_{i}\)定義它的鄰居節點為\(B_{r}(x_{i})=\{ x_{j}|d_{E}(x_{i},x_{j}) \le r\}\) 。其中\(d_{E}(x_{i},x_{j})\)表示兩個節點之間的歐式距離。也就是說將\(x_{i}\)為球心,半徑為r內的節點劃為它的鄰居節點。這是GeoNet關於鄰域的定義。基於此我們繼續定義\(G_{r}(x_{i})=\{ g_{i,j}=d_{G}(x_{i},x_{j})|x_{j} \in B_{r}(x_{i}) \}\),其中\(d_{G}表示測地距離\),即\(G_{r}(x_{i})\)表示 \(x_{i}\)到鄰域內每個點的測地距離的集合。GeoNet的目標是利用神經網路擬合對映關係:\(f:x_{i} \to G_{r}(x_{i})\),它的網路結構如下圖所示。
如圖所示,GeoNet由兩個模組組成:特徵提取模組以及測量匹配模組。其中特徵提取模組利用PointNet++提取點雲的區域性特徵,再將其輸入解碼器,同時還將原始的點雲輸入解碼器(skip connection),這樣解碼器可以對點雲的區域性特徵和總體特徵做處理。測量匹配模組利用特徵抽取模組得到的特徵向量為每個節點計算其鄰域測地距離。但該模組的目的並不是計算出準確的測地距離,而是在模型不斷擬合測地距離的過程中,其引數矩陣會隱含的提取出一些特徵。(筆者私以為,GeoNet的作用就是進行特徵提取,在訓練模型計算測地距離的過程中,模型的引數包含了點雲的一些特徵)
論文中還詳細介紹了GeoNet如何與下游任務:分類、分割等做融合,並給出了示例。
Kd-Net
- 論文名 Escape from Cells: Deep Kd-Networks for the Recognition of 3D Point Cloud Models
- 作者
Kd-Net是一種基於Kd-tree的網路,我們先對Kd-tree加以介紹。
Kd-tree
KD樹是從二叉搜尋樹發展來的,是一種高維索引樹形資料結構,常用於大規模高維資料密集的查詢比對的使用場景中,主要是最近鄰查詢以及近似最近鄰查詢,在CV中主要是影象檢索和識別的高維特徵向量的查詢和比對。
我們舉例講述如何構建一個三維的KD樹。我們可以在第一層選擇用節點的第一維資料作為分類依據,第二層用第二維資料,第三層用第三維資料,第四層用第一維資料,以此類推。用圖中的資料來說明:
- 根節點為(3,1,4),分類依據為3。
- 拿到第二個資料(2,3,7),先與根節點(3,1,4)比較,第一層節點的分類維度為一,(2,3,7)的第一維資料小於根節點的第一維資料,所以下一步與根節點的左節點做比較,發現左節點為空,將(2,3,7)放在左節點。
拿到第三個資料(2,1,3),先與根節點(3,1,4)比較,第一層節點的分類維度為一,(2,1,3)的第一維資料小於根節點的第一維資料,所以下一步與根節點的左節點做比較。左節點為(2,3,7),第二層節點的分類維度為二,(2,1,3)的第二維資料比(2,3,7)的第二維資料小,下一步與其左節點作比較。左節點為空,將(2,1,3)插入該點。
KD樹構建過程
二維KD樹的表示方法利用Kd_tree構建Kd-net
瞭解瞭如何構建Kd-tree後,我們來看如何根據點雲構建Kd-tree進一步組成Kd-net。
下圖左邊是建好的Kd-tree,編號為8-15的是8個資料點。可以看到紫色的是第一次切割,藍色和紅色是第二層,綠色和橙色(或紅色?)是第三層。該示意圖用二維展示了三維點雲的kd-tree,在三維空間中,切割的方向是x,y,z軸。為了將點雲向量化,作者先用預訓練好的資料將葉子節點(8、9、12、13、14、15)向量化,然後根據公式逐層向上計算每個節點的向量表示,直到所有的節點都被向量化。
圖中的右半部分是Kd-net的結構圖,其中灰色的條表示網路的節點,中間的圓圈是網路的引數,第一層是所有資料點的向量表示。網路經過一次前向傳播得到一個特徵向量,即圖中標號為1的節點,該節點提取了所有資料的特徵。標號為1的特徵向量經過一個全連線層得到節點0,即分類結果。其中,相同顏色的圓圈表示網路中的共享引數。節點之間共享引數的條件為:在Kd-tree中是同一層,且分割的方向都相同。可以看到節點8、9、12、13、14、15在同一層且分割的方向都相同:平行於y軸。
kd-tree和kd-net
kd-tree向量化公式
持續更新...