论文笔记:KD-Net
生活随笔
收集整理的這篇文章主要介紹了
论文笔记:KD-Net
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Escape from Cells: Deep Kd-Networks for the Recognition of 3D Point Cloud Models
1、四個問題
- 3D點云識別任務。
- 參考KD樹的結構,提出了一種新的樹形結構的神經網絡,用來處理不規則的點云數據。
- 在形狀分類任務、形狀檢索任務以及形狀部件分割任務中都取得了領先的效果。
- 如果點云存在旋轉,那么KD樹在X/Y/Z軸方向進行切分時會得到不同的結果,影響最終的效果。
- 每次網絡做前向操作時,都需要先將輸入的點云轉為KD樹,預處理時必須要占用一定時間。
2、論文概述
2.1、簡介
- 我們都知道,由于點云是非歐式結構的數據,無法對其直接應用CNN。常用的思路是將其轉換為體素網格,但是這樣會帶來額外的內存消耗和很大的計算量。
- 作者認為:諸如KD樹、八叉樹等數據結構常被用于表示不規則的數據。那么,是否能將這些數據結構擴展到深度神經網絡中呢?這樣的網絡結構也就能夠處理那些不規則結構的數據。
- 由此,作者提出了KD網絡,主要是模仿卷積神經網絡的思想,但是又使用KD樹的結構來構建計算圖。
2.2、KD-Networks
- 圖1是KD-Netwoks的示意圖。圖中只考慮二維的情況。
- 在一個有8個點的點云上建立KD樹,在每一層都從X/Y軸選擇一個維度進行劃分。
- 從根節點到葉節點對KD樹的每個節點進行編號,根節點編號為0,往后遞增。
- KD數最左邊的8到15號節點實際就是原始點云,右邊的0號節點可以看做輸出的類別預測v0v_0v0?。
- 從左到右,可以看做這個KD-Network的特征前向傳播的方向。
- 圖中的圓圈表示的是特征傳播并聚合的過程,對應卷積核,其參數是可學習的。相同的顏色表示共享參數,即如果是在相同維度對點集進行劃分,認為其卷積參數也應該共享。
2.2.1、輸入
- 由于KD-Network每次都要從3D點云構建KD樹,而KD樹的節點數是N=2DN=2^{D}N=2D,因此點云的點數也必須是2D2^{D}2D。如果點云的點數不同,還需要對其做上采樣或者下采樣。
- 構建KD樹時,我們以自頂向下的方式遞歸地生成每個樹節點。每次都選取能最好地分割整個點集的坐標軸作為劃分標準,將點集劃分為兩個一樣大的子集,然后遞歸生成。
- 一個深度為DDD的平衡KD樹包含有N?1=2D?1N-1=2^{D}-1N?1=2D?1個非葉節點。
- 每個非葉節點Vi∈TV_{i} \in \mathcal{T}Vi?∈T都與三個劃分方向did_idi?(X/Y/Z軸,di∈{X,Y,Z}d_i \in \{X, Y, Z\}di?∈{X,Y,Z})以及劃分位置ti\mathcal{t}_iti?有關。
- KD樹上的節點還與層數li∈{1,…,D?1}l_{i} \in\{1, \ldots, D-1\}li?∈{1,…,D?1}有關,li=1l_{i}=1li?=1是根節點,li=Dl_{i}=Dli?=D是葉節點,也對應著3D點云上的點。
- 假設KD樹是平衡樹,那么第iii號節點的子節點的編號分別是c1(i)=2ic_{1}(i)=2 ic1?(i)=2i和c2(i)=2i+1c_{2}(i)=2 i + 1c2?(i)=2i+1。
2.2.2、KD-Networks的數據處理
- 給定一個輸入的KD樹T\mathcal{T}T,KD-Network會計算KD樹的每個節點上的特征向量vi\mathbf{v}_ivi?。
- 葉節點即輸入是一個kkk維向量,由輸入點云的維度確定。
- 第l(i)l(i)l(i)層上的非葉節點iii,其子節點c1(i)c_1(i)c1?(i)和c2(i)c_2(i)c2?(i)在第l(i)+1l(i) + 1l(i)+1層,其特征向量vc1(i)\mathbf{v}_{c_{1}(i)}vc1?(i)?和vc1(i)\mathbf{v}_{c_{1}(i)}vc1?(i)?已經計算好了。那么當前節點iii的特征向量vi\mathbf{v}_ivi?的計算公式如下:
- vi={?(Wxli[vc1(i);vc2(i)]+bxli),ifdi=x?(Wyli[vc1(i);vc2(i)]+byli),ifdi=y?(Wzli[vc1(i);vc2(i)]+bzli),ifdi=z\mathbf{v}_{i}=\left\{\begin{array}{l}{\phi\left(W_{\mathrm{x}}^{l_{i}}\left[\mathbf{v}_{c_{1}(i)} ; \mathbf{v}_{c_{2}(i)}\right]+\mathbf{b}_{\mathrm{x}}^{l_{i}}\right)}, if \ d_i = x \\ {\phi\left(W_{\mathrm{y}}^{l_{i}}\left[\mathbf{v}_{c_{1}(i)} ; \mathbf{v}_{c_{2}(i)}\right]+\mathbf{b}_{\mathrm{y}}^{l_{i}}\right)}, if \ d_i = y \\ {\phi\left(W_{\mathrm{z}}^{l_{i}}\left[\mathbf{v}_{c_{1}(i)} ; \mathbf{v}_{c_{2}(i)}\right]+\mathbf{b}_{z}^{l_{i}}\right)}, if \ d_i = z \end{array}\right.vi?=?????(Wxli??[vc1?(i)?;vc2?(i)?]+bxli??),if?di?=x?(Wyli??[vc1?(i)?;vc2?(i)?]+byli??),if?di?=y?(Wzli??[vc1?(i)?;vc2?(i)?]+bzli??),if?di?=z?
- 或簡寫為:vi=?(Wdili[vc1(i);vc2(i)]+bdili)\mathbf{v}_{i}=\phi\left(W_{d_{i}}^{l_{i}}\left[\mathbf{v}_{c_{1}(i)} ; \mathbf{v}_{c_{2}(i)}\right]+\mathbf{b}_{d_{i}}^{l_{i}}\right)vi?=?(Wdi?li??[vc1?(i)?;vc2?(i)?]+bdi?li??)
- ?(?)\phi(\cdot)?(?)是非線性單元(ReLU)。
- 第lil_ili?層的可學習的參數是{Wxli,Wyli,Wzli,bxli,byli,bzli}\left\{W_{\mathrm{x}}^{l_{i}}, W_{\mathrm{y}}^{l_{i}}, W_{\mathrm{z}}^{l_{i}}, \mathbf{b}_{\mathrm{x}}^{l_{i}}, \mathbf{b}_{\mathrm{y}}^{l_{i}}, \mathbf{b}_{\mathrm{z}}^{l_{i}}\right\}{Wxli??,Wyli??,Wzli??,bxli??,byli??,bzli??}。
- 根據KD樹的劃分方向did_idi?,選取上面三組參數中的一組進行計算。
- 每層的矩陣WWW和bbb的維度為m1,m2,…,mDm^{1}, m^{2}, \ldots, m^{D}m1,m2,…,mD。
- 第lll層的WxlW_{\mathrm{x}}^{l}Wxl?、WylW_{\mathrm{y}}^{l}Wyl?、WzlW_{\mathrm{z}}^{l}Wzl?維度是ml×2ml+1m^{l} \times 2 m^{l+1}ml×2ml+1(因為每個非葉節點有兩個子節點),而bxl\mathbf{b}_{\mathrm{x}}^{l}bxl?、byl\mathbf{b}_{\mathrm{y}}^{l}byl?、bzl\mathbf{b}_{\mathrm{z}}^{l}bzl?的維度是mlm^lml。
2.2.3、分類網絡結構
- 對于分類網絡來說,只要讓根節點輸出的特征向量的維度數為類別數,即可得到分類結果。
- v0(T)=W0v1(T)+b0\mathbf{v}_{0}(\mathcal{T})=W^{0} \mathbf{v}_{1}(\mathcal{T})+\mathbf{b}^{0}v0?(T)=W0v1?(T)+b0
- W0W^0W0和b0\mathbf{b}^{0}b0是最后的分類層的參數。
2.2.4、形狀檢索網絡結構
- 與分類網絡類似,但是最后的根節點輸出的不是分類預測結果而是一個描述子(特征向量)。訓練時加上度量學習的損失函數:histogram loss,siamese loss,triplet loss等,來約束輸出的特征向量,使得同類形狀的特征向量之間距離更小,不同類的特征向量之間距離更大。
2.2.5、分割網絡結構
- 在部件分割任務上,KD-Network參考了卷積神經網絡對結構進行了更改,也使用了編碼器-解碼器(encoder-decoder)的結構,并加入了跳躍連接(skip connections)。
- 上圖是分割網絡的示意圖。
- 這里的分割網絡可以看成是將兩個KD樹拼接在了一起,左半邊與分類網絡和檢索網絡結構一樣,是encoder;右半邊是decoder,也就是倒過來的KD樹,將根節點的特征傳播到所有的葉節點上。
- 設右半部分的KD樹的根節點為v1\mathbf{v}_{1}v1?,而節點iii上的特征向量為vi\mathbf{v}_{i}vi?。
- 特征傳播時的更新公式如下:
- v~c1(i)=?([W~dc1(i)liv~i+b~dc1(i)li;Slivc1(i)+tli])v~c2(i)=?([W~dc2(i)liv~i+b~dc2(i)li;Slivc2(i)+tli])\begin{aligned} \tilde{\mathbf{v}}_{c_{1}(i)} &=\phi\left(\left[\tilde{W}_{d_{c_{1}(i)}}^{l_{i}} \tilde{\mathbf{v}}_{i}+\tilde{\mathbf{b}}_{d_{c_{1}(i)}}^{l_{i}} ; S^{l_{i}} \mathbf{v}_{c_{1}(i)}+\mathbf{t}^{l_{i}}\right]\right) \\ \tilde{\mathbf{v}}_{c_{2}(i)} &=\phi\left(\left[\tilde{W}_{d_{c_{2}(i)}}^{l_{i}} \tilde{\mathbf{v}}_{i}+\tilde{\mathbf{b}}_{d_{c_{2}(i)}}^{l_{i}} ; S^{l_{i}} \mathbf{v}_{c_{2}(i)}+\mathbf{t}^{l_{i}}\right]\right) \end{aligned}v~c1?(i)?v~c2?(i)??=?([W~dc1?(i)?li??v~i?+b~dc1?(i)?li??;Sli?vc1?(i)?+tli?])=?([W~dc2?(i)?li??v~i?+b~dc2?(i)?li??;Sli?vc2?(i)?+tli?])?
- W~dc?(i)li\tilde{W}_{d_{c *(i)}^{l_{i}}}W~dc?(i)li???和b~dc,(i)li\tilde{\mathbf{b}}_{d_{c,(i)}}^{l_{i}}b~dc,(i)?li??分別是網絡中的權重和偏置參數。
- SliS^{l_{i}}Sli?和tlit^{l_{i}}tli?分別是跳躍連接上的權重和偏置參數。
- 整個網絡的結構類似U-Net,在encoder-decoder結構的基礎之上加入了shortcut,避免一些信息的損失。
2.2.6、實現細節
- 預處理,所有點云都事先歸一化到[?1;1]3[-1 ; 1]^{3}[?1;1]3。
2.3、實驗
3、參考資料
總結
以上是生活随笔為你收集整理的论文笔记:KD-Net的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 论文笔记:PRIN: Pointwise
- 下一篇: Visual Studio 2015 编