三維點雲去噪網路PointCleanNet的講解
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
點雲的採集和表示等背景知識不在本文討論範圍,讀者可自行查閱。
點雲的去噪問題
作者把造成
點雲噪聲
的原因歸結為兩種,離群點和噪聲點:
變數解釋:
:
噪聲點雲
,其中每個點是
:真實(乾淨的)點雲,其中每個點是
:離群點的集合,其中每個點是
:加在每個點
上的干擾,是一個與
同維度的向量; (用空心字體表達的變數是集合的意思)
因此去噪過程實際上是上述過程的
逆過程
。
移除離群點(Outliers);
學習每個點的噪聲偏移向量,並據此把各個點移到合適的位置上。
如果用數學公式來表達整個去噪過程,就是下面的式子:
變數解釋:
:模型預測的點雲結果
:模型預測出的離群點的集合
:原始的噪聲點雲
:移除離群點後的噪聲點雲,文中也被記作
:學習到的每個點的偏移向量
資料,模型和損失函式
本文中,去噪有兩個主要目標,模型設計和訓練的損失函式也由這兩個目標為基本遵循: 第一,點雲中所有點應該儘可能靠近物體的實際曲面; 第二,點雲在曲面上的分佈應該儘可能均勻。
關於每個點的去噪結果由誰決定
作者把點雲的去噪問題看作一個區域性的問題(local problem),作者認為,任意一點
的去噪結果
該點的區域性鄰域
中的點,這個鄰域與
的歐式距離不超過
,實際上限定了一個以
為球心,以
為半徑的球體,調節
的大小,可以調節去噪的結果更依賴於區域性資訊還是
全域性資訊
。對於每個模型,都有一個由
點雲邊界
確定的立方體,在實踐中,這個
被確定為該立方體對角線長度的5%。
關於網路結構
正如文章開頭所說,本文的去噪任務被分解成了
移除離群點
和
學習偏移向量
兩個子任務,這兩個過程在文中都是使用神經網路實現的,而且它們的結構非常相似,都是基於PCPNet。
對於移除離群點,我們估計點
屬於離群點的機率,整個過程描述函式
:
變數解釋:
:
的
鄰域中的點的集合;
:
屬於離群點的機率,文中以0。5為閾值確定。
得到了離群點,可以把它們從原始點雲中移除:
變數解釋:
:我們剛才所估計的離群點
組成的集合;
:原始點雲;
:移除離群點後的點雲。
獲得了移除離群點後的點雲,我們就可以在此基礎上,對其中的每個點做
偏移量
的估計,用來對各個點的位置做修正。我們把每個點
估計偏移量的過程稱作函式
:
變數解釋:
:
的
鄰域中移除離群點後的點雲;
:針對點
估計出的偏移量。
有了偏移量,我們透過一個簡單的相加操作就可以獲得最終針對每個點
(當然已經被當成離群點的點不算在其中)的估計結果:
變數解釋:
:移除離群點後的點雲中的點;
:針對點
估計出的偏移量;
:最終針對點
的預測結果,這些點的集合就是去噪處理完成後的點雲。
PointCleanNet的網路結構如下圖所示,它是由兩個PCPNet組成的,分別負責上述的兩個流程:
點雲是一種特殊的資料,與影象不同,具有一些特殊的性質,能夠處理點雲的系統,需要具備下面幾個條件:
位姿穩定性
:點雲的位置和姿態不會影響系統的輸出,i。e。點雲平移或旋轉後輸入系統,系統輸出保持不變;
順序穩定性:點雲中各點的輸入順序不會影響系統的輸出,i。e。點雲順序被打亂後輸入系統,系統的輸出保持不變
如何讓神經網路能夠應對上面問題,成為能夠處理點雲資料的系統,PointNet以及PCPNet為我們提出了一些解決方案。作者把網路劃分為三個流程(兩個網路都是這樣):
第一,逐點的特徵提取模組
。為了解決點雲的位姿穩定性問題,整個PCPNet在點雲輸入網路後,先加入了一個
四元空間
轉移網路(STN,Spatial Transformer Network),網路輸入點雲,輸出位姿變換(旋轉和平移)的引數,透過這個操作,將原始點雲遷移到一個新的有利於網路學習的位姿狀態,使用若干層全連線層或
一維卷積
提取逐點特徵並處理,當然,在輸出得到的特徵時,也對逐點的特徵向量做類似的逆變換,到達一個新的位姿。
第二,特徵融合模組。為了解決順序穩定性問題,網路在獲得處理完的逐點特徵向量後,在點的維度(類似於batchsize)上求和,這樣,就合併成為一個特徵向量,不論輸入點的順序如何,加法的
交換律
保證了合併後的特徵向量都是一樣的。數學的方式描述這一過程:
第三,迴歸模組。得到了融合後的結果,對融合的特徵向量使用若干全連線層或一維卷積層處理,獲得網路輸出的最終結果。
需要強調的是,網路的輸入是某一個點
的
鄰域中所有點。也稱為一個塊,輸出是針對點
的預測結果,對於移除離群點的任務(第一行藍色子圖),輸出為一個數值,對於預測偏移量的任務(第二行綠色子圖),網路的輸出就是一個三維向量。
對於估計偏移量的過程,模型的推理(inference)階段,單次推理得到的點雲可能存在
殘餘誤差
(Residual Error),這個誤差相比於輸入點雲的誤差當然小一個量級,為了達到更好的點雲去噪效果,作者使用迭代的方式,不僅僅做一次推理,而迭代的做多次,逐步的減小殘餘誤差。考慮到點雲每次迭代後的收縮現象,作者在每次迭代都對計算得到的偏移量做調整,公式為:
變數解釋:
:調整前的偏移量;
:點
鄰域
中的各點;
:模型輸出的點
的偏移量;
:調整後的偏移量;
模型的訓練和損失函式
模型訓練過程中所使用的輸入資料是成對的給出的,即包含輸入噪聲點雲及其無噪聲點雲,使用點雲作為標籤的好處是,點雲相比於
曲面模型
更容易獲取。但是存在的問題是,網路輸出的點雲和
真值點雲
如何進行比較,並設計損失函式。
作者訓練去噪網路的損失函式主要包含兩部分。對於點
估計出的去噪後的點
,我們選擇它的一個鄰域
,研究處在這個鄰域中的所有真值點
,尋找到與
的歐式距離最小的點,我們希望該點與估計點的距離儘可能小,獲得第一個損失函式:
另外,為了使得預測出的點雲儘可能分佈均勻,我們還需要一個正則化項:
這樣,整體的損失函式就是:
作者在本文中設定
。
關於PointCleanNet的網路結構和基本原理的講解就是這樣,關於實驗結果和視覺化效果,讀者可以在論文中詳細閱讀。後續如有必要,也可以在本文中更新。
筆者自知才疏學淺,難免疏漏與謬誤,若有高見,請不吝賜教,筆者將不勝感激!