我关注的编码是费希尔编码,因为我已经证明我的工作效果最好。所以我想在我提取的(SIFT)功能上测试Fisher编码,并测试系统的性能,无论是否编码。
而不是重新开始我发现vl_feat有一个用于fisher编码的内置库,他们有一个教程,以及链接here
现在我已经完成了大部分需要但实际上编码的内容令我感到困惑,例如教程清楚地表明使用GMM获得的参数(例如[means, covariances, priors]
)和根据教程:
Fisher编码使用GMM构建可视单词字典。至 举例说明构建GMM,考虑一些二维数据 点。在实践中,这些点将是SIFT或的集合 其他本地图像功能。
numFeatures = 5000 ;
dimension = 2 ;
data = rand(dimension,numFeatures) ;
numClusters = 30 ;
[means, covariances, priors] = vl_gmm(data, numClusters);
然后,一旦我执行了这一步,我将编码另一个数据集?这让我很困惑。我已经使用我提取的SIFT功能为GMM生成参数。
接下来,我们创建另一组随机矢量,这些矢量应该被编码 使用Fisher Vector表示和刚刚获得的GMM:
encoding = vl_fisher(datatoBeEncoded, means, covariances, priors);
所以这里encoded
是最终结果,但它编码了什么?我想要从我的图像中提取的SIFT功能进行编码,但是如果我按照GMM中使用的教程进行编码。如果是这种情况那么datatoBeEncoded
是什么?我是否可以再次使用SIFT专长?
谢谢
更新:
@Shai
谢谢,但我相信我一定做错了。我不太明白你的意思"比较图像和他们自己"。我有4个班,每班1000个图像。所以我使用了第1类中的前600个图像来学习gmm参数,然后使用这些参数来编码fisher矢量
numClusters = 128 ;
[means, covariances, priors] = vl_gmm(data, numClusters);
因此,每个means, covariances
的大小为128 x 128
,大小为1 x 128
现在,当我使用这些函数
对400幅图像上的fisher矢量进行编码时encoding = vl_fisher(datatoBeEncoded, means, covariances, priors);
编码的大小非常不同,大小为12000 x 1
。这些不能与生成的模型进行比较。
我已经有一个系统正在处理数据集的非编码版本并且它运行良好,但我想看看编码将如何产生影响,理论上应该改进结果。
如果需要,我可以在这里添加代码,但它适用于UBM-GMM,我感到困惑的原因是因为你提到的训练方法是我用于UBM的。
如果我只编码测试图像,由于尺寸不匹配,我不能在分类器中使用它们。
也许我没有正确地选择这个或犯了一些愚蠢的错误,是否有可能得到一个简单的例子,我可以理解它的工作。
非常感谢
答案 0 :(得分:3)
这个过程分为两个阶段:
(1)培训您使用的地方了解您域名的某些统计属性,以及
(2)测试您使用学习的表示/模型并将其应用于新样本。
因此,您应该将要素数据集拆分为两个“拆分”,一个用于学习Fisher编码的GMM(一个训练集),另一个用于将编码应用于(a < em> test set)。
通常你会拍摄大量代表你感兴趣领域的图像(例如,如果你对人们感兴趣,你应该考虑许多室内和室外人物的照片,特写镜头和团体照片等。)你提取尽可能多的您可以从这些训练图像中使用SIFT描述符并使用它们来学习模型:
numClusters = 30 ;
[means, covariances, priors] = vl_gmm(TrainingData, numClusters);
一旦您拥有此模型保存,您就可以将其应用于新照片进行编码
encoding = vl_fisher(TestData, means, covariances, priors);
请注意,虽然TrainingData
通常非常大并且可能会从数十(甚至数百)个图像中收集,但TestData
可能会显着缩小,甚至可能是从收集的描述符单个图像。