美文网首页
NetVLAD论文阅读

NetVLAD论文阅读

作者: HaloZhang | 来源:发表于2021-07-10 14:46 被阅读0次

    简介

    NetVLAD出自论文《NetVLAD: CNN architecture for weakly supervised place recognition》,是一种基于CNN架构的用于大规模图像场景识别定位的模型。场景识别(place recognition)是一类很常见的图像处理任务,是图像检索(image retrieval)领域的一个分支。其主要作用是,给定一张Query图片,要求识别出这张图片中出现的场景。识别的结果既可以是具体的地理位置,也可以是该场景的名称,还可以是数据库(DataBase)中的某个同样的场景。如下图所示:

    场景识别例子

    图像检索与场景识别

    场景识别可以看做是图像检索的子任务。图像检索任务的目的是,给定一张查询图片,从数据库中找出与被查询图片最为相似的一张图片。如果我们对数据库中的图片都打上标签,这个标签可以是该图片显示的位置,或者地理坐标等可以标注图中场景位置信息的内容。这样我们就可以来用图像检索的方式来做场景识别了,比如用检索出来最相似的图片所携带的位置信息来当做是查询图片的位置。
    图像检索的一般流程如下:

    1. 首先定义一个图像特征提取函数f,它的输入是一张图片I_i,输出是一个固定的向量f(I_i)
    2. 存在一个图像库I,对图库中的每一张图都使用图像特征提取函数f来提取特征f(I_i),然后保存成图像特征库{\{I_i\}},这一步可以离线完成。
    3. 对于一张查询图像q,首先使用函数f来提取特征f(q),然后将f(q)与图像特征库{\{I_i\}}中的特征做相似度计算,一般可以计算欧氏距离d(q,I_i) = ||f(q) - f(I_i) ||,将距离最近的图片作为结果返回。

    VLAD算法

    在了解NetVLAD模型之前,我们需要知道VLAD是什么。VLAD全称是“Vector of Locally Aggregated Descriptors”,中文译为局部聚集描述子向量,顾名思义,把聚集起来的局部描述子构造成一个向量,用该向量作为图像的全局描述子。再详细说明一下,我们首先可以通过传统方法(例如SIFT)或者深度学习方法(例如CNN)等去提取一张图像的多个局部特征,即所谓的局部描述子。由于局部特征描述子太大,不利于计算和特征表示,因此提出了VLAD算法。它是一种将若干局部特征压缩为一个特定大小全局特征的方法,通过聚类等方式,实现了特征降维。VLAD在图像检索和场景识别任务上得到广泛使用。
    VLAD其实就是一种特征聚合和降维的方法,它主要用在上一节提到的图像特征提取函数f中。假设我们已经使用CNN提取了图像的特征,大小为N \times D,其中N可能比较大。VLAD算法的主要流程如下:

    1. 对全部的N \times D的特征进行K-means聚类,获得K个聚类中心,记为C_k
    2. N \times D的特征图转换成一个固定大小为K \times D的全局特征图V,其中V(j,k)的表示如下:
      V(j,k) = \sum_{i=1}^{N}{\alpha_k(x_i)(x_i(j) - c_k(j))}
      其中x_i(j)表示第i个局部描述子的第j维,c_k(j)代表第k个聚类中心的第j维。\alpha_k(x_i)表示局部描述子x_i与第k个聚类中心之间的关系,它是一个符号函数。如果c_k是最靠近x_i的聚类中心,则\alpha_k(x_i)=1,否则为0。将每个描述子与距离其最近的聚类中心相减得到x_i(j) - c_k(j),再累加起来的最终的全局描述子。

    可以看出该式累加了每个聚类的所有特征残差,最终得到了K个全局特征。我们理解这K个全局特征表达了聚类范围内局部特征的某种分布,这种分布通过x_i(j) - c_k(j)抹去了图像本身的特征分布差异,只保留了局部特征与聚类中心的分布差异。

    这便是经典的VLAD算法的主要流程了。 VLAD示例

    NetVLAD算法

    上述VLAD算法中的\alpha_k(x_i)是一个符号函数,我们知道符号函数是不可导的,为了能够进行反向传播以便端到端训练,作者提出了NetVLAD算法。其主要改进是设计了一个平滑的权重函数来替换掉了这个符号函数。如下:

    其中\overline a_k(x_i)介于0~1之间,表明描述子与聚类中心的紧密程度,越靠近,则数值越大。\alpha是一个参数来控制衰减程度的参数。将上式中的-\alpha ||x_i - c_k||^2展开,可以化简为: 其中w_k = 2 \alpha c_k,标量b_k = -\alpha||c_k||^2。因此,我们可以重写一下VLAD的计算公式如下: NetVLAD 其中w_k, b_k, c_k都是要针对每个聚类的一系列可学习的参数。

    从VLAD到NetVLAD的最大变化是之前需要通过聚类获得参数c_k 变成了需要通过训练得到。这样就可以把VLAD变成了一个分类问题,即设定有K个分类,计算局部特征在这K个分类的差值分布来得到全局特征V(j,k)。

    NetVLAD模型结构图

    NetVLAD模型
    注意蓝色箭头部分,将原始的特征图W \times H \times D转换到K \times D使用的是1x1的卷积操作。接着计算特征图与聚类中心的残差分布,然后乘上soft-max计算出来的权重值,最后经过2个归一化层得到输出。

    参考

    相关文章

      网友评论

          本文标题:NetVLAD论文阅读

          本文链接:https://www.haomeiwen.com/subject/mxxiultx.html