【发布时间】:2015-02-25 18:26:13
【问题描述】:
我关注的编码是 Fisher 编码,因为我已经证明我的工作效果最好。所以我想在我提取的 (SIFT) 特征上测试 Fisher 编码,并测试有无编码的系统性能。
我发现 vl_feat 有一个用于 Fisher 编码的内置库,而不是从头开始,他们有一个教程链接here
现在我已经完成了大部分所需的操作,但实际编码的内容让我感到困惑,例如教程清楚地表明,使用 GMM 获得的参数(例如 [means, covariances, priors] 和提取的 SIFT)执行 Fisher 编码功能将按照教程在 GMM 中使用:
Fisher 编码使用 GMM 来构建视觉词典。到 举例构造一个 GMM,考虑一些二维数据 点。在实践中,这些点将是 SIFT 或 其他本地图像特征。
numFeatures = 5000 ;
dimension = 2 ;
data = rand(dimension,numFeatures) ;
numClusters = 30 ;
[means, covariances, priors] = vl_gmm(data, numClusters);
那么,一旦我执行了这一步,我要对另一个数据集进行编码吗?这让我感到困惑。我已经使用我提取的 SIFT 特征来生成 GMM 的参数。
接下来,我们创建另一个随机向量集,应该对其进行编码 使用Fisher向量表示和刚刚得到的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 的。
如果我只是对测试图像进行编码,由于尺寸不匹配,我无法在分类器中使用它们。
也许我没有正确选择这个或犯了一些愚蠢的错误,是否有可能获得一个简单的例子来理解它的工作原理。
非常感谢
【问题讨论】:
标签: matlab image-processing encoding classification feature-detection