0

私は顔認識プロジェクトに取り組んでおり、libfacerecを使用しています。ラベルを予測する際、ライブラリは絶対差を計算するnorm()を使用します。マハラノビス距離を使用して精度を向上させるにはどうすればよいですか?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とマハラノビス距離の間には密接な関係があります。http://www.cognotics.com/opencv/servo_2007_series/part_5/page_5.htmlの「ImprovingEigenfaces」を参照してください。これも[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 TransactionsonVol。19、No. 7.(1997)、pp。696-710

于 2012-05-13T19:59:47.820 に答える
0

私が自分の割り当てのためにそれを行ってきた方法は、各画像を平坦化することです。したがって、画像が24x24の場合は、1x1024に再形成します。

次に、比較したい2つの画像を1つの配列にスタックします。これで、2x1024のマトリックス/アレイができました。

その2x1024をcalcCovarMatrix()に入れて、共分散配列を取得します(COVAR_ROWSフラグを使用)。次に、invert()を使用して反転します。

次に、2つの画像と逆共分散をMahalanobis()に渡します。

于 2017-11-19T19:27:00.090 に答える