我关注的编码是fisher编码,因为我已经证明我的工作效果最好.所以我想在我提取的(SIFT)功能上测试Fisher编码,并测试系统的性能,无论是否编码.
而不是重新开始我发现vl_feat有一个用于fisher编码的内置库,他们有一个教程,以及链接here
现在我已经完成了所需的大部分工作,但实际上编码的内容让我很困惑,例如教程清楚地表明使用GMM获得的参数执行Fisher编码,例如[均值,协方差,先验]和SIFT根据教程,GMM中将使用提取的特征:
The Fisher encoding uses GMM to construct a visual word dictionary. To
exemplify constructing a GMM, consider a number of 2 dimensional data
points. In practice, these points would be a collection of SIFT or
other local image features.
numFeatures = 5000 ;
dimension = 2 ;
data = rand(dimension,numFeatures) ;
numClusters = 30 ;
[means, covariances, priors] = vl_gmm(data, numClusters);
一旦我执行了这一步,我将编码另一个数据集?这让我很困惑.我已经使用我提取的SIFT功能生成GMM的参数.
Next, we create another random set of vectors, which should be encoded
using the Fisher Vector representation and the GMM just obtained:
encoding = vl_fisher(datatoBeEncoded, means, covariances, priors);
所以这里编码是最终结果,但它编码了什么?我想要从我的图像中提取的SIFT功能进行编码,但是如果我按照GMM中使用的教程进行编码.如果是这种情况那么什么是datatoBeEncoded?我是否再次使用SIFT专长?
谢谢
更新:
@Shai
谢谢,但我相信我一定做错了.我不太明白你的意思是“将图像与自己比较”.我有4个班,每班1000个图像.所以我使用了第1类中的前600个图像来学习gmm参数,然后使用这些参数来编码fisher矢量
numClusters = 128 ;
[means, covariances, priors] = vl_gmm(data, numClusters);
因此,每个均值,协方差大小为128 x 128,大小为1 x 128
现在,当我使用这些函数来对400幅图像上的fisher矢量进行编码时
encoding = vl_fisher(datatoBeEncoded, means, covariances, priors);
编码的大小非常不同,大小为12000 x 1.这些无法与生成的模型进行比较.
我已经有一个系统正在处理数据集的非编码版本,它运行良好,但我想看看编码将如何产生影响,理论上应该改进结果.
如果需要,我可以在这里添加代码,但它适用于UBM-GMM,我感到困惑的原因是因为你提到的训练方法是我用于UBM的.
如果我只编码测试图像,由于尺寸不匹配,我不能在分类器中使用它们.
也许我没有正确地选择这个或者犯了一些愚蠢的错误,是否有可能得到一个简单的例子,我可以通过它来理解工作.
非常感谢