简介
NetVLAD出自论文《NetVLAD: CNN architecture for weakly supervised place recognition》,是一种基于CNN架构的用于大规模图像场景识别定位的模型。场景识别(place recognition)是一类很常见的图像处理任务,是图像检索(image retrieval)领域的一个分支。其主要作用是,给定一张Query图片,要求识别出这张图片中出现的场景。识别的结果既可以是具体的地理位置,也可以是该场景的名称,还可以是数据库(DataBase)中的某个同样的场景。如下图所示:
场景识别例子图像检索与场景识别
场景识别可以看做是图像检索的子任务。图像检索任务的目的是,给定一张查询图片,从数据库中找出与被查询图片最为相似的一张图片。如果我们对数据库中的图片都打上标签,这个标签可以是该图片显示的位置,或者地理坐标等可以标注图中场景位置信息的内容。这样我们就可以来用图像检索的方式来做场景识别了,比如用检索出来最相似的图片所携带的位置信息来当做是查询图片的位置。
图像检索的一般流程如下:
- 首先定义一个图像特征提取函数,它的输入是一张图片,输出是一个固定的向量。
- 存在一个图像库,对图库中的每一张图都使用图像特征提取函数来提取特征,然后保存成图像特征库,这一步可以离线完成。
- 对于一张查询图像,首先使用函数来提取特征,然后将与图像特征库中的特征做相似度计算,一般可以计算欧氏距离,将距离最近的图片作为结果返回。
VLAD算法
在了解NetVLAD模型之前,我们需要知道VLAD是什么。VLAD全称是“Vector of Locally Aggregated Descriptors”,中文译为局部聚集描述子向量,顾名思义,把聚集起来的局部描述子构造成一个向量,用该向量作为图像的全局描述子。再详细说明一下,我们首先可以通过传统方法(例如SIFT)或者深度学习方法(例如CNN)等去提取一张图像的多个局部特征,即所谓的局部描述子
。由于局部特征描述子太大,不利于计算和特征表示,因此提出了VLAD算法。它是一种将若干局部特征压缩为一个特定大小全局特征的方法,通过聚类等方式,实现了特征降维。VLAD在图像检索和场景识别任务上得到广泛使用。
VLAD其实就是一种特征聚合和降维的方法,它主要用在上一节提到的图像特征提取函数中。假设我们已经使用CNN提取了图像的特征,大小为,其中可能比较大。VLAD算法的主要流程如下:
- 对全部的的特征进行K-means聚类,获得K个聚类中心,记为。
- 将的特征图转换成一个固定大小为的全局特征图,其中的表示如下:
其中表示第个局部描述子的第维,代表第个聚类中心的第维。表示局部描述子与第个聚类中心之间的关系,它是一个符号函数。如果是最靠近的聚类中心,则,否则为0。将每个描述子与距离其最近的聚类中心相减得到,再累加起来的最终的全局描述子。
这便是经典的VLAD算法的主要流程了。 VLAD示例可以看出该式累加了每个聚类的所有特征残差,最终得到了个全局特征。我们理解这个全局特征表达了聚类范围内局部特征的某种分布,这种分布通过抹去了图像本身的特征分布差异,只保留了局部特征与聚类中心的分布差异。
NetVLAD算法
上述VLAD算法中的是一个符号函数,我们知道符号函数是不可导的,为了能够进行反向传播以便端到端训练,作者提出了NetVLAD算法。其主要改进是设计了一个平滑的权重函数来替换掉了这个符号函数。如下:
其中介于0~1之间,表明描述子与聚类中心的紧密程度,越靠近,则数值越大。是一个参数来控制衰减程度的参数。将上式中的展开,可以化简为: 其中,标量。因此,我们可以重写一下VLAD的计算公式如下: NetVLAD 其中都是要针对每个聚类的一系列可学习的参数。从VLAD到NetVLAD的最大变化是之前需要通过聚类获得参数 变成了需要通过训练得到。这样就可以把VLAD变成了一个分类问题,即设定有K个分类,计算局部特征在这K个分类的差值分布来得到全局特征V(j,k)。
NetVLAD模型结构图
NetVLAD模型注意蓝色箭头部分,将原始的特征图转换到使用的是1x1的卷积操作。接着计算特征图与聚类中心的残差分布,然后乘上soft-max计算出来的权重值,最后经过2个归一化层得到输出。
网友评论