NetVlad原理和代码解析
NetVlad是VPR任务中非常重要的一个工作,后续的改进方法也有很多,这里稍微记录一下学习过程中的心得。
Vlad简单介绍
VLAD(Vector of Local Aggregated Descriptors),是图像特征提取方法的一种。VPR任务一般被定义为图像检索任务,他的一般流程为:
- 存在一个图像库,对每张图片 通过特征函数提取特征
- 提供一张query图片 ,通过特征函数提取特征
- 将query特征 与图库特征 做相似度计算,一般为欧式距离,距离越小,越相似
假设一张图像的特征图大小为 $N*D$,然后聚类中心的数量为$K$,一个聚类中心的特征维度为$D$,具体操作如下:
- 对全部图像的特征图进行K-means聚类,可以获得K个聚类中心
- 初始化一张全局特征图,大小为$K*D$,初始值全部为0。 对于某一张图像的全部特征点计算其距离$k$个聚类中心的残差,然后将残差加到距离最近的聚类中心上。
Vlad一般使用的是传统的特征点描述子比如SURF、SIFT等,众所周知CNN在提取图像特征方面取得了巨大的成功,所以我们想要把传统描述子替换为CNN网络,有一个问题就是:如何计算残差之后要求最近的聚类中心,然后将残差加入到这边,这个操作是不可微的操作,这样就不可以端到端训练。这也是NetVlad需要解决的问题之一。
NetVlad介绍
NetVlad这篇论文主要解决了三个问题:
- 如何利用CNN进行端到端训练
- 数据集从哪里来
- 怎样有效的让网络进行学习
针对第一点文章提出了NetVlad聚合层,网络整体结构如下:

要解决端到端训练,最主要的一个问题就是解决中间不可微的问题,文章将求取最临近的不可微问题进行软化,相当于计算了当前描述符属于所有聚类的可能性。具体推导如下: