PointCleanNet是CVPR2019的一篇關於三維點雲去噪的文章。 本文是關於PointCleanNet原理的解讀,實驗部分可以參考原論文。

文章標題:PointCleanNet:Learning to Denoise and Remove Outliers from Dense Point Clouds

文章引用(GB/T7714):Rakotosaona M J, La Barbera V, Guerrero P, et al。 Pointcleannet: Learning to denoise and remove outliers from dense point clouds[C]//Computer Graphics Forum。 2020, 39(1): 185-203。

文章連結:

https://

arxiv。org/pdf/1901。0106

0。pdf

程式碼連結:

https://

github。com/mrakotosaon/

pointcleannet

程式碼是用

python2。7

和pytorch1。0寫的,筆者試了一下,

python3。6

也可以。

當然,國內使用者也可以透過百度網盤下載論文,程式碼和資料集,筆者已經上傳好了:

連結:

https://

pan。baidu。com/s/1Un3Zlh

sIpISwRL1tuVzboQ

提取碼:ptcn

點雲的採集和表示等背景知識不在本文討論範圍,讀者可自行查閱。

點雲的去噪問題

作者把造成

點雲噪聲

的原因歸結為兩種,離群點和噪聲點:

{\mathbb{P}}

變數解釋:

{\mathbb{P}}

噪聲點雲

,其中每個點是

p_i

{\mathbb{P}}

:真實(乾淨的)點雲,其中每個點是

p_i

{\mathbb{O}}

:離群點的集合,其中每個點是

o_j

n_i

:加在每個點

p_i

上的干擾,是一個與

p_i

同維度的向量; (用空心字體表達的變數是集合的意思)

因此去噪過程實際上是上述過程的

逆過程

三維點雲去噪網路PointCleanNet的講解

移除離群點(Outliers);

學習每個點的噪聲偏移向量,並據此把各個點移到合適的位置上。

如果用數學公式來表達整個去噪過程,就是下面的式子:

