简介
对BoVW和Fisher Vector的改进,BoVW只是用01表示特征和聚类中心之间的关系,VLAD将特征描述子与聚类中心的距离考虑进去,包含了更多的信息。Fisher Vector还没看,不知道它和Fisher Kernel之间是什么关系。
综合转载以下文章:
- 图像检索——VLAD
- VLAD - Vector of Locally Aggregated Descriptors - 局部聚合描述子向量 - 原理简述
- 局部特征聚合描述符(vector of locally aggregated descriptors,VLAD)
- VLAD特征(vector of locally aggregated descriptors)
- VLAD和MultiVLAD
步骤
1 提取局部特征
2 训练码本
3 VLAD编码
假设是$\{x_t\in R^{d}\}_{t=1}^{m}$输入的一幅图像的局部描述子向量的集合,$\{d_i\in R^{d}\}_{i=1}^{K}$是已经学习得到的码本,则该图像的VLAD编码为:
其中$v_i=\sum\limits_{x_t\in d_i}d_i-x_t$,$x_t\in d_i$表示$d_i$是距离$x_t$最近的码字。 最终得到的VLAD编码是$Kd\times1$的向量。
4 归一化
之后进行归一化处理,最后每一个聚类中心上都会得到一个残差的累加和,进行归一化时需要注意正负号的问题(针对不同的特征)。
假设有$K$个聚类中心,则每一个聚类中心上都有一个128维(SIFT)残差累加和向量;把这$K$个残差累加和串联起来,获得一个超长向量,向量的长度为$Kd$($d=128$),然后对这个超长矢量做归一化,现在这个超长矢量就可以保存起来了。
5 降维
假设对$N$幅图像都进行了上面的编码处理之后就会得到$N$个超长矢量,为了加快距离计算的速度通常需要进行降维处理。通常用两种方法比较来降维:
主成分分析法(PCA)可以将VLAD描述子的维度$D$减少到一个更小的维度$d$。向量$u$乘以由第一主成分特征的经验协方差矩阵形成的投影矩阵$M$。PCA矩阵预先用一个随机翻转来计算得到输出结果。
另一种是定义$M$为$d\times D$的稀疏矩阵,由$M=P\times etha$, 这里$etha$是$D\times D$的随机全排列矩阵,$P$是一个$d \times D$的聚合矩阵,这个聚合矩阵将几个联系的部分相加。例如$D=6$,$d=2$,一种可能的矩阵$M$是:
利用结构矩阵的优势是不需要训练;降维也很容易计算,因为和稀疏矩阵的乘法比和一个由PCA获得的完整矩阵更加有效。然而在搜索过程中,降维和其他步骤相比一般比只用更少的计算消耗。 描述符降低后的维度是用矩阵$M$和VlAD描述符$u$相乘,然后L2-normalizing。得到结果向量$f$当做帧描述符。
改进的VLAD
FV特征编码方式假设特征符合K个高斯混合模型,而作为其简化版本的VLAD也设定了这个假设。其表达式为:
MultiVLAD
VLAD特征相对BoW来说,对图像中占比的物体效果差些。而MultiVLAD是通过提取图像上不同尺度上的14个VLAD特征:9个最细尺度的VLAD特征,4个中等尺度的VLAD特征和一个全局的VLAD特征;尺度是通过网格大小来确定。在检索时,对查询图像q只提取一个全局的VLAD特征,将它与数据库中每个图像y的14个VLAD进行一一比较,计算出最大的相似度做为q和y之间的相似度,因此还可以得到目标物体在图像上的位置和尺度大小。
总结
VLAD可以理解为是BOF和fisher vector的折中。BOF是把特征点做k-means聚类,然后用离特征点最近的一个聚类中心去代替该特征点,损失较多信息;Fisher vector是对特征点用GMM建模,GMM实际上也是一种聚类,只不过它是考虑了特征点到每个聚类中心的距离,也就是用所有聚类中心的线性组合去表示该特征点,在GMM建模的过程中也有损失信息; VLAD像BOF那样,只考虑离特征点最近的聚类中心,VLAD保存了每个特征点到离它最近的聚类中心的距离;像Fisher vector那样,VLAD考虑了特征点的每一维的值,对图像局部信息有更细致的刻画;而且VLAD特征没有损失信息。