1. 程式人生 > 實用技巧 >RandLA-Net: Efficient Semantic Segmentation of Large-Scale Point Clouds翻譯和解讀

RandLA-Net: Efficient Semantic Segmentation of Large-Scale Point Clouds翻譯和解讀

RandLA-Net: 大場景下點雲的有效語義分割
本文是2020.5月份刊出的文章,發在2020CVPR

作者來自於牛津大學,中山大學,國防科大(https://www.shenlanxueyuan.com/open/course/53)。

論文解讀的參考之一https://cloud.tencent.com/developer/article/1694704

論文:https://arxiv.org/pdf/1911.11236.pdf

程式碼:https://github.com/QingyongHu/RandLA-Net

作者:Qingyong Hu
連結:https://zhuanlan.zhihu.com/p/105433460
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
先上效果圖:
1
2

亮點:

  • Local Feature Aggregation Module

Introduction

實現高效、準確的大場景三維點雲語義分割是當前三維場景理解、環境智慧感知的關鍵問題之一。然而,由於深度感測器直接獲取的原始點雲通常是非規則化 (irregular)、非結構化 (unstructure)並且無序 (orderless)的,目前廣泛使用的卷積神經網路並不能直接應用於這類資料。

【針對目前點雲分割存在速度慢、視訊記憶體需求大的問題,該文提出以一種高效率學習的方法。從論文的結果來看,該文不僅在計算時間和計算資源上大幅縮減,分割效果也是達到甚至超過了SOTA。

取樣

大規模點雲處理的一個挑戰在於如何快速且有效地進行取樣,從而加速應用所需的時間和計算資源。針對這個問題,本文的一個貢獻在於比對了現有方法的效率,結論是儘管最遠點取樣是最流行的作法,但是對於LiDAR資料,每一幀上萬個點需要處理,隨機取樣是最適合的,速度快並且performance也不錯。但是隨機取樣可能會丟失重要的點,所以作者提出Local Feature Aggregation。https://www.cnblogs.com/xiaoaoran/p/12342144.html

Motivation

自從2017年能夠直接在非規則點雲上進行處理的PointNet [1] 被提出以來,越來越多的研究者開始嘗試提出能夠直接處理非規則點雲的網路結構,出現了許多諸如PointNet++ [2], PointCNN [3], PointConv [4] 等一系列具有代表性的工作。儘管這些方法在三維目標識別和語義分割等任務上都取得了很好的效果,但大多數方法依然還侷限於在非常小(small-scale)的點雲上(e.g., PointNet, PointNet++, Pointconv等一系列方法在處理S3DIS資料集時都需要先將點雲切成一個個1m×1m的小點雲塊, 然後在每個點雲塊中取樣得到4096個點輸入網路)。這種預處理方式雖然說方便了後續的網路訓練和測試,但同時也存在著一定的問題。舉例來說,將整個場景切成非常小的點雲塊是否會損失整體的幾何結構

用一個個小點雲塊訓練出來的網路是否能夠有效地學習到空間中的幾何結構

作者:Qingyong Hu
連結:https://zhuanlan.zhihu.com/p/105433460
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

帶著這樣的疑問,我們對PointNet在S3DIS資料集Area 5上的分割結果進行了視覺化。如上圖highlight的區域所示,PointNet錯誤地將一張桌子的左半部分識別為桌子,而將右半部分識別為椅子。造成這樣明顯不一致結果的原因是什麼呢?可以看到,這張桌子在預處理切塊(左圖)的時候就已經被切分成幾個小的點雲塊,而後再分別不相關地地輸入到網路中。也就是說,在點雲目標幾何結構已經被切塊所破壞的前提下,網路是難以有效地學習到桌子的整體幾何結構的

既然切塊太小會導致整幾何結構被破壞,那我能不能把塊切大一點?這樣不就可以在一定程度上更好地保留原始點雲的資訊了嗎?

圖 2. PointNet和PointNet++在S3DIS Area5的對比實驗結果。S3DIS中的資料分別被切割為1m×1m到5m×5m的點雲塊,然後再輸入到網路中進行訓練和測試。

對此,我們也進一步設計了對比實驗,把切塊的尺寸從最初的1m×1m增加到5m×5m(每個block中的點數也相應地從4096增加至102400),得到的實驗結果如上圖所示,可以看到:

  • PointNet的mIoU結果出現了比較明顯效能上的下降。我們分析這主要是由於在PointNet框架中,每個點的特徵是由shared MLP提取的per-point feature(沒有學習點與點之間的互動,即沒有local geometry特徵)以及global max-pooling提取的global feature組成(點數越大,max-pooling丟掉的資訊越多,10萬個點的時候,其實大多數點的特徵都會被丟掉)。當輸入點雲的規模越來越大時,通過簡單的global max-pooling得到的全域性特徵能發揮的作用就越來越小,進而導致分割效能隨著block size增大而持續地下降
  • PointNet++的分割效能隨著block_size的增大有了一定提升,這是符合我們預期的(因為它注意到了點雲區域性集合特徵,i.e., local geometry)。然而,從右邊的時間變化曲線我們也可以進一步看到,網路inference的時間也隨著block_size增大而出現了顯著的增長,從最開始的每3s/百萬點增加到需要接近100s/百萬點(降取樣策略FPS造成的)。

上述實驗結果表明:簡單地增大block_size也並不能有效地解決這個問題。通過進一步分析我們發現,阻礙當前大多數方法直接處理大場景點雲的原因主要有以下三點:

  • 網路的降取樣策略。現有的大多數演算法採用的降取樣策略要麼計算代價比較昂貴,要麼記憶體佔用大。比如說,目前廣泛採用的最遠點取樣(farthest-point sampling)需要花費超過200秒的時間來將100萬個點組成的點雲降取樣到原始規模的10%。
  • 許多方法的特徵學習模組依賴於計算代價高的kernelisation或graph construction。
  • 現有大多數方法在提取特徵時感受野(receptive fields)比較有限,難以高效準確地學習到大場景點雲中複雜的幾何結構資訊

當然,最近也有一些工作已經開始嘗試去直接處理大規模點雲。比如說SPG用超圖(super graph)和超點(superpoints)來表徵大場景點雲,FCPN和PCT等方法結合了voxel和point的優勢來處理大規模點雲。儘管這些方法也達到了不錯的分割效果,但大多數方法的預處理計算量太大或記憶體佔用高,難以在實際應用中部署。

本文的目標是設計一種輕量級,計算效率高(computationally-efficient)、記憶體佔用少(memory-efficient)的網路結構,並且能夠直接處理大規模3D點雲,而不需要諸如voxelization/block partition/graph construction等預處理/後處理操作。然而,這個任務非常具有挑戰性,因為這種網路結構需要:

  • 一種記憶體和計算效率高的取樣方法,以實現對大規模點雲持續地降取樣,確保網路能夠適應當前GPU記憶體及計算能力的限制;
  • 一種有效的區域性特徵學習模組,通過逐步增加每個點的感受野的方式來學習和感知複雜的幾何空間結構。

基於這樣的目標,我們提出了一種基於簡單高效的隨機降取樣和區域性特徵聚合的網路結構(RandLA-Net)。該方法不僅在諸如Semantic3D和SemanticKITTI等大場景點雲分割資料集上取得了非常好的效果,並且具有非常高的效率(e.g. 比基於圖的方法SPG快了接近200倍)。 本文的主要貢獻包括以下三點:

  • 我們對現有的降取樣方法進行了分析和比較,認為隨機降取樣是一種適合大規模點雲高效學習的方法
  • 我們提出一種有效的區域性特徵聚合模組,通過逐步增加每個點的感受野來更好地學習和保留大場景點雲中複雜的幾何結構
  • RandLA-Net在多個大場景點雲的資料集上都展現出了非常好的效果以及非常優異的記憶體效率以及計算效率

我們研究了大場景下三維點雲的有效語義分割問題。依賴成本昂貴的取樣技術或計算量大的預處理/後處理步驟,大多數現有的方法只能在小尺度點雲上訓練和操作。本文中,我們引入了一種高效的輕量級的網路神經架構,直接推斷大規模場景下每點點雲的語義。我們的方法的關鍵是使用隨機點抽樣而不是更復雜點選擇方法。儘管計算和儲存效率高,隨機抽樣可能偶然地放棄關鍵特性。為了克服這個問題,我們引入了一種新的區域性特徵聚合模組,以逐步增加每個三維點的感受野,從而有效地保留幾何細節。廣泛的實驗表明,我們的RandLA-Net可以處理100萬個點,比現有的方法有高達200倍的速度。此外,我們的RandLA-Net在兩個大規模基準語義Semantic3D和KITTI上明顯優於最先進的語義分割方法。

大場景下有小的3維點雲語義分割對於實時智慧系統,例如自動駕駛和增強現實來說是一件基礎和必不可少的能力。挑戰之一是深度感測器獲取的原始點雲通常是不規則取樣,具有非結構化和無序的特點。儘管深度卷神經積網路在結構化的2維計算機視覺任務上有優秀的表現,但它們不能直接被用於這種非結構化資料。

最近,在直接處理3維點雲方面,PointNet網路做了開創性的工作,它是一種很有前景的方法。它使用共享的多層感知機學習每一個點的特徵,它計算效率高,但未能捕捉到每個點的更廣泛的上下文資訊

【上下文資訊------做影象的,上下文特徵是很常見的,其實上下文大概去理解就是影象中的每一個畫素點不可能是孤立的,一個畫素一定和周圍畫素是有一定的關係的,大量畫素的互相聯絡才產生了影象中的各種物體,所以上下文特徵就指畫素以及周邊畫素的某種聯絡。

具體到影象語義分割,一般論文會說我們的XXX演算法充分結合了上下文資訊,意思也就是在判斷某一個位置上的畫素屬於哪種類別的時候,不僅考察到該畫素的灰度值,還充分考慮和它臨近的畫素。

為了學習更加豐富的區域性結構特徵,許多專用的神經網路模組隨後被迅速引入。這些模組大體上分為: 1)鄰域特徵池化[44, 32, 21, 70, 69] 。 2)圖形資訊傳遞[57, 48, 55, 56, 5, 22, 34] 。 3)基於核的卷積[49, 20, 60, 29, 23, 24, 54, 38]。 4)基於注意力的聚合[61, 68, 66, 42] 。 雖然這些方法在物件識別和語義分割方面取得了令人印象深刻的結果,但幾乎所有這些方法都侷限於小場景的三維點雲(例如4k點或1×1m的塊),如果沒有塊劃分等預處理步驟,就不能直接擴充套件到較大的點雲(例如數百萬個點和最多200×200米的塊)。這種限制的原因有三個方面。 1)這些網路常用的點取樣方法要麼需要極大的算力,要麼記憶體效率低下。例如,廣泛使用的最遠點取樣[44]需要花費超過200秒取樣100萬個點中的10%。 2)大多數現有的區域性特徵學習者通常依賴於算力昂貴的核化或圖形構造,從而無法處理大量的點。 3)對於通常由數百個物件組成的大規模點雲,現有的區域性特徵學習者要麼無法捕獲複雜的結構特徵,要麼由於其有限大小的感受野而效率低下。   最近的一些工作出現了直接處理大規模點雲的任務。 在應用神經網路學習每個超點語義之前,SPG[26]將大點雲作為超圖進行預處理。 FCPN[45]和PCT[7]都結合體素化和點級別的網路來處理大規模點雲。 雖然它們具有良好的分割精度,但預處理和體素化步驟都需要消耗大的算力,無法部署在實時應用中。   在本文中,我們的目標是設計一個記憶體和計算效率高的神經網路結構,它能夠直接處理大規模的三維點雲,而不需要任何前/後處理步驟,如體素化,塊劃分或圖構建。 然而,這項任務是非常具有挑戰性的,因為它需要: 1)一種記憶體和計算效率高的取樣方法,逐步降低大規模點雲,以適應當前GPU的限制; 2)一種有效的區域性特徵學習者,以逐步增加感受野的大小,以保留複雜的原始幾何結構。為此,我們首先系統地證明了隨機抽樣是深層神經網路有效處理大規模點雲的關鍵手段。 然而,隨機抽樣可能丟棄關鍵資訊,特別是對於具有稀疏點的物件。 為了應對隨機抽樣的潛在有影響,我們提出了一種新的、高效的區域性特徵聚合模組,用於在越來越小的點集上捕獲複雜的區域性結構。   在現有的取樣方法中,最遠點取樣和逆密度取樣是小尺度點雲[44,60,33,70,15]中最常用的取樣方法。 由於點取樣是這些網路中的一個基本步驟,我們在第3.2節中研究了不同方法的相對優點,看到常用的取樣方法限制了向大規模點雲處理的過度,併成為實時處理的一個重要瓶頸。 然而,我們確定隨機抽樣是迄今為止最適合大規模點雲處理的元件,因為它快速,並且大規模點雲場景下仍然有效。隨機抽樣並不是沒有成本的,因為突出的點特徵可能會被偶然地丟棄,並且它不能在現有網路中直接使用而不招致效能下降。 為了克服這一問題,我們在3.3節中設計了一個新的區域性特徵聚合模組,它能夠通過逐步增加神經網路每層中的感受野大小來有效地學習複雜的區域性結構。特別是,對於每個三維點,我們首先引入一個區域性空間編碼(Locse)單元來顯式地保留區域性幾何結構。 其次,我們利用注意池來自動保持有用的區域性特性。 第三,我們將多個LOCSE單元和注意池疊加為一個擴張的剩餘塊,大大增加了每個點的有效感受野。 請注意,所有這些神經網路成分都是作為共享MLP實現的,因此具有顯著的記憶體和計算效率。   總的來說,基於簡單隨機抽樣和有效的區域性特徵聚合器的原理,我們的高效神經結構,名為randla-net,不僅比現有的大尺度點雲方法快200倍,而且在Semantic3d[17]和KITTI[3]基準上都超過了最先進的語義分割方法。 圖1顯示了我們的方法的定性結果。 我們的主要貢獻是:
  • 我們分析和比較了現有的抽樣方法,確定隨機抽樣是在大規模點雲上進行有效學習的最合適的組成部分。
  • 我們提出了一個有效的區域性特徵聚合模組,通過逐步增加每個點的感受野保留複雜的區域性結構。
  • 我們在基準資料集上展示了顯著的記憶體和計算增益,並在多個大規模基準上超越了最先進的語義分割方法。
