一 知識背景
3D scan&cloud points(點雲)patch-based features,fully convolutional network, deep metric learning, sparse tensors,sparse convolutions, hard negetive-mining, contrastive loss, triplet loss, batch normalization...
1.cloud points(點雲)
“在逆向工程中通過測量儀器得到的產品外觀表面的點數據集合也稱之為點雲,通常使用三維坐標測量機所得到的點數量比較少,點與點的間距也比較大,叫稀疏點雲;而使用三維激光掃描儀或照相式掃描儀得到的點雲,點數量比較大並且比較密集,叫密集點雲,



在稀疏的卷積中和權值${W}$相乘的${x}$必須在${C}$中,這樣的系數卷積得到的也是一個稀疏的結果。文中的${V^(3){-1,0,1}}$我覺得其中的元素不必是固定的${{-1,0,1}}$,如果非要是這樣,卷積(相關)就無法計算了(這也是我在閱讀時遇到的困惑)。當然最主要的還是要在code中去實現這個系數卷積。[接下來的時間我會探索一下]。
文章正文:
從3D掃描或者是點雲上提取幾何特征是許多工作的第一步。例如注冊(registration),重建(reconstruction)和跟蹤(tracking)。現今的(state of art)方法需要將低階(low-level)的特征作為輸入來計算。
“低層次特征提取算法基於興趣點所在表面及臨近點的空間分布,提取基本的二維、三維幾何屬性作為興趣點特征信息,如線性、平面性等。低層次特征提取算法復雜度低、運算效率高、內存消耗少,但領域尺寸的選擇對識別效果影響較大。”
“高層次特征提取算法基於低層次幾何特征及臨近點空間分布,定義並計算更復雜的幾何屬性作為特征信息。根據幾何屬性的定義又可細分為基於顯著性、基於直方圖、基於顯著性直方圖與基於其他特征的四大類提取算法[1][2]。”