\tilde{\mathbb{P}}=\left \{{p_i}

變數解釋:

\tilde{\mathbb{P}}

:模型預測的點雲結果

\tilde{\mathbb{O}}

:模型預測出的離群點的集合

\mathbb{P}

:原始的噪聲點雲

\mathbb{P}

:移除離群點後的噪聲點雲,文中也被記作

\hat{\mathbb{P}}

d_i

:學習到的每個點的偏移向量

資料,模型和損失函式

本文中,去噪有兩個主要目標,模型設計和訓練的損失函式也由這兩個目標為基本遵循: 第一,點雲中所有點應該儘可能靠近物體的實際曲面; 第二,點雲在曲面上的分佈應該儘可能均勻。

關於每個點的去噪結果由誰決定

作者把點雲的去噪問題看作一個區域性的問題(local problem),作者認為,任意一點

p_i

的去噪結果

該點的區域性鄰域

\mathbb{P}_i

中的點,這個鄰域與

p_i

的歐式距離不超過

r

,實際上限定了一個以

p_i

為球心,以

r

為半徑的球體,調節

r

的大小,可以調節去噪的結果更依賴於區域性資訊還是

全域性資訊

。對於每個模型,都有一個由

點雲邊界

確定的立方體,在實踐中,這個

r

被確定為該立方體對角線長度的5%。

關於網路結構

正如文章開頭所說,本文的去噪任務被分解成了

移除離群點

學習偏移向量

兩個子任務,這兩個過程在文中都是使用神經網路實現的,而且它們的結構非常相似,都是基於PCPNet。

對於移除離群點,我們估計點

p_i

屬於離群點的機率,整個過程描述函式

g

\tilde{o}_i=g\left ( \mathbb{P}_i

變數解釋:

\mathbb{P}_i

p_i

r

鄰域中的點的集合;

\tilde{o}_i

p_i

屬於離群點的機率,文中以0。5為閾值確定。

得到了離群點,可以把它們從原始點雲中移除:

\hat{\mathbb{P}}=\mathbb{P}

變數解釋:

\tilde{\mathbb{O}}

:我們剛才所估計的離群點

\tilde{o}_i

組成的集合;

\mathbb{P}

:原始點雲;

\hat{\mathbb{P}}

:移除離群點後的點雲。

獲得了移除離群點後的點雲,我們就可以在此基礎上,對其中的每個點做

偏移量

的估計,用來對各個點的位置做修正。我們把每個點

p_i

估計偏移量的過程稱作函式

f

d_i=f\left(\hat{\mathbb{P}}_i\right)

變數解釋:

\hat{\mathbb{P}}

p_i

r

鄰域中移除離群點後的點雲;

d_i

:針對點

p_i

估計出的偏移量。

有了偏移量,我們透過一個簡單的相加操作就可以獲得最終針對每個點

p_i

(當然已經被當成離群點的點不算在其中)的估計結果:

\tilde{p_i}=\hat{p_i}+d_i

變數解釋:

\hat{p_i}

:移除離群點後的點雲中的點;

d_i

:針對點

p_i

估計出的偏移量;

\tilde{p_i}

:最終針對點

p_i

的預測結果,這些點的集合就是去噪處理完成後的點雲。

PointCleanNet的網路結構如下圖所示,它是由兩個PCPNet組成的,分別負責上述的兩個流程:

三維點雲去噪網路PointCleanNet的講解

點雲是一種特殊的資料,與影象不同,具有一些特殊的性質,能夠處理點雲的系統,需要具備下面幾個條件:

位姿穩定性

:點雲的位置和姿態不會影響系統的輸出,i。e。點雲平移或旋轉後輸入系統,系統輸出保持不變;

順序穩定性:點雲中各點的輸入順序不會影響系統的輸出,i。e。點雲順序被打亂後輸入系統,系統的輸出保持不變

如何讓神經網路能夠應對上面問題,成為能夠處理點雲資料的系統,PointNet以及PCPNet為我們提出了一些解決方案。作者把網路劃分為三個流程(兩個網路都是這樣):

第一,逐點的特徵提取模組

h\left(p\right)

。為了解決點雲的位姿穩定性問題,整個PCPNet在點雲輸入網路後,先加入了一個

四元空間

轉移網路(STN,Spatial Transformer Network),網路輸入點雲,輸出位姿變換(旋轉和平移)的引數,透過這個操作,將原始點雲遷移到一個新的有利於網路學習的位姿狀態,使用若干層全連線層或

一維卷積

提取逐點特徵並處理,當然,在輸出得到的特徵時,也對逐點的特徵向量做類似的逆變換,到達一個新的位姿。

第二,特徵融合模組。為了解決順序穩定性問題,網路在獲得處理完的逐點特徵向量後,在點的維度(類似於batchsize)上求和,這樣,就合併成為一個特徵向量,不論輸入點的順序如何,加法的

交換律

保證了合併後的特徵向量都是一樣的。數學的方式描述這一過程:

H\left(\mathbb{P}i\right)=\sum {p_j\in{\mathbb{P}_i}} {h\left(p_j\right)}

第三,迴歸模組。得到了融合後的結果,對融合的特徵向量使用若干全連線層或一維卷積層處理,獲得網路輸出的最終結果。

需要強調的是,網路的輸入是某一個點

p_i

r

鄰域中所有點。也稱為一個塊,輸出是針對點

p_i

的預測結果,對於移除離群點的任務(第一行藍色子圖),輸出為一個數值,對於預測偏移量的任務(第二行綠色子圖),網路的輸出就是一個三維向量。

對於估計偏移量的過程,模型的推理(inference)階段,單次推理得到的點雲可能存在

殘餘誤差

(Residual Error),這個誤差相比於輸入點雲的誤差當然小一個量級,為了達到更好的點雲去噪效果,作者使用迭代的方式,不僅僅做一次推理,而迭代的做多次,逐步的減小殘餘誤差。考慮到點雲每次迭代後的收縮現象,作者在每次迭代都對計算得到的偏移量做調整,公式為:

d_i

變數解釋:

d_i

:調整前的偏移量;

p_j

:點

p_i

鄰域

\mathbb{P}_i

中的各點;

d_j

:模型輸出的點

p_j

的偏移量;

d_i

:調整後的偏移量;

模型的訓練和損失函式

模型訓練過程中所使用的輸入資料是成對的給出的,即包含輸入噪聲點雲及其無噪聲點雲,使用點雲作為標籤的好處是,點雲相比於

曲面模型

更容易獲取。但是存在的問題是,網路輸出的點雲和

真值點雲

如何進行比較,並設計損失函式。

作者訓練去噪網路的損失函式主要包含兩部分。對於點

p_i

估計出的去噪後的點

\tilde{p_i}

,我們選擇它的一個鄰域

\mathbb{P}_{\tilde{p_i}}

,研究處在這個鄰域中的所有真值點

p_j

,尋找到與

p_i

的歐式距離最小的點,我們希望該點與估計點的距離儘可能小,獲得第一個損失函式:

L_s\left(\tilde{p_i},\mathbb{P}{\tilde{p_i}}\right)=\min{p_j\in \mathbb{P}{\tilde{p_i}}}{\left \| \tilde{p_i}-p_j\right \|}{2}^{2}

另外,為了使得預測出的點雲儘可能分佈均勻,我們還需要一個正則化項:

L_r\left(\tilde{p_i},\mathbb{P}{\tilde{p_i}}\right)=\max{p_j\in \mathbb{P}{\tilde{p_i}}}{\left \| \tilde{p_i}-p_j\right \|}{2}^{2}

這樣,整體的損失函式就是:

L_a=\alpha L_s+ \left(1-\alpha \right)L_r

作者在本文中設定

\alpha=0.99

關於PointCleanNet的網路結構和基本原理的講解就是這樣,關於實驗結果和視覺化效果,讀者可以在論文中詳細閱讀。後續如有必要,也可以在本文中更新。

筆者自知才疏學淺,難免疏漏與謬誤,若有高見,請不吝賜教,筆者將不勝感激!