2.相關工作 為了從三維點雲中提取特徵,傳統的方法通常依賴於手工製作的特徵[11,47,25,18]。 最近的基於學習的方法[16,43,37]主要包括基於投影的、基於體素的和基於點的方案,這裡概述了這些方案。 (1)基於投影和體素的網路。 為了利用2d CNN的成功,許多工作[30,8,63,27]將專案/平坦的3D點雲投影到2d影象上,以解決物件檢測的任務。 然而,幾何細節可能會在投影過程中丟失。 或者,點雲可以被體素化成三維網格,然後在[14,28,10,39,9]中應用強大的三維CNN。 雖然它們在語義分割和物件檢測方面取得了領先的結果,但它們的主要侷限性是計算量大,特別是在處理大規模點雲時。

(2)基於點的網路。受PointNet/ pointnet++[43,44]的啟發,許多最近的作品引入了複雜的神經模組來學習每個點的區域性特徵。
這些模組一般可分為:

1)鄰近特徵池[32、21、70、69],

2)圖資訊傳遞[57、48、55、56、5、22、34、31],

3)基於核的卷積[49、20、60、29、23、24、54、38],

4)基於注意力的聚合[61,68、66、42]。

雖然這些網路在小點雲上顯示了良好的效果,它們中的大多數都不能直接擴充套件到大型場景中。它們的計算和記憶體成本都很高。相比有了它們,我們提出的RandLA-Net在三種方法:

1)只依賴於樣本內部的隨機抽樣網路,因此需要更少的記憶體和計算;

2)提出的區域性特徵聚合器可以通過顯式考慮區域性空間關係和點特徵來獲得連續較大的感受域,從而更有效、更健壯地學習複雜的區域性模式;

3)整個網路只有共享的MLPs,不需要依賴任何昂貴的操作,比如graph構造和核化,因此對大規模點雲非常有效。

(3)大型點雲學習。 SPG[26]將大點雲預處理為超點圖,以學習每個超點語義。 最近的fcpn[45]和pct[7]應用基於體素和基於點的網路來處理大量的點雲。 然而,圖劃分和體素化在計算上都是昂貴的。 相比之下,我們的randla-net是端到端的可訓練的,不需要額外的預處理/後處理步驟。 3. RandLA-Net
3.1. Overview 如下圖所示,對於一個覆蓋數百米範圍、由百萬量級的點組成的大場景點雲而言,如果希望將其直接輸入到深度神經網路中進行處理,那麼持續有效地對點雲進行逐步地降取樣,同時儘可能地保留有用的幾何結構資訊是非常有必要的。
如圖2所示,給定一個大尺度的點雲,有數百萬個點跨越數百米,要用深度神經網路處理它,不可避免地需要在每個神經網路層中逐步有效地降取樣這些點,而不丟失有用的點特徵。 在我們的Randla-net中,我們建議使用簡單而快速的隨機抽樣(RS)方法來大大降低點密度,同時應用精心設計的區域性特徵聚合模組來保留突出的特徵。 這使得整個網路能夠在效率和有效性之間實現極好的權衡
【但Random Sampling的問題在於,本身大量的點就集中在離LiDAR近的區域,遠處的區域稀疏。通過sampling,由於是random的,比例是一樣的,那麼遠處的就更稀疏了,沒準那次就丟掉了邊緣的點。而FPS則是能夠最好的覆蓋整個區域,所以相比random sampling,FPS確實更適合語義分割這個問題。但本文追求的是快啊,那麼如何才能彌補RS這個缺點呢?那就是增大每個點的感受野,使得在sampling過後,保留下來的點有足夠大的感受野,能夠包含丟掉的點的資訊,即使是在遠處點很稀疏的情況下。來自:https://blog.csdn.net/wqwqqwqw1231/article/details/105604389

圖2. 在Randla-net的每一層中,大規模點雲被顯著的下采樣,但能夠保留精確語義分割所需的特徵。

