Fisher Vector(FV)原理
Fisher Vector(FV)是一种类似于BOVW词袋模型的一种编码方式,如提取图像的SIFT特征,通过矢量量化(KMeans聚类),构建视觉词典(码本),FV采用混合高斯模型(GMM)构建码本,但是FV不只是存储视觉词典的在一幅图像中出现的频率,并且FV还统计视觉词典与局部特征(如SIFT)的差异。在讲解Fisher Vector(FV)之前,先对FV有一个总体的认识,先看一下FV的代码实现。
FV采用GMM构建视觉词典,为了可视化,这里采用二维的数据,当然这里的数据可以是SIFT或其它局部特征,具体实现代码如下:
%采用GMM模型对数据data进行拟合,构建视觉词典
numFeatures = 5000 ; %样本数
dimension = 2 ; %特征维数
data = rand(dimension,numFeatures) ; %这里随机生成一些数据,这里data可以是SIFT或其它局部特征
numClusters = 30 ; %视觉词典大小
[means, covariances, priors] = vl_gmm(data, numClusters); %GMM拟合data数据分布,构建视觉词典
这里得到的means、covariances、priors分别为GMM的均值向量,协方差矩阵和先验概率,也就是GMM的参数。
这里用GMM构建视觉词典也存在一个问题,这是GMM模型固有的问题,就是当GMM中的高斯函数个数,也就是聚类数,也就是numClusters,若与真实的聚类数不一致的话,GMM表现的不是很好(针对期望最大化EM方法估计参数),具体请参见GMM。
接下来,我们创建另一组随机向量,这些向量用Fisher Vector和刚获得的GMM来编码,具体代码如下:
numDataToBeEncoded = 1000;
dataToBeEncoded = rand(dimension,numDataToBeEncoded);
encoding = vl_fisher(datatoBeEncoded, means, covariances, priors);
如上代码片段中的encoding就是dataToBeEncoded数据的FV表示。为了提升性能,FV表示还要经过白化与归一化,具体参见VLFeat。
现在我们已经对FV已经有了一个整体的认识,下面讲述FV的原理。
现设
为从图像中提取的一个D维的特征向量(如SIFT描述子等),设
为高斯混合模型GMM拟合描述子概率分布所得的参数。在得到GMM的参数后,GMM也就确定了。现在给定一个特征描述子向量,它属于某个高斯分布(GMM*有K个高斯分布函数)的后验概率为:
对于每个模式k(也就是GMM中的单个高斯分布),考虑均值和协方差偏差向量,得到:
在上式中
。
把GMM中的每个模式按先向量后向量的形式级联起来,便得到图像的FV特征表示如下:
为了提升FV性能,得到的FV还要经过白化,Power Normalization和归一化。为了提升计算效率,当某个特征向量对应的很小到可以忽略时,直接被设置为零,这样在计算的过程中便少计算了一个模式,当大部分为零时,可以明显提高计算效率。至此,FV的原理算是讲完了。但是还有一点需要注意的是,FV还有一种实现方法,它被看成是Fisher Kernels (FK) 的一种特例。
FK推导了一种数据和拟合数据得到的生成模型,由生成模型产生的数据之间的相似性测度。生成模型的参数是通过最大似然估计(MLE)得到的。一旦生成模型被确定后,每个特定的数据都是通过观察它如何影响MLE参数估计来表示的。这个影响测度可以通过计算相应的数据的对数似然函数的梯度得到:
协方差矩阵可以通过生成模型得到(由生成模型生成的数据已经被中心化)如下所示:
注意,H也是模型的Fisher信息矩阵。最终的FV编码由对数似然函数的白化梯度给出:
取两个这样的向量的内积产生Fisher核:
可以看出,FV编码相当于FK的映射函数。
参考:
1. 聚类算法K-Means, K-Medoids, GMM, Spectral clustering,Ncut
2. 漫谈 Clustering (3): Gaussian Mixture Model
3. Fisher Vector and VLAD 4. Fisher vector fundamentals