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相乘,後面就是參照公式的求和,歸一化等等。