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