3.2.尋求有效抽樣 為了尋找到一種高效的降取樣方法。我們首先對現有的的降取樣方法進行研究:主要可以分為Heuristic Sampling以及Learning-based Sampling兩大類: 現有的點抽樣方法[44,33,15,12,1,60]可以大致分為啟發式和基於學習的方法。 然而,仍然沒有適合大規模點雲的標準取樣策略。因此,我們分析和比較了它們的相對優點和複雜度,如下。 (1)啟發式取樣 作者:Qingyong Hu
連結:https://zhuanlan.zhihu.com/p/105433460
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

  • Farthest Point Sampling (FPS):顧名思義,也就是每次取樣的時候都選擇離之前取樣得到的 k-1個點距離最遠的點。FPS能夠比較好地保證取樣後的點具有較好的覆蓋率,因而在點雲分割領域被廣泛地使用(e.g., PointNet++, PointCNN, PointConv, PointWeb)。然而,FPS的計算複雜度是 ,計算量與輸入點雲的點數呈平方相關。這表明從FPS可能不適合用來處理大規模點雲。舉例來說,當輸入一個具有百萬量級點的大場景點雲時,使用FPS將其降取樣到原始規模的10%需要多達200秒。
  • Inverse Density Importance Sampling (IDIS): 這個也比較好理解,簡而言之就是根據每個點的密度來對其重新進行排序,儘可能地保留密度比較低的地方的點。IDIS [5] 的計算複雜度近似為 (取決於如何計算每個點的密度)。相比於FPS, IDIS顯然更加高效,但IDIS對噪點(outliers)也更加敏感
  • Random Sampling (RS): 隨機降取樣均勻地從輸入的 N 個點中選擇 K 個點,每個點具有相同的被選中的概率。RS的計算複雜度為 , 其計算量與輸入點雲的總點數無關,只與降取樣後的點數 K 有關,也即常數時間複雜度。因而具有非常高的效率以及良好的可擴充套件性。 與FPS和IDIS相比,RS僅需0.004s即可完成與FPS相同的降取樣任務。其最明顯的缺點是由於取樣是隨機的,所以可能會丟掉比較重要的關鍵點。
  • 最遠點取樣(FPS):為了從具有n個點的大規模點雲P中取樣k個點,FPS返回度量空的重新排序,使得每個PK都是距離前k−1個點的最遠點。 FPS廣泛應用於小點集的語義分割[44,33,60]。 雖然它對整個點集有很好的覆蓋範圍,但它的計算複雜度是o(N的平方)。 對於大規模點雲(n∼10的6次方),在單個GPU上處理FPS需要最多200秒。 這表明FPS不適合大規模點雲。
  • 逆密度重要性取樣(IDIS):從n個點取樣k個點,IDIS根據每個點的密度重新排序所有n個點,然後[15]選擇密度最大的前k個點。 其計算複雜度約為o(N)。 根據經驗,處理10的6次方個點需要10秒。 與FPS相比,IDIS更有效,但對異常值更敏感。 然而,在實時系統中使用仍然太慢。
  • 隨機抽樣(Rs):隨機抽樣從原始n個點中均勻地選擇k個點。 它的計算複雜度為o(1),它與輸入點的總數無關,即它是恆定的時間,因此具有內在的可伸縮性。 與FPS和IDIS相比,隨機取樣具有最高的計算效率,而不考慮輸入點雲的規模。 處理10的6次方個點只需0.004s。
2)基於學習的取樣
  • Generator-based Sampling (GS):與傳統降取樣方法不一樣,這類方法通過學習生成一個子集來近似表徵原始的點雲。GS [6,7] 是一種task-oriented, data-driven的learnable的降取樣方法,但問題在於inference階段需要將生成的子集與原始點雲進行匹配,這一步依賴於FPS matching,進而引入了更多額外的計算。使用GS將百萬量級點的大場景點雲降取樣到原始規模的10%需要多達1200秒。
  • Continuous Relaxation based Sampling (CRS): CRS [8,9] 使用reparameterization trick來將non-differentiable的降取樣操作鬆弛(relax)到連續域使得端到端訓練變成可能。CRS取樣後得到的每個取樣點其實都是整個點雲的一個加權和(weighted sum)。具體來說,對於一個大場景的輸入點雲(size: N×3),CRS通過學習得到一個取樣矩陣 (size: K×N) (最終會非常稀疏), 最後取樣矩陣左乘輸入點雲即可實現降取樣。然而,當N是一個非常大的值時(e.g. 10^6), 這種方式學習到的取樣矩陣會帶來非常大的記憶體消耗。舉例來說,使用CRS將百萬量級點的大場景點雲降取樣到原始規模的10%需要多達300GB的GPU記憶體。
  • Policy Gradient based Sampling (PGS): PGS [10] 將降取樣操作表示為一個馬爾科夫決策過程,旨在學習到一種有效的降取樣策略。該方法序貫地對每一個點學習到一個概率來決定是否保留。然而,當輸入是大場景點雲時,整個網路有著極大的搜尋空間(exploration space)。舉例來說,完成與上述取樣方法相同的任務的搜尋空間是 。通過進一步地實驗我們發現,將PGS應用到大型點雲時,網路非常難以收斂。

again:

  • 基於生成器的取樣(GS):GS[12]學習生成小點集來近似表示原始的大點集。 然而,FPS通常用於在推理階段將生成的子集與原始集合匹配,從而產生額外的計算。 在我們的實驗中,取樣100萬個點的10%需要1200秒。
  • 基於連續鬆弛的取樣(CRS):CRS方法[1,66]使用重新引數化技巧將取樣操作放寬到連續域進行端到端訓練。 特別是,每個取樣點都是基於對整點雲的加權和來學習的。 當用一次矩陣乘法同時取樣所有新點時,它會產生一個大的權重矩陣,從而導致負擔不起的記憶體成本。 例如,估計需要超過300GB的記憶體佔用來取樣100萬個點中的10%。

圖3. 本文所提出的本地特徵聚合模組。 頂部面板顯示了提取特徵的區域性空間編碼塊,以及基於本地上下文和幾何的加權最重要鄰域特徵的注意池機制。 底部面板顯示瞭如何將這些元件中的兩個連線在一起,在剩餘塊中增加感受野大小。【這個圖就是為了能夠彌補RS所提出來的區域性特徵聚合提取的方案,關鍵詞:多層疊加】

  • 基於策略梯度的抽樣(PGS):PGS將抽樣操作描述為馬爾可夫決策過程[62]。 它依次學習概率分佈來取樣點。 然而,當點雲較大時,由於勘探空間極大,所學概率具有較高的方差。 例如,對100萬個點中的10%進行取樣,勘探空間為,不太可能學習有效的取樣策略。 我們經驗性地發現,如果PGS用於大點雲,網路很難收斂。

對於大場景點雲,FPS, IDIS和GS的計算代價都比較高, CRS對GPU記憶體的要求太高,而PGS難以學到一個有效的取樣策略(sampling policy)。相比之下,隨機取樣具有以下兩個優點:1)計算效率高, 因為是常數計算複雜度, 與輸入點數無關 2)記憶體開銷少,取樣過程並不需要額外的記憶體消耗。因此,對於大場景點雲作為輸入的情況,我們何不嘗試下隨機降取樣呢?

但新的問題又來了:隨機地對點雲進行降取樣勢必會導致有用的資訊被丟失,如何克服這個問題?



作者:Qingyong Hu
連結:https://zhuanlan.zhihu.com/p/105433460
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

  

總的來說,FPS、IDIS和GS的計算成本太高,無法應用於大規模點雲。 CRS方法記憶體佔用過多,PGS很難學習。 相反,隨機抽樣具有以下兩個優點:

1)它具有顯著的計算效率,因為它與輸入點的總數無關。

2)它不需要額外的記憶體來計算。

因此,我們安全地得出結論,與所有現有的替代方案相比,隨機抽樣是處理大規模點雲的最合適的方法。 然而,隨機抽樣可能會導致許多有用的點特徵被刪除。 為了克服這一問題,我們提出了一個強大的區域性特徵聚合模組,如下一節所示。

3.3.區域性特徵聚合

為了緩解這個問題,我們進一步提出了與隨機取樣互補的區域性特徵聚合模組(Local feature aggregation)。 如圖所示,該模組主要包括三個子模組:1)區域性空間編碼(LocSE), 2) attentive pooling, 3)擴張殘差塊(dilated residual block)。 該部分能並行處理點,包含三個units:1) local spatial encoding (LocSE), 2) attentivepooling, and 3) dilated residual block.

作者:Qingyong Hu
連結:https://zhuanlan.zhihu.com/p/105433460
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

如圖3所示,我們的區域性特徵聚合模組並行應用於每個3D點,它由三個神經單元組成:

1)區域性空間編碼(Locse)

2)注意池化

3)擴張殘餘塊

(1)區域性空間編碼

對於每個取樣點,在原所有點雲中找其KNN個臨近點(歐氏距離);再將該點和臨近點以及他們之間的差concatenate並用MLP學習得到相對位置(公式1)每個取樣點得到相對位置後,將其和該點的特徵concate,得到該點的一系列最終的增強取樣點,組成一個向量。

