了解提取特征的编码
Posted
技术标签:
【中文标题】了解提取特征的编码【英文标题】:Understanding encoding of extracted features 【发布时间】: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 的。
如果我只是对测试图像进行编码,由于尺寸不匹配,我无法在分类器中使用它们。
也许我没有正确选择这个或犯了一些愚蠢的错误,是否有可能获得一个简单的例子来理解它的工作原理。
非常感谢
【问题讨论】:
【参考方案1】:您在此过程中有两个阶段: (1) 培训 您在其中使用了解您的域的一些统计属性,以及 (2) 测试您使用学习的表示/模型并将它们应用于新样本。
因此,您应该将特征数据集拆分为两个“拆分”,一个用于学习 Fisher 编码的 GMM(一个 training 集),另一个拆分以将编码应用于(a 测试设置)。
通常您会抽取大量能够很好地代表您感兴趣的领域的图像(例如,如果您对人物感兴趣,则应该考虑许多室内和室外人物的照片、特写和合影等)。尽可能从这些训练图像中筛选描述符并使用它们来学习模型:
numClusters = 30 ;
[means, covariances, priors] = vl_gmm(TrainingData, numClusters);
一旦你有了这个模型保存它,你就可以将它应用到新的照片来编码它们
encoding = vl_fisher(TestData, means, covariances, priors);
请注意,虽然TrainingData
通常非常大,可能是从几十个(甚至数百个)图像中收集的,但TestData
可能要小得多,甚至是从一个单个中收集的描述符> 图片。
【讨论】:
感谢您的回复。因此,如果我有 1000 张图像,并使用 600 张进行训练,其余的用于测试,那么我如何比较两者?我的意思是,在这种情况下,训练将根据gmm
参数进行,而测试将根据fisher vectors
,使用分类器,它们将如何比较?这不是将一种特征类型(训练)与另一种特征类型(测试)进行比较吗?抱歉,也许我没有正确理解您的解释,如果可能的话,您能否提供一个示例来说明这将如何工作?非常感谢
@FarazKhan 您不应该与训练集进行比较 - 那将是“作弊”。您可以使用 600 张照片来学习模型,然后将 400 张图像的 Fisher 向量与自己进行比较:找到相似的图像等。例如,您可以从 400 张图像中选择一张图像并搜索最接近的 10 张图像矢量 - 即找到 10 个最相似的图像。
这里写的太多了,所以我更新了我原来的问题,请你看一下。非常感谢
dataToBeEncoded
的大小是多少?我很难理解为什么 encoding
是 1200×1 向量,而你的 numClusters
是 128...
datatobeEncoded
的大小与data
相同。就像你建议的那样,我将我的数据库分为两部分,一部分用于培训,另一部分用于测试。它们是rootSIFT
功能。每个图像都由大小为128 x 1
的特征呈现。我有 128 个集群,所以 means
的大小为 128 x 128
。但是当我将这些数据提供给vl_fisher
时,我得到了12000 x 1
向量。该向量中的大多数元素都是零,其中一些元素具有实际值以上是关于了解提取特征的编码的主要内容,如果未能解决你的问题,请参考以下文章
[机器学习与scikit-learn-44]:特征工程-特征提取(编码)-3-权重向量编码以及代码示例
One-hot 编码/TF-IDF 值来提取特征,LAD/梯度下降法(Gradient Descent),Sigmoid