我正在尝试使用 Fisher 向量对图像进行分类,如下所述:Sánchez, J., Perronnin, F., Mensink, T., & Verbeek, J. (2013)。使用 Fisher 向量进行图像分类:理论与实践。国际计算机视觉杂志,105(3),222–245。http://doi.org/10.1007/s11263-013-0636-x
为了尝试和评估这种方法,我想使用 OpenIMAJ 库,因为根据他们的JavaDoc,他们正是使用这种方法来创建 Fisher 向量,但我无法让它工作。我尝试使用 OpenIMAJ 和 OpenCV 创建 SIFT 特征向量,但对于两者我都得到相同的错误:EM 算法永远无法计算给定初始参数的有效似然性。尝试不同的初始化参数(或增加 n_init)或检查退化数据。
如果有人已经使用过这种方法,我将不胜感激。我创建了一个小例子来说明问题:
// load an image
LocalFeatureList<Keypoint> findFeatures = new DoGSIFTEngine()
.findFeatures(ImageUtilities
.readMBF(
new URL(
"http://upload.wikimedia.org/wikipedia/en/2/24/Lenna.png"))
.flatten());
// convert to double array
double[][] data = new double[findFeatures.size()][findFeatures.get(0)
.getDimensions()];
for (int i = 0; i < findFeatures.size(); i++) {
data[i] = findFeatures.get(i).getFeatureVector().asDoubleVector();
}
GaussianMixtureModelEM gaussianMixtureModelEM = new GaussianMixtureModelEM(
64, CovarianceType.Diagonal);
// error is thrown here
MixtureOfGaussians estimate = gaussianMixtureModelEM.estimate(data);