教程>Fisher矢量和VLAD

这个简短的教程展示了如何计算Fisher矢量VLAD(VLAD)用VLFeat MATLAB进行编码接口。

这些编码有类似的用途:在向量中进行汇总统计一些局部特征描述符(例如。SIFT公司). 类似于视觉袋单词,它们将本地描述符分配给视觉中的元素字典,在以下情况下通过矢量量化(KMeans)获得VLAD或高斯混合模型对于Fisher矢量。然而不是仅存储视觉单词出现,这些表示存储了以下各项之间差异的统计信息字典元素和汇集的本地特性。

Fisher编码

Fisher编码使用GMM构造视觉单词字典。为了举例说明如何构造GMM,请考虑2个数字尺寸数据点(另请参见GMM公司辅导的). 实际上,这些要点是SIFT的集合或其他本地图像功能。以下代码将GMM安装到分数:

numFeatures=5000;尺寸=2;data=rand(维度,numFeatures);numClusters=30;[均值,协方差,先验值]=vl_gmm(数据,numClusters);

接下来,我们创建另一个随机向量集,应该是使用Fisher矢量表示和GMM进行编码获得:

numDataToBeEncoded=1000;dataToBeEncoded=rand(维度,numDataToBeEncode);

Fisher矢量编码电子控制这些向量中的一个是通过调用vl_过滤器函数使用的输出vl_gmm功能:

编码=vl_fisher(datatoBeEncoded,平均值,协方差,先验值);

这个编码向量是Fisher向量数据的表示待编码数据.

请注意,Fisher Vectors支持几个规范化选项可能会严重影响代表。

VLAD编码

这个V(V)向量属于每隔一段时间一个聚合的D类描述者类似于Fisher向量,但(i)它不存储二阶信息(ii)它通常使用KMean而不是GMM来生成特性词汇表(尽管后者也是选项)。

考虑相同的2D数据矩阵数据用于上一节训练Fisher向量表示。要计算VLAD,我们首先需要获得一个可视化的单词词典。这次,我们使用K-means:

numClusters=30;centers=vl_kmeans(dataLearn,numClusters);

现在考虑一下数据待编码数据和使用这个vl_v拉德函数计算编码。不同地vl_过滤器vl_v拉德需要要传入的数据到群集分配。这允许使用快速矢量量化技术(例如kd-tree)以及从从软到硬的任务。

在本例中,我们使用kd-tree进行量化:

kdtree=vl_kdtreebuild(中心);nn=vl_kdtreequery(kdtree,centers,dataEncode);

现在我们有了nn个最近的索引矩阵中每个向量的中心待编码数据. The下一步是创建一个分配矩阵:

赋值=零(numClusters,numDataToBeEncoded);赋值(sub2ind(大小(赋值),nn,1:长度(nn))=1;

现在可以使用这个vl_v拉德功能:

enc=vl_vlad(数据ToBeEncoded,中心,分配);

请注意,与Fisher矢量类似,VLAD支持几个规范化选项可能会严重影响代表。