2

2 つの顔の類似性の測定値を見つけようとしています。私はOpenCVを使用しています。そのために、私は 1000 人の異なる人物の 1000 枚の写真を使用して Eigenfaces / Fisherfaces をトレーニングします (各人に 1 枚の写真)。したがって、トレーニング セットには 1000 個のラベルもあります。

これで、predict メソッドを使用して、最も類似した顔を取得できます。

2 つの未知の顔画像を入力して、両方がトレーニング セット内の同じ顔のベクトルに似ているかどうかを確認したいと考えています。

これは、最も類似した (距離が最も短い) ラベルを返す openCV のコードです。

for(size_t sampleIdx = 0; sampleIdx < _projections.size(); sampleIdx++) {
    double dist = norm(_projections[sampleIdx], q, NORM_L2);
    if((dist < minDist) && (dist < _threshold)) {
        minDist = dist;
        minClass = _labels.at<int>((int)sampleIdx);
    }

質問:

  1. これを書き直して、トップ 1 だけでなくトップ 10 の顔を出力する方法を教えてもらえますか? 私はそれらを優先キューに入れることを考えていますが、もしかしたらもっと簡単な方法があるのでしょうか?!

  2. トレーニングでは、すべての顔を同じラベルまたは異なるラベルに配置する必要がありますか? では、1 つのラベルまたは 1000 のラベルを使用する必要がありますか?

乾杯

4

2 に答える 2

2

これが私がしたことです。注意: 私は perl が得意で、C++ は初心者なので (実際、これは私の最初の c++ プロジェクトです!)、コマンド ラインに多くの出力を行い、perl で解析しました。

あなたと同じように facerec.cpp に移動し、for ループの内容を次のように変更しました。

for(size_t sampleIdx = 0; sampleIdx < _projections.size(); sampleIdx++) {
    double dist = norm(_projections[sampleIdx], q, NORM_L2);
    int labelClass = _labels.at<int>((int)sampleIdx);
    cout << dist << " " << labelClass << endl;
    if((dist < minDist) && (dist < _threshold)) {
        minDist = dist;
        minClass = _labels.at<int>((int)sampleIdx);
    }
}

これで、すべての面の距離とラベルが出力されます。すべての予測関数は、最短距離 (最小の数値) で写真を撮り、それを答えとして返すように見えるので、結果のリストを取得し、並べ替えて、最初の 10 個の結果を取得できます。または、最初の 10 個のラベルなどを取得できます。これにより、最初の X 結果ではなく、すべてのデータにアクセスできるようになります。

私も追加しました

#include <iostream>

using namespace std;

ファイルの先頭に追加して、cout を使用できるようにします。

于 2013-03-26T07:32:18.380 に答える
0

Q1 :: OpenCVにはデフォルトの関数がないため、距離とラベルを持つベクトルを作成して独自の関数を作成する必要があります。以下のように独自の関数を記述し、距離とラベルをベクトルに格納できます。ここでは、opencvを再構築する必要があります。

virtual void predict(InputArray src, int &label, double &confidence,  Vector <variable>) const = 0;
于 2013-01-22T12:21:07.570 に答える