此模組用於顯式地對輸入的點雲的三維座標資訊進行編碼。不同於直接將各個點的三維座標作為一個普通的通道特徵輸入到網路中,LocSE模組旨在顯式地去編碼三維點雲的空間幾何形狀資訊,從而使得網路能夠從各個點的相對位置以及距離資訊中更好地學習到空間的幾何結構。具體來說分為以下步驟:

  • 首先,我們用 最近鄰搜尋演算法為每一個點 找到歐氏空間中最近的個鄰域點
  • 對於 的個最近鄰點 , 我們顯式地對點的相對位置進行編碼,將中心點的三維座標 , 鄰域點的三維座標 , 相對座標 以及歐式距離 連線(concatenation)到一起。如下所示:

公式(1)

  • 最後我們將鄰域點 對應的點特徵 與編碼後的相對點位置 連線到一起,得到新的點特徵 。


作者:Qingyong Hu
連結:https://zhuanlan.zhihu.com/p/105433460
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

給定一個點雲P和每個點特徵(例如,原始的 RGB,或中間學到的特徵),這個區域性空間編碼單元顯式嵌入所有相鄰點的x-y-z座標,使對應的點特徵總是意識到它們的相對空間位置。這允許區域性空間編碼單元顯式地觀察區域性幾何樣式從而最終有利於整個網路有效地學習複雜的區域性結構。特別地,本單元包括以下步驟:

  • 找到鄰近的點。 對於第i點,它的相鄰點首先由(KNN)演算法收集以提高效率。 該KNN演算法是基於逐點歐氏距離的。
  • 相對點位置編碼。 對於距離中心點pi的最近k個最近點

我們顯式地編碼相對點位置如下:

其中pi和是點的x-y-z位置,⊕是級聯操作,|| . ||計算相鄰點和中心點之間的歐幾里德距離。 似乎是從冗餘點位置編碼的。 有趣的是,這往往有助於網路學習區域性特性,並在實踐中獲得良好的效能。

  • 點特徵增強。 對於每個鄰域點,編碼的相對點位置與其相應的點特徵連線,獲得 的增廣特徵向量。 最終,locse單元的輸出是一組新的相鄰特徵 ,它顯式地編碼中心點pi的區域性幾何結構。然而,在[36]中位置用於學習點的得分,而我們的LocSE顯式編碼要增加的相對位置相鄰的點特徵。

(2)注意力池化

用attention的方式取代max/mean pooling進行特徵融合

此模組用於將上述單元輸出的鄰域點特徵集聚合到一起。現有的大多數演算法通常採用啟發式的max/mean/sum pooling來hard integrate鄰域點特徵集,這樣做有可能導致許多有用的資訊被丟失。不同於此,我們希望通過attention mechanism來自動學習和聚合鄰域點特徵集中有用的資訊。具體來說,對於一個鄰域特徵點集合 ,我們首先設計一個共享函式 來為每一個點學習一個單獨的attention score,其中: 是共享MLP的可學習引數。然後,我們將學習到的attention score視作一個能夠自動選擇重要特徵的soft mask,最終得到的特徵是這些鄰域特徵點集的加權求和,如下所示:

作者:Qingyong Hu
連結:https://zhuanlan.zhihu.com/p/105433460
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

該神經單元用於聚合鄰近點特徵集。 現有的工作通常[44,33]使用max/mean池化來硬整合相鄰的特性,導致大多數資訊丟失。 相反,我們求助於強大的注意力機制來自動學習重要的區域性特徵。 特別是,在[65]的啟發下,我們注意力池化單元包括以下步驟。

  • 計算注意力分數。 給定一組區域性特徵

    ,我們設計了一個共享函式g()來學習每個特徵的唯一注意力分數。 基本上,函式g()由一個共享的MLP和Softmax組成。 它的正式定義如下:

其中w是共享MLP的可學習權重。

  • 加權求和。 學習的注意力分數可以看作是一個軟掩碼,它自動選擇重要的特徵。 在形式上,這些特徵被加權歸納如下:

總之,給定輸入點雲p,對於第一點pi,我們的locse和注意池單元學會聚合其k個最近點的幾何模式和特徵,並最終生成資訊豐富的特徵向量。

(3)擴張的殘塊 考慮到輸入的點雲會被持續大幅度的降取樣,因此顯著地增加每個點的感受野是非常有必要的。換句話來說也就是,我們希望即便RandLA-Net隨機地丟棄某些點的特徵,輸入點雲的整體的幾何細節也能夠被保留下來。基於這樣一個想法,我們將多個LocSE,Attentive Pooling以及skip connection連線在一起組成擴張殘差塊(Dilated Residual Block)。下圖進一步說明了擴充套件殘差塊的作用,可以看到: 紅色的點在第一次LocSE/Attentive Pooling操作後的有效感受野是與之相鄰的 個相鄰點,然後在第二次聚合以後最多能夠將感受野擴充套件到 個鄰域點。相比於直接增大K最近搜尋中的K值而言,這是一種更加廉價高效的方式來增大每個點的感受野以及促進鄰域點之間的feature propogation。通過後面的ablation實驗,我們的擴張殘差塊最終使用兩組LocSE和attentive pooling單元,以平衡最終的分割效能以及計算效率。 由於大規模點雲將被大幅度地降取樣,因此希望顯著增加每個點的感受野,使得輸入點雲的幾何細節更有可能被保留,即使有些點被丟棄。 如圖3所示,在成功的RESNET[19]和有效的擴充套件網路[13]的啟發下,我們使用跳躍連線將多個LOCSE和注意池單元疊加作為擴充套件的剩餘塊。 為了進一步說明我們膨脹的剩餘塊的能力,圖4顯示,紅色3D點在第一個LOCSE/注意池操作之後觀察到k個相鄰點,然後能夠從最多k的平方個相鄰點接收資訊。 即,它有兩個跳躍的鄰域(?)。 這是一種通過特徵傳播擴充套件感受野和擴充套件有效鄰域的廉價方法。 理論上,我們疊加的單位越多,這個塊就越強大,因為它的範圍越來越大。 然而,更多的單元不可避免地會犧牲整體計算效率。 此外,整個網路很可能被過度擬合。在我們的Randla-net中,我們簡單地將兩組LOCSE和注意池疊加為標準剩餘塊,在效率和有效性之間取得了令人滿意的平衡。

圖4. 放大的殘餘塊的插圖,它顯著增加了每個點的感受野(虛線圓),彩色點代表聚集的特徵。L:區域性空間編碼,a:注意力池化。

總的來說,我們的區域性特徵聚合模組旨在通過顯式考慮相鄰的幾何形狀和顯著增加的感受野來有效地保持複雜的區域性結構。 此外,該模組僅由前饋MLPs組成,因此計算效率高。

3.4.Implementation

我們通過疊加多個區域性特徵聚合模組和隨機取樣層來實現randla-net。 詳細的體系結構見附錄。 我們使用帶有預設引數的adam優化器。 初始學習率設定為0.01,每個世代後下降5%。 最鄰近點k的數目設定為16。為了並行訓練我們的Randla-net,我們從每個點雲中取樣固定數量的點(∼10的5次方)作為輸入。 在測試過程中,整個原始點雲被輸入到我們的網路中,以推斷每個點的語義,而不需要預/後處理,如幾何或塊劃分。 所有實驗都是在NVIDIA RTX2080ti GPU上進行的。

4.實驗

4.1.本節中隨機抽樣的效率,

我們對現有抽樣策略的效率進行了實證評估,主要從計算時間和GPU記憶體消耗兩個方面來考量包括FPS、IDIS、RS、GS、CRS和PGS,這些方法在第3.2節中已經討論過,我們進行了以下4組實驗

  • 組1. 給定一個小型點雲(∼10的3次方點),我們使用每一種抽樣方法來逐步向下抽樣。【仿照PointNet++的主體框架,我們持續地對點雲進行降取樣,總共五次降取樣,每次取樣僅保留原始點雲中25%的點】具體來說,點雲是向下取樣的通過五個步驟,每個步驟只保留25%的點,即四倍抽取比。這意味著只留下~(1/4)5(次方)×10^3個點(?)。該向下采樣策略模擬程式在pointnet++[44]中使用。

圖5. 不同取樣方法的時間和記憶體消耗。虛線表示估計值(由於有限的GPU記憶體)。

  • 2/3/4組。點雲總數增加,向大規模發展,即:10的4次方,10的5次方分和10的6次方分。我們使用相同的5個抽樣步驟(同組1)

分析

圖5比較了不同取樣方法下處理不同規模點雲總時間和記憶體的消耗量。可以看出:

1)對於小規模的點雲~10^3, 上述取樣方法在計算時間和記憶體消耗的差距並不明顯, 總體來說都是可接受的

2)對於大規模點雲~10^6, FPS/IDIS/GS所需要的計算時間顯著增加, 而CRS需要佔用大量的GPU記憶體(圖b虛線)。相比之下,隨機抽樣總體上具有更好的時間和儲存效率。這個結果清楚地證明了大多數現有深度學習網路[44,33,60,36,70,66]只能這樣處理和優化規模點雲,主要是因為他們依賴耗時耗算力的抽樣方法。受這個現象啟發,我們使用了有效的隨機抽樣策略RandLA-Net。

4.2. Efficiency of RandLA-Net

