0

我正在从事人脸识别项目,并且正在使用 libfacerec。在预测标签时,库使用计算绝对差的 norm()。如何使用 Mahalanobis 距离来提高准确性?OpenCV2 有一个功能:

double Mahalanobis(InputArray vec1, InputArray vec2, InputArray icovar)

这需要我通过使用计算 icovar

void calcCovarMatrix(InputArray samples, OutputArray covar, OutputArray mean, int flags, int ctype=CV_64F)

但是,此函数期望样本存储为单独的矩阵或单个矩阵的行/列。我不知道如何为这个函数提供数据,即如何使样本分离矩阵或作为单个矩阵的行。请帮忙。我想更改以下代码:

int Eigenfaces::predict(InputArray _src) const {
// get data
Mat src = _src.getMat();
// project into PCA subspace
Mat q = project(_eigenvectors, _mean, src.reshape(1,1));
double minDist = numeric_limits<double>::max();
int minClass = -1;
for(unsigned int sampleIdx = 0; sampleIdx < _projections.size(); sampleIdx++) {
    //Change Here------------------------------------------------
    Mat icovar;
    Mat mean;
    calcCovarMatrix(Mat(),icovar,mean,CV_COVAR_SCRAMBLED);
    double dist = Mahalanobis(q, sampleIdx, icovar);
    //-----------------------------------------------------------
    //double dist = norm(_projections[sampleIdx], q, NORM_L2);
    if(dist < minDist) {
        minDist = dist;
        minClass = _labels[sampleIdx];
    }
}
return minClass;
}
4

2 回答 2

2

介绍

首先是这个。根据我的个人经验,我可以告诉你,对于 PCA,距离度量对识别率并没有任何显着影响。我知道有些论文报告了它,但我无法在我的图像数据库中承认它。至于你关于如何计算马氏距离的问题。PCA 和 Mahalanobis 距离之间存在密切关系,请参阅http://www.cognotics.com/opencv/servo_2007_series/part_5/page_5.html上的“改进特征脸” ,这也在 [1] 中给出。为了完整起见,本文所指的项目位于:https ://github.com/bytefish/libfacerec 。

代码

没有任何进一步的测试,我会将认知学的东西重写为:

int cv::Eigenfaces::predict(InputArray _src) const {
  // get data
  Mat src = _src.getMat();
  // project into PCA subspace
  Mat q = subspace::project(_eigenvectors, _mean, src.reshape(1,1));
  double minDist = numeric_limits<double>::max();
  int minClass = -1;
  for(int sampleIdx = 0; sampleIdx < _projections.size(); sampleIdx++) {
    Mat diff0, diff1;
    // perform element wise multiplication and division
    multiply(q - _projections[sampleIdx], q - _projections[sampleIdx], diff0);
    divide(diff0.reshape(1,1), _eigenvalues.reshape(1,1), diff1);
    double dist = sum(diff1).val[0];
    if(dist < minDist) {
      minDist = dist;
      minClass = _labels[sampleIdx];
    }
  }
  return minClass;
}

参考

[1] Moghaddam, B. 和 Pentland, A. 模式分析和机器智能中的“对象表示的概率视觉学习” ,IEEE Transactions on Vol。19, No. 7. (1997), pp. 696-710

于 2012-05-13T19:59:47.820 回答
0

我一直在为我的作业做这件事的方式是展平每个图像。因此,如果图像是 24x24,我将其重塑为 1x1024。

然后我将要比较的 2 张图像堆叠到一个数组中。所以现在你有一个 2x1024 矩阵/数组。

我将 2x1024 放入 calcCovarMatrix() 以获取协方差数组(使用 COVAR_ROWS 标志)。然后使用 invert() 反转它。

然后你将你的两个图像和你的倒置协方差传递给 Mahalanobis()

于 2017-11-19T19:27:00.090 回答