VLAD/NetVLAD/GhostVLAD

部分参考:
场景识别之NetVLAD
论文笔记:NetVLAD: CNN architecture for weakly supervised place recognition
论文阅读笔记-《GhostVLAD for set-based face recognition》
论文阅读-人脸识别:GhostVLAD

三者简单对比如下:

1.VLAD:局部聚合描述子向量,利用硬分配。
2.NetVLAD:结合CNN的VLAD网络结构,利用软分配。
3.GhostVLAD:在聚类中心中加入ghost 聚类中心,削弱低质量图像在模板中的权重。

VLAD

VLAD 和 BoW、Fisher Vector 等都是图像检索领域的经典方法。
VLAD的全称是Vector of Locally Aggregated Descriptors,即“局部聚集描述子向量”。顾名思义,把聚集起来的局部描述子构造成一个向量,用该向量作为图像的全局描述子。
通常在传统方法中我们会获得一系列的局部特征(SIFT、SURF、ORB)之类,假设为 N 个 D 维的局部特征(通常 N 可能比较大,而且每幅图特征多少不一,N 可能数量也不一定),我们希望通过这 N*D 维特征获得一个可以表示图像全局 K*D 维特征的方法(通常K是我们指定的数目,例如128维)。
VLAD算法可以看做是一种简化的Fisher Vector【FV方法的核心思想是利用高斯混合模型(GMM),通过计算高斯混合模型中的均值、协方差等参数来表示每张图像。该方法的优点是准确度高,但缺点是计算量较大】,其主要方法是通过聚类方法训练一个小的码本,对于每幅图像中的特征找到最近的码本聚类中心,随后所有特征与聚类中心的差值做累加,得到一个k*d的vlad矩阵,其中k是聚类中心个数,d是特征维数(如sift是128维),随后将该矩阵扩展为一个(k*d)维的向量,并对其L2归一化,所得到的向量即为VLAD。关于该算法为何有效,Jegou et al.在2012年的期刊版本 Aggregating local image descriptors into compact codes 中有着相关证明。

NetVLAD

VLAD设计很巧妙,但随着深度学习的发展,人们想要试试能不能用神经网络代替传统的VLAD方法,于是就有了NetVLAD,也是一个较早的使用 CNN 来进行图像检索或者视频检索的工作。
在VLAD算法的基础上Arandjelovic et al.在 All about VLAD 一文中提出了一种改进方法。随后,其又结合深度卷积神经网络的相关内容,提出了NetVLAD,一个广义VLAD层。
NetVLAD是一个将传统方法神经网络化的教科书般的实现。用softmax代替最近邻的二值函数,实现了全流程可导。另一方面NetVLAD将聚类中心也作为网络的参数进行训练,使得聚类中心不再是狭义的聚类中心,而是更能体现特征分布的语义上的中心,从而得到比传统聚类方法更好的结果。

首先,由于是 NN 的方法,我们这里使用 CNN Feature 代替了传统 VLAD 中的 N 个局部描述子,CNN 是一个全局的特征,它的 Feature Map 是 W*H*D 大小,那么类比于我们之前的传统方法 N*D,我们这里 NetVLAD 目标就是将 W*H*D (N=W*H)的特征转换为 K*D 的特征;
其次,我们将整个 NetVLAD 看做一个 pooling layer,它的作用是实现降采样?最终和 VLAD 一样获得我们想要的 K*D 维描述子。

NetVLAD与VLAD的区别就在于将VLAD的系数ak({0,1})改写为softmax的软分配系数。在网络中表现为用K个1*1的卷积核卷积之后再进过softmax层得到软分配系数 (从而可以利用卷积操作和反向传播自动求参的功能)。将该系数与残差(图像特征向量x和聚类中心c的差值)相乘,累加得到V(D*K)的矩阵。最后经过两次归一化操作得到一个维度为(K*D)的向量。

GhostVLAD

来自DeepMind和VGG组被ACCV2018接收的论文《GhostVLAD for set-based face recognition》。
NetVLAD可以理解为一种可微分完全可训练的VLAD编码聚合方法,它的作用大致是自动计算特征聚类中心,计算残差,然后把残差加权,构建聚合特征矩阵,整个过程方便加入到神经网络中。
NetVLAD中所有聚类中心ck都参与了聚合,GhostVLAD的改进则是增加聚类中心的个数到K+G,但是增加的聚类中心在构建聚合特征矩阵的时候不参与贡献权重。这些多出来的不参与聚合特征矩阵构建的Ghost聚类中心,就相当于给了神经网络丢弃一部分信息使得网络更具鉴别性的可能,而在原来的NetVLAD中是体现不出来的。

ghostVLAD的架构,很清晰:

  1. Feature extraction: 用个预训练的 backbone 提取特征;
  2. Aggregation: 把提取到的多个图片的多个特征聚合为一个描述子。

GhostVLAD的作用,就是给定 N 个 \({{N_{F}}}\) 维的图像描述子,将其转换为一个 \({{D_{F*K}}}\) 的输出。然后这个输出再经过一层全连接层,得到一个 D 维的向量。
backbone论文里用的是 ResNet-50 和 SENet-50,当然,要去掉最后的池化层。

就是在计算 VLAD 的时候,多加了 “Ghost clusters”, 但是在向后传递的时候,又把 “Ghost clusters” 给去掉了,不算在内。
这样一来,整个网络训练的时候,有些图片会被聚类到“Ghost clusters”,但又不会参与到整个网络的权重更新中。它在那里,又好像不在那里,所以称为“Ghost clusters”。通过端到端的训练,来让网络自主选择哪些图片作用较低,应该成为“Ghost clusters”。
当然,对于这个特定的 set-based face recognition 场景,我们当然是期望那些模糊的、信息量较低的图像成为“Ghost clusters”。

ghost clusters 的有效性:

因为 GhostVLAD 聚合的是一系列图像的描述子的残差向量,而残差向量是每个non-ghost cluster的加权残差值,所以可以通过计算这些残差向量的模来衡量其对于这一系列图片的贡献程度。

Ghost有“幻象”的意思,可能很多模糊的人脸的确看起来是“幻象”,这也是GhostVLAD名称的由来。加入了ghost聚类中心,能够有效的减小低质量图片在人脸模板中的比重,增强高质量图片的比重。
ghost的中心点仅仅参与软分配的权重计算而不参与残差的计算,所以实际上还是K个点参与的VLAD。

所谓的ghost的聚类中心就是指一些假设存在但是实际没有的中心点,主要目的就是让低质量图片可以归类在这类中心点上,从而在软分配的时候,对实际的k个归类点的得分都降低。比如说,x在原有k个中心点上的得分分别为0.3 0.3 0.4,加入了g=1的ghost中心之后,x在k个中心的得分表示为0.2 0.2 0.3,所以减弱了这个影响。

posted @ 2020-04-29 10:53  Skye_Zhao  阅读(2459)  评论(0编辑  收藏  举报