在本節中,我們系統地評估RandLA-Net用於現實世界大規模點雲上語義分割的整體效率。特別是,我們評估RandLA-Net上SemanticKITTI[3]資料集上的表現,評估我們的網路在08序列(序列8:一共4071幀)上的總耗時。我們也在相同的資料集上評估了近期代表作品的時間消耗[43, 44, 33, 26, 54]。公平起見,我們在每一幀中將相同數量的點(81920)輸入到baseline以及我們的RandLA-Net中。此外,我們還評估RandLA-Net和baseline的記憶體消耗。特別是,我們不僅報告每個網路的引數總數,還要測量每個網路在單次傳遞中可以作為輸入的最大3D點數量,以推斷逐點語義。注意,所有實驗都是在同樣的機器一個AMD 3700X @3.6GHz的CPU和一塊NVIDIA GPU RTX2080Ti顯示卡上。

表1. 不同方法在處理SemanticKITTI資料集的序列8的總時間、模型引數和最多可處理點數的對比

分析。表1定量地顯示了不同方法總時間和記憶體消耗。它可以可以看出,

1)SPG[26]網路引數最少,但處理時間最長點雲,這是由於幾何空間劃分和超圖構建等步驟的計算代價較高;

2) PointNet + +[44]和PointCNN[33]在計算上也很耗時主要是由於FPS的取樣操作在處理大規模點雲時比較耗時;

3) PointNet[43]和KPConv[54]無法一次性處理大規模數量的點雲(例如10的6次方點),主要原因是沒有降取樣操作(PointNet)或者模型較為複雜。

4)得益於簡單的隨機抽樣加上高效的MLP區域性特徵聚合模組,我們的RandLA-Net耗時最少(~23幀/秒),並且能夠一次性推斷高達10^6數量的點雲的逐點語義資訊。

4.3. Semantic Segmentation on Benchmarks

在這一節中,我們在三個大型公共資料集戶外Semantic3D[17]和SemanticKITTI[3],以及室內S3DIS[2]評估RandLA-Net的語義分割能力。
(1)對Semantic3D的評價。Semantic3D資料集[17]包括15個用於訓練的點雲和15個用於線上測試的點雲。每個點雲有包含多達1億個點,覆蓋在真實的三維空間中,可達160×240×30米。原始的三維點共有8類,包含三維座標,RGB資訊和強度。我們只使用3D座標和顏色資訊來訓練和測試我們的RandLANet。所有類別的平均交併比(mIoU)和整體準確度(OA)被用作標準度量。為了公平比較,我們只包括最近發表的強的基準測試的結果[4,52,53,46,69,56,26]以及目前最先進的方法KPConv[54]。

表2. 不同方法用於Semantic3D (reduced-8)[17]的定量結果。只比較了最近發表的方法。於2020年3月31日訪問。

表2給出了不同方法的定量結果。RandLA-Net明顯優於所有現有的方法採用mIoU和OA。值得注意的是,RandLANet在8個類中的6個類上也取得了卓越的效能,除了低植被和掃描藝術。

表3. 不同方法對SemanticKITTI[3]的定量結果。只比較最近發表的方法和所有的分數均從線上單次掃描評估軌跡中獲得。於2020年3月31日訪問。

圖6. RandLA-Net對SemanticKITTI[3]驗證集的定性結果。紅色圓圈表示失敗的案例

(2)對SemanticKITTI的評價。SemanticKITTI [3]由屬於21個序列的43552個密集註釋的鐳射雷達掃描組成。每次掃描都是一個大規模的點雲在三維空間中,空間跨度為約105點,長度為160×160×20米。正式來說,序列00 ~ 07和和序列09 ~ 10(19130幀)作為訓練集,序列08(4071幀)作為驗證集,序列11 ~ 21(20351幀)用於線上測試。原始的3D點只有座標資訊,沒有顏色資訊。10個類別的平均交併比得分被用作度量標準。

表3顯示了我們的RandLANet與兩類最近的方法的定量比較,即1)基於點的方法[43,26,494,44,51]和2)基於投影的方法方法[58,59,3,40],圖6顯示了RandLA-Net在驗證分割上的一些定性結果。它可以可以看到,我們的RandLA-Net遠超過所有基於點的方法[43,26,49,44,51]。我們也優於所有基於投影的方法[58,59,3,40],但這種優勢不是很明顯,主要是因為RangeNet++[40]實現對小物件分類有更好的結果,如交通標誌。然而,我們的RandLA-Net比RangeNet++[40]少40倍的網路引數,而且計算效率更高,因為它不需要算力較高的前/後投影的步驟。

(3)對S3DIS的評價。S3DIS資料集[2]由6個大區域的271個房間組成。每一個點雲是一箇中型的單人房間(∼20×15×5米)密集的三維點。為了評估我們的RandLA-Net的語義分割,我們使用標準的6-fold交叉驗證。IoU (mIoU)的均值等級精度(mAcc)和總體精度(OA)總共13個類進行比較。如表4所示,我們的RandLA-Net達到了平均水平或者比最先進的方法效能更好。請注意大多數基準[44,33,70,69,57,6]趨向於使用複雜但昂貴的操作或取樣優化小塊點雲(如1×1米),相對較小的房間被分成小塊。相比之下,RandLA-Net將整個房間作為輸入,並且能夠在一次傳遞中有效地推斷每點語義。

表4. 不同方法在S3DIS資料集上的定量的結果[2](6-fold交叉驗證)。只有最近出版的方法被包括在內。

4.4. 消融研究(Ablation study)
由於充分研究了隨機抽樣的影響第4.1節,我們對我們的本地特性聚合模組進行了以下消融研究。所有消融網路對序列00 ~ 07和09 ~ 10進行訓練,並在資料集[3]的序列08上測試。(1)去除區域性空間編碼(LocSE)。這個單元使每個3D點可以顯式地觀察其區域性幾何。刪除locSE後,我們直接輸入local將特性點到後續的注意力池中。

(2 ~ 4)用max/mean/sum替換注意池。注意池單元學習自動結合所有的區域性點特徵。相比之下,廣泛使用的max/mean/sum 池化傾向於硬選擇或結合特徵,因此它們的效能可能不是最優的。

(5)對膨脹殘塊進行簡化。膨脹的殘餘塊堆積了多個LocSE單元和注意池,大大地膨脹了接收野每個3d點。通過簡化這個塊,我們只使用了一個LocSE單元和注意池,也就是說,在我們的原始RandLA-Net我們不連線多個塊。表5比較了所有消融網路的mIoU得分。由此,我們可以看出:

1)受到影響最大的移除空間嵌入鏈和注意池模組。圖4中突出顯示瞭如何使用兩個連結的區塊從一個更廣泛的鄰域來傳播資訊,也就是大約K的平方個點而不是k個點。對於隨機抽樣尤其重要,因為隨機抽樣不能保證保留一組特定的點。

2)刪除的區域性空間編碼單元對效能的影響次之,說明該模組對於有效學習區域性和相對幾何上下文是必要的。

3)去除注意力模組,不能有效保留有用的特徵,這會降低效能。從這個消融研究,我們可以看到提出的神經單元如何的進行互補,以達到我們的最高水平效能

註解:

  • 從(1)中可以看到,去掉LocSE,也就是單純使用Attention的方式並不是很有效。
  • 從(2)-(4)可以看出Attention的效果也是有的,比單純的pooling好
  • 從(5)可以看出擴充套件感受野的必要性

表5所示. 基於我們的完整的RandLA-Net,所有消融網路的平均IoU分數

5. 結論
在本文中,通過使用輕量級網路架構,我們證明了高效和有效地分割大規模點雲是可能的。與此形成鮮明對比的是對於大多數依賴於算力計算代價高的抽樣策略的方法,我們在我們的系統中使用隨機抽樣框架大大減少了記憶體佔用計算成本。區域性特性聚合模組可以有效地儲存來自鄰域的有用特徵(持續地增大每個點的有效感受野,以確保大多數有效資訊不會因為隨機取樣而丟失)。大量的實驗顯示了我們的方法的高效率和最先進的表現。利用最新的工作[64]把我們的工作擴充套件到用於研究大規模點雲上端到端的3D例項分割,以及用於點雲的實時動態處理上面將是一件很有趣的事情。

最後總結一下,我們提出了一種針對大規模三維點雲場景的輕量級、高效點雲語義分割演算法,與當前的大多數基於FPS等計算代價高的取樣策略的演算法不同,本文嘗試使用簡單高效的隨機取樣來顯著地減少計算量以及記憶體消耗,並且引入了局部特徵聚合模組持續地增大每個點有效的感受野,以確保大多數有效的資訊不會因為隨機取樣而丟失。在Semantic3D,S3DIS以及SemanticKITTI等多個數據集上的大量實驗證明了我們的方法的有效性。下一步可以嘗試將我們的工作延申到大場景三維點雲實例分割以及實時動態點雲處理。

最後放一下我們的demo:

demo(見作者知乎專欄)

最後的話

  • 對於三維點雲語義分割任務而言,與其在被切割的點雲上提出非常複雜的演算法來提升效能,不如直接嘗試在大場景點雲上進行處理,這樣更加有實際意義。
  • 三維點雲分割網路的scalability也是實際應用中一個比較重要的點。i.e., 理想情況下train好的網路應該可以用於inference任意點數的輸入點雲,因為每個時刻採集到的點雲的點數不一定是相同的。這也是RandLA-Net沒有使用全域性特徵的原因,i.e. 確保學到的引數是agnostic to number of points.
  • 順便打一波廣告,對於剛剛進入三維點雲處理領域的同學,有一份最新的綜述論文(Deep Learning for 3D Point Clouds: A Survey)可供參考,內含大量主流的點雲目標分類,三維目標檢測,三位場景分割演算法的最新研究進展及總結。

歡迎大家關注我們的更多新工作:



作者:Qingyong Hu
連結:https://zhuanlan.zhihu.com/p/105433460
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

鳴謝:本研究部分由中國留學基金委獎學金資助。

郭玉蘭是由國家自然科學基金資助。
國家自然科學基金(第61972435號)廣東省(2019A1515011271),深圳科技及創新委員會

我的思考【https://blog.csdn.net/wqwqqwqw1231/article/details/105604389

我看的語義分割這方面的論文不多,目前大多針對點雲處理的backbone的方法都會做語義分割的實驗,基本都是使用FPS。所以本文使用RS能做到SOTA的效果證明,只要特徵能提取的有效,則FPS不是必須的。

Dilated Residual Block其實和PointNet++中的SA相比有以下不同:
1)LocSE中使用的kNN,這也就保證了稀疏的地方仍然能夠找到臨近點提取特徵,而SA中用的是一定半徑內的球形鄰域,這就在稀疏的地方就不是很好使了。
2)在Ablation Studies證明了的Attention操作是優於pooling的,這個操作將臨近點之間的特徵聯絡起來,而不是單單max pooling了。
3)Dilated Residual Block的串聯結構有效的增大了感受野,SA中並聯的MSG結構則提取multi-scale的特徵。

我認為可以試一下做一下將RS改為FPS的實驗,看看最終效果漲不漲,來證明FPS是否確實是在效果上可以被RS替代。

附錄
A.抽樣評價的細節。
我們在4.1節中提供了不同抽樣方法的實施細節。從擁有N個點(或者點特徵)的大規模點雲P中抽樣K個點(或者點特徵):
1. 最遠點抽樣(FPS):我們遵循pointnet++[44]提供的實現,它也是廣泛應用於[33,60,36,6,70]。特別是FPS作為一個執行在GPU上的運算子進行實現。
2. 逆密度重要抽樣(IDIS):給定點pi,通過計算點pi和它的鄰域t個點之間的距離之和去近似計算它的密度ρ。正式:

式中,表示鄰域點的集中第j個點的座標。引數t被設定為16。所有的點根據所有點的逆密度1/ρ排序。最後,選擇最前面的K個點。

3.隨機抽樣(RS):我們使用python numpy包實現隨機抽樣。具體來說,我們首先使用numpy函式umpy.random.choice()生成K個索引。然後我們利用這些點的索引收集相應的空間座標和每個點的特徵。
4. 基於生成器的取樣(GS):遵循[12]提供的程式碼去實現。我們先訓練ProgressiveNet[12],目的是根據他們和任務的相關性把原始點雲轉變為有序點集。之後前K個點被保留,剩下的點被丟棄。
5. 連續鬆弛取樣(CRS)
通過自主gumbel-softmax抽樣[1][66]去實現。給定一個點特徵集p∈RN×(d+3),每個點包含三維座標和點特徵,我們首先通過MLP層引數化的分數函式估計一個概率分數向量s∈RN,即s = softmax(MLP(P)),它學習a分類分佈。然後,伴隨著Gumbel噪聲g∈RN從Gumbel(0;1)分佈。計算每個取樣點特徵向量y∈Rd+3:

其中s(i)和g(i)分別表示向量s和g中的第i個元素,P (i)表示矩陣P中第i行輸入向量。是退火溫度。當它趨近於0的時候,方程5趨於離散分佈,並依據概率p(y = p(i)) = s(i)對P中的每一行向量進行取樣。

6. 基於策略梯度的取樣:給定一個帶有三維座標的點特徵集p∈RN×(d+3)和每個點特徵,我們首先通過MLP函式為每個點特徵預測一個分數s,即s =softmax (MLP (P)) +  ξ  ξ是0均值高斯噪聲,帶有隨機方差Σ。在這之後,我們根據前K個得分值對P中的K個向量取樣。抽樣每個點/向量可以被看作是一個獨立的行為,它們的一個序列形成了一個馬爾可夫序列決策過程(MDP),有以下政策函式:

ai是點集P中是否取樣第i個向量的二值決策,θ為多層感知機的網路引數。因此,為了合理地改進取樣策略,使取樣過程具有一定的可擴充套件,我們應用加強演算法[50]作為梯度估計。分割精度R被當作整個取樣過程中的獎勵值J = R。使用下面的估計梯度進行優化:

其中M為批大小,bc和b(P (i))為緩解政策梯度高方差問題的兩個控制變數[41]。

圖7. 我們的RandLA-Net的詳細架構。(N;D)分別表示點數和特徵維數。FC:全連通層,LFA:區域性特徵聚集,RS:隨機抽樣,MLP:共享多層感知器,US:上取樣,DP:隨機丟棄

B.網路架構細節
圖7顯示了RandLANet的詳細架構,整個網路就是由區域性特徵聚合模組堆疊而成的。

最後,我們將隨機取樣以及區域性特徵聚合模組組合到一起,基於標準的encoder-decoder結構組建了RandLA-Net。網路的詳細結構如下圖所示,可以看到,輸入的點雲在RandLA-Net中持續地進行降取樣以節約計算資源及記憶體開銷。此外,RandLA-Net中的所有模組都由簡單高效的feed-forward MLP組成,因此具有非常高的計算效率。最後,在解碼器中的上取樣階段,不同於廣泛採用的三線性插值(trilinear interpolation),我們選擇了更加高效的最近鄰插值(nearest interpolation),進一步提升了演算法的效率】

網路遵循廣泛使用具有跳躍連線的編碼器-解碼器架構。輸入點雲首先喂到一個共享的MLP層,以提取每個點的特徵。四個編碼和解碼層然後用於學習每個點的特性。最後,三層全連線並使用dropout層對語義標籤進行預測每一個點。各部分詳情如下:

網路輸入:輸入為大規模點雲,尺寸為N×din時,批維度會降低(為簡單起見),其中N為點的個數,din為每個輸入點的特徵維數。對於這兩個S3DIS[2]和Semantic3D[17]資料集,每個點為由其三維座標和顏色資訊表示(即x-y-z-R-G-B),而SemanticKITTI的每個點[3]資料集僅由3D座標表示。
編碼層:我們使用了四個編碼層網路的大小逐步減小點雲的規模和增加每個點的特徵維度。每個編碼層由一個區域性特徵聚合模組(3.3節)和一個隨機抽樣組成操作(3.2節)。點雲以四倍抽取率向下取樣。特別是,每一層之後只有25%的點特徵被保留後,即(N->N/4->N/16->N/64->N/256)。同時,每一層的點特徵維數逐漸增大以儲存更多的資訊,即(8->32->128->256->512)

解碼層:上述編碼層之後,使用了4層解碼層。對於每一層解碼層,我們首先使用KNN演算法為每一個查詢點找到一個最近的鄰域點,點特徵集通過最近鄰插值向上取樣。接下來,上取樣的特徵圖與編碼層產生的中間特徵圖通過跳躍連線被合併,然後將共享的MLP應用於剛剛合併的特徵圖

最終語義預測:每個點的最終語義標籤是通過三個共享的全連線層獲得的(N, 64)->(N, 32)->(N, nclass)和隨機丟棄層。丟棄率為0.5。

網路輸出:RandLA-Net的輸出為所有點的預測語義,大小為N×nclass,其中nclass是類的數量。

C. 在LocSE網路上的消融研究

在3.3節中,我們對相對點位置進行編碼由下式可知:

在此框架中,我們進一步研究了不同空間資訊的影響。特別是,我們進行
以下是更多關於LocSE的消融實驗:
•1)只對點pi的座標進行編碼。
•2)只對相鄰點pik的座標進行編碼。
•3)對點pi的座標和它的鄰域點pik進行編碼。
•4)對點pi的座標和它的鄰域點pik,以及歐氏距離IIpi−pik||進行編碼。
•5)對點pi和相鄰點pik的座標,以及pi和相鄰點pik的相對位置pi - pik進行編碼。
表6比較了所有消融網路在SemanticKITTI資料集上的交併比得分。我們可以看到

1)明確編碼所有空間資訊有最好的mIoU交併比表現。

2)相對位置pi - pik在這一成分中起重要作用因為相對點的位置使網路能夠注意到區域性幾何特徵。

3)僅對點位置pi或pik進行編碼不太可能改進效能,因為相對位置沒有顯式編碼。

表6. 不同空間資訊編碼下RandLa-Net的交併比結果

D. 對擴張的殘餘塊進一步消融研究
在我們的RandLA-Net中,我們堆疊了兩個LocSE和專注池化單元作為標準的擴大剩餘塊,使感受野逐漸增大。為了進一步評估聚集單元的數量對影響整個網路的影響,我們做了以下兩組實驗。
•1)我們簡化了膨脹的剩餘塊,只使用一個LocSE單元和注意池。
•2)我們增加了一個本地單元和注意池,也就是說,有三個聚合單元連結在一起。

