????相應論文是“NetVALD: CNN architecture for weakly supervised place recognition”草描。
????首先要明白VLAD是干什么的——VLAD(Vector of Locally Aggregated Descriptors)是一種用聚合后的局部特征來表示全局特征的編碼方法浦箱。編碼算法的具體公式是嫩海。是輸入信息(比如圖像經(jīng)過CNN處理后的多層特征圖),C是聚類后的中心點(共有k個簇)扮惦,而是判斷屬于第k個簇的可能性兔沃。由公式可知脖祈,與k乙墙,i都有關,因此可以這樣理解掌实,如果將CNN提取的H*W*D的特征看作是H*W個D維特征陪蜻,這H*W個特征都有著子集對應的簇中心,而簇有k個贱鼻,所以a有(H*W)*k個取值宴卖,但是a只能取1或者0(和相距最近則取1,否則取0)邻悬。公式中x與i症昏,j有關,其實就是說明了x是(H*W)個D維向量父丰,而C是與k肝谭,j有關,就是說C是k個D維向量。
? ? 所以攘烛,就是說魏滚,對于每一張feature map上的每個點,分別求其余對應的簇中心點的差值和坟漱。所以結(jié)果V是一個k*D的矩陣栏赴,也就是每一張feature map都要與所有的簇中心計算一個差值,但只保留與最近的簇計算的差值靖秩。VLAD保存的是每個特征點與離它最近的聚類中心的距離,并將其作為新的編碼特征竖瘾,用于后接的分類器中沟突。
? ? 我的理解就是VLAD其實就是找個k個簇,使得這k個簇可以盡可能的表征原feature map捕传。V就體現(xiàn)了二者的差異性惠拭,值越小,說明原feature與對應的簇越接近庸论。訓練階段就是利用V和BP算法不斷修正簇中心對應的向量职辅,為每個簇學習到一個更好的anchor,使得新的差值更小聂示。這里我理解錯了域携,V是對原始特征編碼后的新特征,還需要在V后面接上一個分類器就可以組成一個完整的模型并開始訓練了鱼喉。
? ? 那么NetVALD做了一個什么改進呢秀鞭?其實就是對a做了改進。a表示的是某一個feature與所有的簇的關系扛禽,傳統(tǒng)VLAD中的a是硬分配方式锋边,就是說將feature強制性分給一個簇,此時a可以表示為[0,0,...,1,0,0,...,0]编曼。這種一刀切的做法肯定不是很好豆巨,會造成一定的信息丟失。更好的方式是軟分配方式掐场,也就是將feature與每個簇的關系用一個概率值表示(最終所有的概率值之和為1)往扔,此時a可以表示為[0.1,0.7,...,0.08,...,0.01]。此時的a就不再是固定的1和0了刻肄,而是可以看成是一個神經(jīng)網(wǎng)絡的輸出瓤球,此時模型的損失函數(shù)V就變成。相比于VLAD敏弃,NetVLAD包含更多的參數(shù)(a由固定的1卦羡、0表示變成神經(jīng)網(wǎng)絡表示),因此有著更好的適應性和學習性。原論文中的圖更加直觀地體現(xiàn)了這種適應性绿饵。
????具體的實現(xiàn)流程圖我就截取另一篇論文NeXtVLAD: An Efficient Neural Network to Aggregate Frame-level Features for Large-scale Video Classification中的圖:
編碼過程其實就是虛線框中的內(nèi)容欠肾,要學習的參數(shù)主要有兩類,一類是下面生成的FC層中的參數(shù)拟赊,共有個刺桃,一類是上面簇中心向量,也是有個吸祟。