-
前言:
- pointnet是點雲深度學習的開山之作,最近也有項目是基於此和他的進化版本pointnet++改編的,因此對pointnet的思想和結構進行理解整理。
-
點雲數據:
-
特性
- 無序性:只是點而已,排列順序不影響總體結構
- 緊密遠疏的特性:掃描方法和視角不同導致
- 非結構化數據:難以直接進行CNN
-
當下主要需要解決的任務是對點雲如何進行特征提取
-
能不能省略掉預處理操作而直接利用點雲呢?
- 當下深度學習的核心思想就是端到端(end2end)的學習即一條龍服務,PointNet做到了這一點
graph LR a[點雲數據]-->b[PointNet]-->c[object classification] b[PointNet]-->d[object part segmentation] b[PointNet]-->e[semantic scene parsing]
-
-
PointNet基本出發點
-
由於點的無序性導致,需要模型具有置換不變性
\[f(x_{1},x_{2},...,x_{n})\equiv f(x_{\pi_{1}},x_{\pi_{2}},...,x_{\pi_{n}}),x_{i}\in \mathbb{R} ^{D} \] -
例如如下公式可以保證置換不變性,但是如何在神經網絡中體現出來呢?
\[f(x_{1},x_{2},...,x_{n})=max{x_{1},x_{2},...,x_{n}} \]\[f(x_{1},x_{2},...,x_{n})=x_{1}+x_{2}+...+x_{n} \] -
如果直接用Max函數(簡單暴力):
graph LR a["(1,2,3)"]-->g[g=max] b["(1,1,1)"]-->g[g=max] c["(2,3,2)<br>..."]-->g[g=max] e["(2,3,4)"]-->g[g=max] g[g=max]-->h["(2,3,4)"]但是這樣會損失太多特征,怎么辦?
所以能不能先升維然后再做MAX操作,其實就是神經網絡的隱藏層
\[f(x_{1},x_{2},...,x_{n})=\gamma \circ g(h(x_{1},...,h(x_{n})) \] -
-
基本模型架構
-
分別對每個點進行特征提取(卷積或者全連接),再MAX得到全局進行輸出
graph LR a["(1,2,3)"]--"[1*3]*[3*1024]<br>升維"-->a1[MLP]--"[1*1024]<br>變為高維特征"-->g[g=max] b["(1,1,1)"]-->b1[MLP]-->g[g=max] c["(2,3,2)<br>..."]-->c1[MLP<br>...]-->g[g=max] e["(2,3,4)"]-->e1[MLP]-->g[g=max] g[g=max<br>保持置換不變性]--"1024個特征"-->h["γ<br>MLP"]--"權重參數矩陣<br>將1024個特征映射成少量結果"-->i[output]
-
-
整體模型架構
-
分類就是得到整體特征再輸出,分割就是各個點特征輸出結果
graph LR a["input points<br>[n*3]"]-->b["mlp(64->64)<br>兩個全連接層"]-->c["升維[n*64]"] c["[n*64]<br>升維"]--"分類任務"-->d["mlp(64->128->1024)<br>三個全連接層"]-->e["[n*1024]<br>升維"]-->f[max pool]-->h[1024<br>global feature]-->i["mlp<br>(512,256,k)"]-->j["output scores<br>k"] c["[n*64]<br>升維"]--"分割任務"-->k["[n*1088]<br>[n*64]和n*全局特征進行拼接"] h[1024<br>global feature]-->k["[n*1088]<br>[n*64]和n*全局特征進行拼接"]-->l["mlp<br>(512,256,128)"]-->m["pint feature<br>[n*128]"]-->n["mlp<br>(128,m)"]-->o["output scores<br>[n*m]"] -
輸入層的n*3中的n需要固定,因為不同的輸入點雲會具有不同的密度,所以應該對所有輸入的數據進行定量采樣,方便后期處理
-
[n*1088]拼接特征值的本質是
graph LR input["[n*64]"]--"由n個[1*64]的點組成"-->a["[1*64]+[1*1024]全局特征"]-->e[n*1088] input["[n*64]"]-->b["[1*64]+[1*1024]"]-->e[n*1088] input["[n*64]"]-->c[...]-->e[n*1] input["[n*64]"]-->d["[1*64]+[1*1024]"]-->e[n*1088]
-
-
知識點補充
-
MLP(多層感知機,Multilayer Perceptron),也叫人工神經網絡(ANN,Artificial Neural Network),除了輸入輸出層,中間可以有很多隱含層,最簡單的MLP只含有一個隱含層,即三層結構:

從上圖可以看到,多層感知機的層與層之間是全連接的(全連接的意思就是:上一層的任何一個神經元與下一層的所有神經元都有連接)。
多層感知機最底層是輸入層,中間是隱藏層,最后是輸出層。
-
輸入層沒什么好說,你輸入什么就是什么,比如輸入是一個n維向量,就有n個神經元。
-
隱藏層主要進行『特征提取』,調整權重讓隱藏層的神經單元對某種模式形成反應
-
隱藏層的神經元怎么得來?
-
首先它與輸入層是全連接的,假設輸入層用向量X表示,則隱藏層的輸出就是$$f(w_{1}x+b_{1})$$
\[w_{1}$$是權重,也叫連接系數_ $$b_{1}$$是偏置(閾值)可以排除一些“噪音”的干擾 函數f是激活函數 \]
-
-
隱藏層到輸出層可以看做是一個多類別的邏輯回歸,即softmax回歸
-
整個MLP模型總結起來就是
\[g(x)=softmax(b_{2}+w_{2}(f(w_{1}x+b_{1}))) \] -
對於一個具體的問題,怎么確定這些參數?
- 求解最佳的參數是一個最優化問題,解決最優化問題,最簡單的就是隨機梯度下降法了(SGD):首先隨機初始化所有參數,然后迭代地訓練,不斷地計算梯度和更新參數,直到滿足某個條件為止(比如誤差足夠小、迭代次數足夠多時)。
-
-
一個例子
-
目標是識別一個 4 * 3 的黑白圖像是0還是1,例子中輸入層采用了 12 個神經節點來對應 4 * 3 個像素點,然后隱藏層再使用 3 個神經單元進行特征提取,最后輸出層再使用兩個神經節點標記識別結果是 0 或 1

-
輸入層
- 12個神經元對應4*3像素(黑白),如果像素是黑色的,則對應神經元興奮,否則靜息
-
隱藏層
-
隱藏層每一個節點會對輸入層的興奮有不同的接收權重,從而更加偏向於某種識別模式
-
隱藏層第一個神經單元對應下圖模式A,也就是對應輸入層 4、7號神經單元接收權重比較高,對其他神經單元接受權重比較低,如果超過了神經單元自身的偏置(閾值)則會引發隱藏層的興奮,向輸出層傳遞興奮信息,隱藏層其他神經單元同理

-
-
各個層如何向上傳遞信息
- 根據上邊的介紹可知,輸入層每個神經單元直接對應原始數據,然后向隱藏層提供信息,隱藏層每個神經單元對不同的輸入層神經單元有不同的權重,從而偏向於對某種識別模式興奮;多個隱藏層的神經單元興奮后,輸出層的神經單元根據不同隱藏層的興奮加上權重后,給到不同的興奮度,這個興奮度就是模型最終識別的結果。
-
神經網絡中權重和偏置的作用
- 根據上述信息可知,權重會影響神經單元對輸入信息敏感程度,比如隱藏層的神經單元通過控制權重形成識別模式偏向,輸出層的神經單元調整對隱藏層神經單元的權重,可以形成輸出結果的偏向;
而偏置,可以理解為敏感度,如果沒有設置合適的偏置,一些“噪音”就會影響模型識別的結果,或者一些本該被識別出來的場景,但是在傳遞過程中被屏蔽掉了。
- 根據上述信息可知,權重會影響神經單元對輸入信息敏感程度,比如隱藏層的神經單元通過控制權重形成識別模式偏向,輸出層的神經單元調整對隱藏層神經單元的權重,可以形成輸出結果的偏向;
-
有監督學習下,如何確認權重
-
在這里需要引入一個概念,『損失函數』又稱為代價函數(cost function),計算方法為預測值與學習資料中偏差值之和(誤差)的平方,有監督學習就是經過一些『學習資料』的訓練,讓模型預測的『誤差』盡量的小。

-
-
-
-
-
pooling
-
max pooling

-
以圖片為例,整個圖片被不重疊地分割成若干個同樣大小的小塊(pooling size)。每個小塊中只取最大值,舍棄其他節點后,保持原有的平面結構得出output
-
max pooling主要功能是downsampling,卻不會損壞識別結果,這意味着卷積后的feature map中有對於識別物體不必要的冗余信息。那么我們就反過來思考,這些 “冗余” 信息是如何產生的。
直覺上,我們為了探測到某個特定形狀的存在,用一個 filter 對整個圖片進行逐步掃描。但只有出現了該特定形狀的區域所卷積獲得的輸出才是真正有用的,用該 filter 卷積其他區域得出的數值就可能對該形狀是否存在的判定影響較小。 如果不使用 Max pooling,而讓網絡自己去學習。 網絡也會去學習與 Max pooling 近似效果的權重。因為是近似效果,增加了更多的 parameters 的代價,卻還不如直接進行 Max pooling。
Max pooling 還有類似 “選擇句” 的功能。假如有兩個節點,其中第一個節點會在某些輸入情況下最大,那么網絡就只在這個節點上流通信息;而另一些輸入又會讓第二個節點的值最大,那么網絡就轉而走這個節點的分支。
但是 Max pooling 也有不好的地方。有些周邊信息對某個概念是否存在的判定也有影響。 並且 Max pooling 是對所有的 Feature Maps 進行等價的操作。就好比用相同網孔的漁網打魚,一定會有漏網之魚。
-
對應本文中對點雲的max pooling則是
graph LR e["[n*1024]<br>升維"]-->f[max pool]-->h[1024<br>global feature]graph LR input["[n*1024]"]--"由n個[1*1024]的點組成"-->a["1[1*1024]"]--將點按列分解-->e[n*1] input["[n*1024]"]-->b["2[1*1024]"]-->e[n*1] input["[n*1024]"]-->c[...]-->e[n*1] input["[n*1024]"]-->d["n[1*1024]"]-->e[n*1] e[n*1]---f[...]---g[n*1]--"從每一列選擇最大值"-->h[1024<br>global feature]
-
-
-