表7. 在殘餘塊中使用不同數量的組合單元RandLA-Net的交併比得分

表7顯示了在SemanticKITTI[3]資料集上驗證分割的不同消融網路平均交併比得分。可以看出:

1)中只有一個聚集單元由於感受野的限制,擴張的殘塊導致分割效能顯著下降。

2)每個塊的三個聚合單元沒有提高按預期的準確性。這是因為感受野的顯著增加和大量的可訓練引數往往會過度擬合。

E.注意力得分視覺化
為了更好地理解助理解注意池化,使習得注意力得分視覺化。然而,由於注意池操作在一個相對較小的區域性點集上(即K=16),在如此小的區域性區域內很難識別有意義的點集形狀。所以,我們將方程2中定義的學習注意力權重矩陣W視覺化。如圖8所示,注意權重在第一個編碼層中有較大的值,則在隨後的層中逐漸變得光滑且穩定。
這說明注意池在開始時傾向於選擇突出的或關鍵的特徵。點雲被顯著地向下取樣之後,注意池層傾向於保留這些點特徵中的大多數特徵。

圖8。學習到的注意力矩陣在不同層的視覺化。從左上至右下:16×16注意力矩陣,64×64注意力矩陣,128×128注意力矩陣,256×256注意力矩陣。黃色代表高的注意力得分。

F.關於Semantic3D的附加結果
更多的RandLA-Net對Semantic3D[17]資料集分割(reducated -8)的定性結果如圖9所示。
G. 關於SemanticKITTI的附加結果

圖10顯示了我們的RandLANet對SemanticKITTI[3]驗證集的更多定性結果。紅色的盒子展示了失敗的案例。可以看出,屬於其他車輛的點很容易被誤分類為car,主要是由於沒有顏色的部分點雲很難從兩個相似的類中區分出來。此外,我們的方法趨向於在自行車、摩托車、自行車手和摩托車手類別上失敗,由於資料集中極度的不平衡點分佈。例如,植被的點雲比摩托車手點雲南的多7000倍。

圖9。RandLA-Net對Semantic3D的reduced-8分割的定性結果。從左到右:全RGB彩色點雲,全點雲的預測語義標籤,彩色點雲的詳細檢視,預測語義標籤的詳細檢視。請注意,測試集的語義標籤不是公開的

H. S3DIS附加結果
我們在8中報告了RandLA-Net在S3DIS[2]資料集上詳細的六倍交叉驗證結果。圖11顯示了我們的方法有更多的定性結果。

I.視訊說明

我們提供一個視訊來顯示RandLA-Net在室內和室外資料集上定性的結果,可以在https://www.youtube.com/watch?v=Ar3eY_lwzMk&t=9s. 檢視

圖10. RandLA-Net對SemanticKITTI[3]驗證分割的定性結果。紅色框顯示失敗案例.

表8所示。不同方法在S3DIS[2]的定量結果(6-fold交叉驗證)。總體精度(OA, %),平均類別精(mAcc, %)、平均交併比(mIoU, %)和每個類別的交併比(%)。

圖11。在S3DIS中,我們的RandLA-Net對S3DIS區域1-6的完整點雲的語義分割結果。左:全RGB輸入雲;中間:預測標籤;右:真實標籤。



(4) SemanticKITTI部分的程式碼閱讀:

git clone --depth=1 https://github.com/QingyongHu/RandLA-Net && cd RandLA-Net

程式碼克隆。

conda create -n randlanet python=3.5
source activate randlanet
pip install -r helper_requirements.txt
sh compile_op.sh

conda建立深度學習的環境:

#利用conda建立一個新環境,同時指定該壞境中python的版本
conda create -n myenv python=3.5
-n應該是new的意思
source activate randlanet

啟用、關閉環境

source activate envname、source deactivate 已經過時。

pip install -r helper_requirements.txt
安裝helper_requirements.txt內容中的所有包
sh compile_op.sh

sh是一個shell,執行sh a.sh,表示我使用sh來解釋這個指令碼。

表示在本地編譯C++程式碼。

二、專案結構

整個專案檔案非常簡潔。

檔案作用
helper_tf_util.py 封裝了一些卷積池化操作程式碼
helper_tool.py 有訓練時各個資料集所用到的一些引數資訊,還有一些預處理資料時的一些模組。
main_*.py 訓練對應資料的主檔案
RandLANet.py 定義網路的主題結構
tester_*.py 測試對應資料的檔案,該檔案在main_*.py中被呼叫
utils 改資料夾裡面有對資料集預處理的模組以及KNN模組。

表來自:https://blog.csdn.net/qq_43058685/article/details/105089579

data_prepare_semantickitti.py檔案的執行:

helper_tool.py檔案裡面:

from open3d import linux as open3d

改成:

import open3d

import cpp_wrappers.cpp_subsampling.grid_subsampling as cpp_subsampling
import nearest_neighbors.lib.python.nearest_neighbors as nearest_neighbors

改成:

import utils.cpp_wrappers.cpp_subsampling.grid_subsampling as cpp_subsampling
import utils.nearest_neighbors.lib.python.nearest_neighbors as nearest_neighbors

如果還是不能執行,就在RandLA-Net資料夾下開啟終端,執行:

sh compile_op.sh

sematic-kitti.yaml檔案顯示了semantic資料集的基本情況:

# This file is covered by the LICENSE file in the root of this project.
labels: 
  0 : "unlabeled"    #未標記
  1 : "outlier" #噪聲點
  10: "car"      #小汽車
  11: "bicycle"   #自行車
  13: "bus"     #公共汽車
  15: "motorcycle"  #摩托車
  16: "on-rails"    #在軌電車
  18: "truck"    #卡車
  20: "other-vehicle"   #其它機動車輛
  30: "person"    #行人
  31: "bicyclist"    #騎自行車的人
  32: "motorcyclist"   #騎摩托車的人
  40: "road"    #道路
  44: "parking"   #停車區域
  48: "sidewalk"   #人行道
  49: "other-ground"   #其它路面
  50: "building"   #建築物
  51: "fence"    #籬笆
  52: "other-structure"   #其它結構物
  60: "lane-marking"   #車道標線
  70: "vegetation"  #植被
  71: "trunk"   #樹幹
  72: "terrain"   #遠離城鎮、有田野、樹林和農場的地區
  80: "pole"   #桿狀物
  81: "traffic-sign"   #交通標誌
  99: "other-object"   #其它物體
  252: "moving-car"   #移動的小汽車
  253: "moving-bicyclist"   #移動的騎車人
  254: "moving-person"   #移動的人
  255: "moving-motorcyclist"   #移動的摩托車騎行者
  256: "moving-on-rails"   #在軌道上移動的物體
  257: "moving-bus"   #移動的公共汽車
  258: "moving-truck"   #移動的卡車
  259: "moving-other-vehicle"   其它移動的激動車輛
color_map: # bgr   顏色圖,指的是每個類別的物體的著色
  0 : [0, 0, 0]
  1 : [0, 0, 255]
  10: [245, 150, 100]
  11: [245, 230, 100]
  13: [250, 80, 100]
  15: [150, 60, 30]
  16: [255, 0, 0]
  18: [180, 30, 80]
  20: [255, 0, 0]
  30: [30, 30, 255]
  31: [200, 40, 255]
  32: [90, 30, 150]
  40: [255, 0, 255]
  44: [255, 150, 255]
  48: [75, 0, 75]
  49: [75, 0, 175]
  50: [0, 200, 255]
  51: [50, 120, 255]
  52: [0, 150, 255]
  60: [170, 255, 150]
  70: [0, 175, 0]
  71: [0, 60, 135]
  72: [80, 240, 150]
  80: [150, 240, 255]
  81: [0, 0, 255]
  99: [255, 255, 50]
  252: [245, 150, 100]
  256: [255, 0, 0]
  253: [200, 40, 255]
  254: [30, 30, 255]
  255: [90, 30, 150]
  257: [250, 80, 100]
  258: [180, 30, 80]
  259: [255, 0, 0]
content: # as a ratio with the total number of points   各個類別的物體的佔比
  0: 0.018889854628292943
  1: 0.0002937197336781505
  10: 0.040818519255974316
  11: 0.00016609538710764618
  13: 2.7879693665067774e-05
  15: 0.00039838616015114444
  16: 0.0
  18: 0.0020633612104619787
  20: 0.0016218197275284021
  30: 0.00017698551338515307
  31: 1.1065903904919655e-08
  32: 5.532951952459828e-09
  40: 0.1987493871255525
  44: 0.014717169549888214
  48: 0.14392298360372
  49: 0.0039048553037472045
  50: 0.1326861944777486
  51: 0.0723592229456223
  52: 0.002395131480328884
  60: 4.7084144280367186e-05
  70: 0.26681502148037506
  71: 0.006035012012626033
  72: 0.07814222006271769
  80: 0.002855498193863172
  81: 0.0006155958086189918
  99: 0.009923127583046915
  252: 0.001789309418528068
  253: 0.00012709999297008662
  254: 0.00016059776092534436
  255: 3.745553104802113e-05
  256: 0.0
  257: 0.00011351574470342043
  258: 0.00010157861367183268
  259: 4.3840131989471124e-05
