pytorch 三维点分类_三维点云分类与分割-PointNet
PointNet是對點云數據直接進行學習的開山之作, 這里結合PointNet-Pytorch代碼,對PointNet網絡結構與其思想進行闡述和分析。
點云數據的特性:
點云數據不同于圖像數據,他有三個重要的特征,也正是基于這些特征,才有PointNet網絡的一系列的設計。
1)點云的無序性
這個要對比圖像數據來理解,一團點云數據中有很多個點數據,這些點在點云文件里無論以什么順序出現,它們指代的信息并不改變。相反,一張圖片里的點在圖像里已經按照固有的順序排列好了。論文里利用了maxpooling這個對稱函數來提取點云的數據特征。
2)點與點之間的空間關系
每個點都包含了空間坐標信息,這些信息之間構成一定的集合空間關系,為了利用這種關系,論文作者提出了將局部特征和全局特征進行串聯的方式來聚合信息。
3)不變性
這樣理解,一團點云數據進行旋轉和平移,它代表的目標不會發生改變。論文在進行特征提取之前,先對點云數據進行對齊來保證不變性。 通過訓練一個小型的網絡得到一個旋轉矩陣,用這個矩陣與點云數據相乘來實現對齊操作。
數據集
以論文里用到的數據集是shapenet, 包含了16類樣本,以其中的一類Airplane的文件夾來說明,里面有很多.pts格式的文件,這就是不同飛機的點云格式,里面放的就是一個個坐標點,坐標經過了歸一化處理。
在讀取數據的dataloader里,對每個數據進行了中心化和隨機增強,而且在輸入網絡前對樣本進行了特定數量的重采樣,這樣保證了輸入到網絡里的樣本的點數是一樣的。
網絡結構及其實現
1)對于一維卷積conv1d
假設對所有的樣本進行了2500個點的重采樣,樣本的尺寸為2500*3,由于pytorch卷積的要求,輸入前進行轉置,變成3*2500,假定batch_size = 1, 輸入尺寸就是1*3*2500,
假設做的第一步卷積操作是conv1 = torch.nn.Conv1d(3, 64, 1),即輸入通道=3,輸出通道=64,卷積核大的大小為1(在tensorflow里為1x3, 用conv2d實現,本質上是一樣的),卷積核第二個維度是由in_channels來決定的,所以實際上卷積大小為in_channels*kerner_size,這里為3*1。
進一步理解一下,在第一個卷積層中,使用conv1對x進行卷積的時候,實際上是使用64個3*1的卷積核進行卷積,輸出尺寸應該是1*64*2500,其中1還是batch size。
畫了個草圖來解釋這個卷積過程點云數據一維卷積過程
在了解了一維卷積之后,網絡就變得很簡單了。對于分類問題,如果把batch size記為n,樣本在網絡中的變化就是n*3*2500 ——> n*64*2500 ——> n*128*2500 ——> n*1024*2500 ——> n*1024*1(max pooling后) ——> n*512*1 ——> n*256*1 ——> n*16*1 (本次實驗樣本共有16類)
再來看網絡結構:
mlp是通過共享權重的卷積實現的,第一層卷積核大小是1x3(因為每個點的維度是xyz),之后的每一層卷積核大小都是1x1。特征提取層只是把每個點連接起來而已。經過兩個空間變換網絡和兩個mlp之后,對每一個點提取1024維特征,經過maxpool變成1x1024的全局特征。再經過一個mlp(代碼中運用全連接)得到k個score。分類網絡最后接的loss是softmax。
本文的兩個亮點:
1.空間變換網絡解決旋轉問題:
三維的STN可以通過學習點云本身的位姿信息學習到一個最有利于網絡進行分類或分割的DxD旋轉矩陣(D代表特征維度,pointnet中D采用3和64)。其中的原理為,通過控制最后的loss來對變換矩陣進行調整,pointnet并不關心最后真正做了什么變換,只要有利于最后的結果都可以。
pointnet采用了兩次STN,第一次input transform是對空間中點云進行調整,直觀上理解是旋轉出一個更有利于分類或分割的角度,比如把物體轉到正面;第二次feature transform是對提取出的64維特征進行對齊,即在特征層面對點云進行變換。
2.maxpooling解決無序性問題:
當一個N×D在N的維度上隨意的打亂之后,其表述的其實是同一個物體。因此針對點云的置換不變性(無序性),其設計的網絡必須是一個對稱的函數:
我們經常看到的SUM和MAX等函數其實都是對稱函數
因此我們可以利用max函數設計一個很簡單的點云網絡,如下:
那么為什么要最后變換到1024維后再做MAX操作呢,這是因為在3維上,輸出的全局特征僅僅繼承了三個坐標軸上最大的那個特征,每個點損失的特征太多了,因此我們不妨先將點云上的每一個點映射到一個高維的空間(例如1024維),目的是使得再次做MAX操作,損失的信息不會那么多。
分割網絡:
對于點云分割任務,我們需要將局部很全局信息結合起來。
這里,作者將經過特征變換后的信息稱作局部信息,它們是與每一個點緊密相關的;我們將局部信息和全局信息簡單地連接起來,就得到用于分割的全部信息。
總結
以上是生活随笔為你收集整理的pytorch 三维点分类_三维点云分类与分割-PointNet的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 8位数控分频器的设计_8位数控分频器
- 下一篇: realmeq参数配置详情_realme