zoukankan      html  css  js  c++  java
  • NetVLAD原理详解和推导

    NetVLAD原理详解和推导

    <font color=red>Update Message:博客园公式显示出现问题,大家看不到公式的话可以移步我的CSDN [NetVLAD原理详解和推导](https://blog.csdn.net/qq_42718887/article/details/109805506)</font>

     博主最近在读Geo-localization的论文,其中有几篇论文用到了NetVLAD,所以博主便读了读这篇论文。VLAD算法作为Image Retrival领域的经典算法,被这篇论文做了扩展,让VLAD算法变成一个differentiable的算法,从而可以利用反向传播去更新优化算法中的参数,从而诞生了NetVLAD这个pluggable to any CNN的算法。
     本论文focus on的领域是large scale visual place recognition(大尺度视觉地点识别),这类问题可以简单地理解为同一个地点在不同时期、光照、照相设备等外部条件下的图像匹配问题,与目前主流Geo-localization研究的Cross View Matching不一样,这里的图像匹配视角变换并没有ground-to-aerial这么大,个人感觉应该算是一个ground-to-ground匹配。

    0. SIFT(Scale-invariant feature transform)

     在了解NetVLAD之前需要先了解VLAD算法,而了解VLAD算法之前又需要线了解SIFT算法。所以,博主先从SIFT算法开始介绍。SIFT算法是一种局部特征描述子(local feature discriptor),其本质就是在不同的尺度空间(保证尺度不变性)上查找关键点,并计算出关键点的方向。具体算法原理可以参考以下两个博客:

     如下图所示,对于理解VLAD算法,其实只需要知道SIFT算法寻找到N个关键点并计算其方向之后,就能将一副图像转换为 N × D N imes D N×D维的张量,也可以理解为N个D维的向量(这里D一般是128)。
    在这里插入图片描述

    1. VLAD算法(Vector of locally aggregated descriptors)

     VLAD、BOF(Bag of Features)、FV(Fisher Vector)这些算法都是基于特征描述子特征编码算法,即利用如SIFT等特征描述子,将整幅图像进行编码,得到整个图像的representation。
    V ( j , k ) = ∑ i = 1 N a k ( x i ) ( x i ( j ) − c k ( j ) ) V(j, k) = sum^{N}_{i=1}a_k(x_i)(x_i(j) - c_k(j)) V(j,k)=i=1Nak(xi)(xi(j)ck(j))
     VLAD算法公式如上图所示,首先需要明确的是VLAD的目标是将N个D维的特征描述子转换为 K × D K imes D K×D维的图像representation。整个过程分为三步:

    1. 根据N个SIFT特征描述子 x i x_i xi,使用聚类算法如k-means等,得到k个聚类中心。
    2. 计算 a k ( x i ) a_k(x_i) ak(xi),即VLAD中的assginment。
    3. 根据assginment将特征描述子到簇中心的残差全部加起来。

    1.1 计算簇中心

     VLAD算法一般是利用SIFT算法去提取图像的descriptor(描述子),在得到N个D维的特征描述子之后,使用k-means算法得到K个簇中心,这个过程就相当于训练一本码书。这本码书就可以根据向量到K个簇中心的距离来确定向量属于哪个中心。

    1.2 计算assignment

     VLAD算法中的assignment就是公式中的 a k ( x i ) a_k(x_i) ak(xi),也就是如果 x i x_i xi向量属于第k个中心簇,那么 a k ( x i ) = 1 a_k(x_i)=1 ak(xi)=1,否则 a k ( x i ) = 0 a_k(x_i)=0 ak(xi)=0。这里就为后面的改进埋下了伏笔,因为这里的assginment是hard assginment,这种方式是不可微的。

    1.3 求和

    N × K N imes K N×K维的assginment矩阵之后,就能以这个矩阵为权重,把向量到每一个簇中心的残差 ( x i ( j ) − c k ( j ) ) (x_i(j) - c_k(j)) (xi(j)ck(j))全部加起来。公式里面的j就是指向量中的第j个元素。
     这样,一个簇求一次加权残差向量和,就得到了一个 K × D K imes D K×D维的全局图像的representation。

    2. NetVLAD算法原理

     NetVLAD算法对VLAD的改进有两点:

    • 将局部特征描述子的聚合k-means改成了1 by 1卷积
    • 将hard assignment改成了soft assignment

     这里我们着重讲一下主要改进,就是将传统的VLAD算法的hard assginment改成了soft assginment,让整个VLAD算法变成了一个differentiable的算法。公式如下:
    a ˉ k ( x i ) = e − α ∣ ∣ x i − c k ∣ ∣ 2 ∑ k ′ e − α ∣ ∣ x i − c k ′ ∣ ∣ 2 ar{a}_k(x_i) = frac{e^{-alpha ||x_i - c_k||^2 }} {sum_{k'} e^{-alpha ||x_i - c_{k'}||^2}} aˉk(xi)=keαxick2eαxick2
     从上面这个公式就能看出来, a ˉ k ( x i ) ar{a}_k(x_i) aˉk(xi)相当于是根据各个向量到簇中心的距离再做一个softmax得到的。
     我们继续从上面这个公式推导:
     把2范数写成向量的乘法:
    a ˉ k ( x i ) = e − α ( x i − c k ) T ( x i − c k ) ∑ k ′ e − α ( x i − c k ′ ) T ( x i − c k ′ ) (1) ar{a}_k(x_i) = frac{e^{-alpha(x_i - c_k)^T (x_i - c_k)}} {sum_{k'} e^{-alpha (x_i - c_{k'})^T(x_i - c_{k'})}} ag{1} aˉk(xi)=keα(xick)T(xick)eα(xick)T(xick)(1)
     展开:
    a ˉ k ( x i ) = e − α ( x i T x i − x i T c k − c k T x i + c k T c k ) ∑ k ′ e − α ( x i T x i − x i T c k ′ − c k ′ T x i + c k ′ T c k ′ ) (2) ar{a}_k(x_i) = frac{e^{-alpha(x_i^Tx_i - x_i^T c_k - c_k^Tx_i+c_k^Tc_k)}} {sum_{k'} e^{-alpha(x_i^Tx_i - x_i^T c_{k'} - c_{k'}^Tx_i+c_{k'}^Tc_{k'})}} ag{2} aˉk(xi)=keα(xiTxixiTckckTxi+ckTck)eα(xiTxixiTckckTxi+ckTck)(2)
     分子分母将 x i T x i x_i^Tx_i xiTxi约掉:
    a ˉ k ( x i ) = e − α ( − x i T c k − c k T x i + c k T c k ) ∑ k ′ e − α ( − x i T c k ′ − c k ′ T x i + c k ′ T c k ′ ) (3) ar{a}_k(x_i) = frac{e^{-alpha(- x_i^T c_k - c_k^Tx_i+c_k^Tc_k)}} {sum_{k'} e^{-alpha(- x_i^T c_{k'} - c_{k'}^Tx_i+c_{k'}^Tc_{k'})}} ag{3} aˉk(xi)=keα(xiTckckTxi+ckTck)eα(xiTckckTxi+ckTck)(3)
     因为这里的 x i 和 c k x_i和c_k xick都是向量,所以可以化成这样:
    a ˉ k ( x i ) = e w k T x i + b k ∑ k ′ e w k ′ T x i + b k ′ (4) ar{a}_k(x_i) = frac{e^{w_k^Tx_i + b_k}} {sum_{k'} e^{w_{k'}^Tx_i + b_{k'}}} ag{4} aˉk(xi)=kewkTxi+bkewkTxi+bk(4)
     其中 w k T = 2 α c k , b k = − α ∣ ∣ c k ∣ ∣ 2 w_k^T=2alpha c_k, b_k = -alpha||c_k||^2 wkT=2αck,bk=αck2
     化简到(4)这里就很容易看出来,soft assginment其实就是在对特征描述子做一个线性变换再加上一个bias,最后进行softmax操作。从(4)也可以看出来,现在的VLAD算法其实只有一个 c k c_k ck变量,而为了能够更加方便地利用卷积操作实现上面的全部过程,作者让 w k 、 c k 、 b k w_k、c_k、b_k wkckbk变成三个无关的变量。当然原文肯定不会这么写,作者原文写的是:This enables greater flexibility than original VLAD。至此,NetVLAD算法改进的核心部分就讲完了,接下来的残差求和操作就与VLAD算法保持一致。
    在这里插入图片描述
     如上图所示,这是整个NetVLAD算法的流程图,作者为了实现end-to-end的训练,所以提取特征描述子也没有使用SIFT这种hand-crafted特征,而是直接使用了卷积神经网络进行提取。经过CNN提取特征描述子之后,得到一个 W × H × D W imes H imes D W×H×D N × D N imes D N×D的feature maps。
     第二个虚线框中,features maps向上经过了一个 1 × 1 × D × K 1 imes 1 imes D imes K 1×1×D×K的卷积核,相当于对特征子做了一个线性变换,得到一个 N × K N imes K N×K的线性变换结果,然后经过soft-max操作得到 N × K N imes K N×K的soft assginment结果。然后 N × D N imes D N×D的features进入VLAD core经过聚类得到了 K × D K imes D K×D的聚类中心向量,然后利用 N × K N imes K N×K的soft assginment去分配feature到聚类中心残差所占的权重,按照聚类中心进行加权求和,最终得到一个 K × D K imes D K×D的VLAD vector作为整幅图片的representation。

  • 相关阅读:
    jar包和war包的介绍和区别
    Oracle中rownum的基本用法
    深入理解JVM—JVM内存模型
    Oracle数据库中序列(SEQUENCE)的用法详解
    jvm主内存与工作内存
    jvm虚拟机
    java 冒泡排序
    java二分查找
    java中split()特殊符号"." "|" "*" "" "]"
    java map的实现原理
  • 原文地址:https://www.cnblogs.com/lsl1229840757/p/14122560.html
Copyright © 2011-2022 走看看