# classes that are indistinguishable from single scan or inconsistent in
# ground truth are mapped to their closest equivalent

#通過一幀掃描中無法區分的類或與真實類別不一致的類對映到它們最接近的等價類
learning_map: #對映圖 0 : 0 # "unlabeled" 1 : 0 # "outlier" mapped to "unlabeled" ----------異常點對映到無標籤類----------------mapped 10: 1 # "car" 11: 2 # "bicycle" 13: 5 # "bus" mapped to "other-vehicle" ------公共汽車對映到其它機動車輛--------------------mapped 15: 3 # "motorcycle" 16: 5 # "on-rails" mapped to "other-vehicle" ---有軌電車對映到其它機動車輛------------------mapped 18: 4 # "truck" 20: 5 # "other-vehicle" 30: 6 # "person" 31: 7 # "bicyclist" 32: 8 # "motorcyclist" 40: 9 # "road" 44: 10 # "parking" 48: 11 # "sidewalk" 49: 12 # "other-ground" 50: 13 # "building" 51: 14 # "fence" 52: 0 # "other-structure" mapped to "unlabeled" ----其它結構物對映到無標籤類別--------------mapped 60: 9 # "lane-marking" to "road" -------車道標線對映到道路--------------------------mapped 70: 15 # "vegetation" 71: 16 # "trunk" 72: 17 # "terrain" 80: 18 # "pole" 81: 19 # "traffic-sign" 99: 0 # "other-object" to "unlabeled" -----其它物體對映到無標籤類別-----------------------mapped 252: 1 # "moving-car" to "car" -----移動的小汽車對映到小汽車類-------------------------------mapped 253: 7 # "moving-bicyclist" to "bicyclist" ----移動的自行車騎行者對映到自行車騎行者--------------------mapped 254: 6 # "moving-person" to "person" -----移動的人對映到人-------------------------mapped 255: 8 # "moving-motorcyclist" to "motorcyclist" ---移動的摩托車騎行者對映到摩托車騎行者---------------mapped 256: 5 # "moving-on-rails" mapped to "other-vehicle" ---電車軌道上移動的物體對映到其它車輛-----------mapped 257: 5 # "moving-bus" mapped to "other-vehicle" ----移動的公共汽車對映到其它車輛---------------mapped 258: 4 # "moving-truck" to "truck" ----移動的卡車對映到卡車----------------------------mapped 259: 5 # "moving-other"-vehicle to "other-vehicle" ----其它移動車輛對映到其它車輛------------mapped learning_map_inv: # inverse of previous map 0: 0 # "unlabeled", and others ignored 1: 10 # "car" 2: 11 # "bicycle" 3: 15 # "motorcycle" 4: 18 # "truck" 5: 20 # "other-vehicle" 6: 30 # "person" 7: 31 # "bicyclist" 8: 32 # "motorcyclist" 9: 40 # "road" 10: 44 # "parking" 11: 48 # "sidewalk" 12: 49 # "other-ground" 13: 50 # "building" 14: 51 # "fence" 15: 70 # "vegetation" 16: 71 # "trunk" 17: 72 # "terrain" 18: 80 # "pole" 19: 81 # "traffic-sign" learning_ignore: # Ignore classes 0: True # "unlabeled", and others ignored 1: False # "car" 2: False # "bicycle" 3: False # "motorcycle" 4: False # "truck" 5: False # "other-vehicle" 6: False # "person" 7: False # "bicyclist" 8: False # "motorcyclist" 9: False # "road" 10: False # "parking" 11: False # "sidewalk" 12: False # "other-ground" 13: False # "building" 14: False # "fence" 15: False # "vegetation" 16: False # "trunk" 17: False # "terrain" 18: False # "pole" 19: False # "traffic-sign" split: # sequence numbers 訓練、驗證與測試的分割情況 train: - 00 - 01 - 02 - 03 - 04 - 05 - 06 - 07 - 09 - 10 valid: - 08 test: - 11 - 12 - 13 - 14 - 15 - 16 - 17 - 18 - 19 - 20 - 21

沒看出來那個learning_map是什麼意思(?),哪位高手能告知一下?

dataset_path = '/data/semantic_kitti/dataset/sequences'
output_path = '/data/semantic_kitti/dataset/sequences' + '_' + str(grid_size)

改成:

dataset_path = 'sequences的全路徑'
output_path = '真實路徑'

sequences--00包含004541個掃描場景。

對000000.bin視覺化:

利用程式碼中的變數points和labels將點雲座標檔案000000.bin和對應標籤檔案000000.label存到一起並可視化:

pointsandlabels=np.hstack((points,labels.reshape(labels.shape[0],1)))
filename=r'/media/dell/D/qcc/RandLA-Net/data/semantic_kitti/dataset/sequences_saveastxtfile_Qin/00/000000.txt'
np.savetxt(filename, pointsandlabels, fmt="%.8f,%.8f,%.8f,%d", delimiter=',')

得到檔案(共124668個點,約12萬左右個點):

利用下面這兩句視覺化000081.bin:

scan_id='000001.bin'
points = DP.load_pc_kitti(join(pc_path, scan_id))
labels = DP.load_label_kitti(join(label_path, str(scan_id[:-4]) + '.label'), remap_lut)

scan_id='000000.bin'
points = DP.load_pc_kitti(join(pc_path, scan_id))
labels = DP.load_label_kitti(join(label_path, str(scan_id[:-4]) + '.label'), remap_lut)
pointsandlabels=np.hstack((points,labels.reshape(labels.shape[0],1)))
filename=r'/media/dell/D/qcc/RandLA-Net/data/semantic_kitti/dataset/sequences_saveastxtfile_Qin/00/000000.xyz'
np.savetxt(filename, pointsandlabels, fmt="%.8f %.8f %.8f %d", delimiter=',')

結果:

視覺化004540.bin:

這些檔案的的點雲尺寸都大約一致,應該是實際場景中切割出來後再經過座標轉換的點雲。點雲場景長約160m,寬約107m,高約13~25m。

x的座標的範圍是大約-70m~80m,y的座標範圍約為-50~50m, z的座標範圍大約為-15~5m.

對點雲進行降取樣:

sub_points, sub_labels = DP.grid_sub_sampling(points, labels=labels, grid_size=grid_size)

以sequences00裡面的000018.xyz為例,降取樣的效果如下圖:

data_prepare_semantickitti.py第54行:

proj_inds = np.squeeze(search_tree.query(points, return_distance=False))

意思是:對構建的取樣子集建立k_d搜尋樹,然後查詢原點集中每個點的k個最鄰近子集點,預設K=1.查詢範圍是取樣點

函式:query(self, X, k=1, return_distance=True, dualtree=False, breadth_first=False)

函式作用:在(k_d搜尋)樹中查詢k個最近鄰。

引數:X:陣列,是查詢參考點,或者說中心點。

k: 要返回的最鄰近點的數量,預設是1

return_distance : boolean (default = True)
if True, return a tuple (d, i) of distances and indices
if False, return array i

Returns
-------
i : if return_distance == False
(d,i) : if return_distance == True

d : array of doubles - shape: x.shape[:-1] + (k,)
each entry gives the list of distances to the
neighbors of the corresponding point

i : array of integers - shape: x.shape[:-1] + (k,)
each entry gives the list of indices of
neighbors of the corresponding point

Examples
--------
Query for neighbors in a given radius

>>> import numpy as np
>>> np.random.seed(0)
>>> X = np.random.random((10, 3)) # 10 points in 3 dimensions
>>> tree = BinaryTree(X, leaf_size=2) # doctest: +SKIP
>>> print(tree.query_radius(X[0], r=0.3, count_only=True))
3
>>> ind = tree.query_radius(X[0], r=0.3) # doctest: +SKIP
>>> print(ind) # indices of neighbors within distance 0.3
[3 0 1](相當於一個3維座標)

proj_inds = np.squeeze(search_tree.query(points, return_distance=False))

返回的索引是取樣點集的索引值,因為最小索引值是0,最大索引值是88108(以sequences08中的000000.bin點雲檔案為例),而取樣點個數正是88109個。所以,應該是針對初始點雲中的每一個點在降取樣點雲中尋找最鄰近點。

對sequences00~10(訓練集,08除外)進行隨機取樣,並:

  • 儲存隨機取樣的點雲座標和標籤[到資料夾[velodyne][labels]]
  • 對隨機取樣點雲構建k_d樹,並儲存[到資料夾[KDTree]]

其中sequences08(驗證集)用來驗證,並:

  • 儲存隨機取樣的點雲座標和標籤[到資料夾[velodyne][labels]]
  • 對隨機取樣點雲構建k_d樹,並儲存[到資料夾KDTree]
  • 儲存初始點雲(00xxxx.bin)從取樣點中找到的k個鄰近點索引[到資料夾proj]

對測試集sequences11~21:

  • 儲存隨機取樣的點雲座標[到資料夾velodyne],不儲存對應標籤。
  • 對隨機取樣點雲構建k_d樹,並儲存[到資料夾KDTree]
  • 儲存初始點雲(00xxxx.bin)從取樣點中找到的k個鄰近點索引[到資料夾proj]