NetVLAD:CNN architecture for weakly supervised place recognition

NetVLAD:CNN architecture for weakly supervised place recognition

寫在前面:博主並不是做這個place recognition方向的,所以這篇paper我大概只看到netvlad層,後面的loss並不懂。因爲近期做行爲識別,想改進一下幀與幀之間的融合方案,所以過來學習一下vlad。

ps.github的netvlad用pytorch實現的代碼並不多啊~好多都是tensorfow寫的,可讀性非常差....

abstract

本文的兩點貢獻:

1)提出NetVLAD,改進了原始的VLAD,該層可接在CNN結構後面

2)提出一種訓練方案,based on a new weakly supervised ranking loss,使得VALD在CNN中的應用變成end-to-end

Method

1)給定一張圖片Ii,函數f(放在網絡中,就是一系列卷積+bn+激活+pooling等)產生一個固定size的向量,f(Ii)。如何優化產生的向量表徵f(Ii)?通過改進的netvald。

2)place recognition的整體框架

        a)我們裁剪掉CNN的最後一個卷積層之後的其他層,並將它視爲 a dense descriptor extractor。那麼最後一個卷積層的輸出爲H*W*D的特徵,對於每個空間點,都是一個D維度的向量。

        b)參考VLAD,設計新的pooling層,即NetVLAD,將得到的特徵轉化爲固定大小的圖像表徵

3)NetVLAD

          回顧一下VLAD:captures information about the statistics of local descriptors aggregated over the image。給定N個D維度的圖像描述符{xi}和k個聚類中心{ck},則VLAD的輸出爲V,V是K*D維向量,V中第(j,k)個元素的計算方式:

這裏ak(xi)是權重,表示空間特徵上第i個點和第k個聚類中心的關係。如果對於xi,如果ck是最近的類別,則權重爲1,否則爲0。

但這裏權重ak(xi)只能爲1或0,改進一下,使得權重變爲0-1之間的小數。

其實我看的也不太懂(之後看懂了再過來補)。直接上代碼吧(pytorch版本):

假設輸入爲2d圖像,netvlad一般接在最後一個conv後面,那麼輸入到netvlad的特徵,shape=[b,c,h,w]。一般c會很大,例如在resnet50中,c=2048。

1)如果normalize_input,則在dim=1進行歸一化,也就是c的維度

2)求soft_assign,也就是上述的ak(xi),這裏的conv是1*1卷積,將原channel維度降到k(聚類中心個數),然後view對特徵x進行reshape,此時soft_assign的shape爲[b,k,h*w]。再在dim=1,也就是k的維度進行softmax歸一化

3)展開x,x_flatten的shape爲[b,c,h*w]

計算x_flatten與聚類中心,self.centroids的殘差,self.centroids的原始shape=[k,c],將x_flatten和self.centroids都擴展爲適合減的維度。

4)殘差與soft_assign相乘,後面就是參照公式的求和,歸一化等等。


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章