這里說明下指標:recall 中文叫查全率又叫召回率,其計算公式如下:
$recal{l_c} = \frac{{T{P_c}}}{{T{P_c} + F{N_c}}}$
意思是某一類判斷正確占到該類總數的百分比。理所當然的想要提升recall可以遵循“寧可錯殺一百,不可放過一人”的思想。嘿嘿~
接着我們給出作者用的網絡框架:
這是一個ResUNet的架構,兩個白框是輸入輸出層,每個塊用三個參數來描述:kernel size, stride, channel dimensionality.(核大小,步幅,和通道維度)除了最后一層其他的卷積層后面都有Batch normalization然后跟一個非線性(Relu).
那說了半天啥是全卷積特征啊?
全卷積特征作者說了:
我給你翻譯翻譯:
全卷積網絡純粹的由具有平移不變性的操作組成,像卷積和元素級別的非線性。(我不懂啥是元素級別的非線性啊?)同樣,我們吧稀疏卷積網絡(注這里是因為他用的稀疏卷積所以將這個網絡將spase convolution network)給一個稀疏的tensor用上,我們得到的也是個稀疏的tensor,我們把這個稀疏的tensor輸出叫做全卷積特征。
OK。
重頭戲來了,嘿嘿~
作者自己說自己搞了個新的Metric learning的新的損失函數。在看他的新家伙式兒之前,我們不妨回顧下他站在誰的肩膀上搞了個大新聞。。
在前面的背景知識里有提到,就是negative mining 和標准的metric learning 的損失函數。這個作者說自己用全卷積網絡了搞了個metric learning,而且還把negative mining整合到對比損失函數和三元組損失函數里了,他自己把整合后的這個新的損失函數叫做“Hardest contrastive"和”hardest-triplet"
網絡:“我太難了(哭腔)"。
好言歸正傳,想要搞metric learning必須遵循兩個約束,一個是類似的特征必須和彼此之間挨的足夠近,對於分類來說,肯定是越近越好,那么有
$D({{f}_{i}},{{f}_{j}})\to 0\forall (i,j)\in P$
啥意思?${P}$是正確配對feature-match成功的特征,${(i,j)}$是其中的一個組合。相反的不相似的特征必然挨的越遠越好,那我們就給他一個警戒線稱之為margin(注:margin在英語里由差距,差額之意)用數學來說就是
$D({{f}_{i}},{{f}_{j}})>m\forall (i,j)\in N$
這里的${D}$是一種距離的衡量手段,原文沒說啥距離,我覺得應該可以用歐氏距離。
文章說Lin等人說這些對於正例的約束會導致網絡過擬合,然后搞出個針對正例的基於margin的損失函數。式子里右下角的+號代表着大於0時就取這個值,否則就取0。說實話,我因為一直吧這里邊的${I_{ij}}$當是個示性函數,以為根據后邊中括號里邊的東西來取值,一直沒搞懂,后來偶來見發現tm這兩貨是分開的。我真想吐槽這作者。。
作者的對正例加了個margin的約束后,可以解決網絡過擬合的現像。
接着又弄個三元組(triplet loss)損失,我一並給出原文,瞅瞅:
在許多的文獻了這篇文章后邊也用了,這(4)里邊的這個${f}$叫做anchor(中文名叫錨)而${f_+}$代表正例里邊的元素。帶負號的就不難說了。
在negative mining里邊就說了,網絡的性能會被小部分”人"左右,是誰呢?就是那些對於網絡來說非常難啃的硬骨頭——“hardest negatives"
接着作者討論一個容易被人忽視,但卻至關重要的存在:全卷積特征的特性
傳統的Metric learning 認為特征是獨立同分布的(iid),為啥?作者說了:
因為batch是隨機采樣來的。
這里需要和大家回顧下啥是epoch,batch,iteration
-
epoch:代表在整個數據集上的一次迭代(所有一切都包含在訓練模型中);
-
batch:是指當我們無法一次性將整個數據集輸入神經網絡時,將數據集分割成的一些更小的數據集批次;
-
iteration:是指運行一個 epoch 所需的 batch 數。舉個例子,如果我們的數據集包含 10000 張圖像,批大小(batch_size)是 200,則一個 epoch 就包含 50 次迭代(10000 除以 200)。
雖說基礎,但也要溫故而知新嘛~
然而,然而...
在全卷積特征的提取過程中,相鄰特征的位置是相關的。
------------------------------------
今天接着寫。
昨天夜里回去到b站上一個講點雲的視頻,挺有收獲的,地址貼出來。
----------------------------------------------
因為全卷積特征的這個相近的特征之間有局部的關聯,所以在難例挖掘的時候could(這個翻譯成能還是可能?)找到和錨點相近的偽負例(false negatives)[反正我不懂],所以說去除這些個偽負例至關重要。在作者之前的paper里使用了一個distance來約束。
並且作者提到全卷積網絡得到的特征比標准尺度學習算法得到的要多幾個數量級,全卷積幾何特征是~40k個特征僅僅對一對兒掃描(而且這還與batch-size成比例的增加)。
接下來討論作者的hardest-contrastive和hardest-triplet losses
首先采樣一系列的錨點和一個挖掘每個場景的集合。看看原文:
這里看看作者是怎么將難例挖掘整合到對比損失里的:
${P}$是一個minibatch經過全卷積網絡提取出來的全部正例,${N}$是一個隨機的由該網絡卷積得出的特征的一個子集,該子集將會被用來進行難例挖掘。
${I_i}$是一個indicator function,是${I(i,k_{i},d_{t})}$的簡寫。當特征${f_{k_{i}}}$位於以特征${f_i}$為圓心,直徑為${d_t}$的球面外時,為1,反之為0。其中${k_i}$滿足:${{k}_{i}}=\arg {{\min }_{k\in N}}D({{f}_{i}},{{f}_{k}})$。
也就是說${{f}_{ki}}$是所有負例里最靠近該正例的。而\[\left| {{P}_{i}} \right|=\sum\nolimits_{(i,j)\in P}{I(i,{{k}_{i}},{{d}_{t}})}\]
表示針對特征$f_i}$的所有合法的負例的個數。可以類推。${{\lambda }_{n}}$是一個權重,將其設置成0.5.這里的${d_t}$就是上文提到的為了除去偽負例而設置的threshold。
類似的我們可以得到triplet loss:
上式確實找到了對於組合${(i,j)}$最難的負例,但是但是這最強的負例卻容易collapse。
這里:不用平方損失可以防止特征collapse到一個點。作者的點子又把就是hardest的和隨機抽樣的triplets都同樣的使用的方法加上。
至於具體的代碼及實現環節可以去參考paper的原文,及作者的github。
算法的思想到這里就結束了。
這篇paper的兩個spotlight:
1.全連接提取特征,拜托了之前的patch-based
2.對metric learning的兩個損失函數contrstive 和triplet loss 做了改進。
===================