2012-01-06 18 views
2

私は自分のコードで顔認識のために固有顔(PCA)を使用しています。 OpenCVのウェブサイトのチュートリアルを参考にしました。これは、顔を認識するためにはうまくいくが(つまり、誰が正しく人物であるかを示すことができる)、信頼スコアベースの顔照合(または詐称者の検出 - 顔がトレーニングセットに登録されているかどうかを確認する)(顔認識ではなく)顔認証の信頼スコアに関するヒントはありますか?

私はユークリッド距離を計算し、それを信頼限界として使用します。信頼限界を計算する他の方法はありますか?私はhttp://www.cognotics.com/opencv/servo_2007_series/part_5/page_5.htmlで言及されているようにマハラノビス距離を使ってみましたが、かなり奇妙な値を出していました。

PS:私がローカルですべてを行う必要があるため、face.comのようなソリューションはおそらく私にとっては役に立たないでしょう。

答えて

0

LDA(Linear Discriminant Analysis)やローカルバイナリパターン(LBP)のようなPCA以外の特徴抽出アルゴリズムを見ることができます。

LDAモデルのクラス間変動とLBPは照明不変記述子です。これらのアルゴリズムの両方をOpenCVに実装しています。以下のリンクを確認してください。

http://docs.opencv.org/trunk/modules/contrib/doc/facerec/facerec_api.html

2

あなたはsubspaceProject()機能を使用して固有空間への新しい入力面を投影し、その後subspaceReconstruct()を使用してバック固有空間からの再構成顔を生成し、input_facereconstructed_faceがどのように似て比較することができます。既知の顔(訓練データセット内の顔)は、詐称者の顔よりも入力_顔に類似した再構成画像を有する。 検証に類似性のしきい値を設定できます。

// Project the input face onto the eigenspace. 
Mat projection = subspaceProject(eigenvectors, FaceRow,input_face.reshape(1,1)); 

//Generate the reconstructed face 
Mat reconstructionRow = subspaceReconstruct(eigenvectors,FaceRow, projection); 

// Reshape the row mat to an image mat 
Mat reconstructionMat = reconstructionRow.reshape(1,faceHeight); 

// Convert the floating-point pixels to regular 8-bit uchar. 
Mat reconstructed_face = Mat(reconstructionMat.size(), CV_8U); 

reconstructionMat.convertTo(reconstructed_face, CV_8U, 1, 0); 

あなたは、入力顔とcv::norm()を用いて再構成顔を比較することができます: は、ここでは、コードです。例:

// Calculate the L2 relative error between the 2 images. 
double err = norm(input_face,reconstructed_face, CV_L2); 
// Convert to a reasonable scale 
double similarity = error/(double)(input_face.rows * input_face.cols);