0

我一直在尝试使用 Fisherfaces 算法作为模型进行人脸识别,并想看看是否可以将其应用于非人脸对象。我看到我的应用程序工作如下:

  1. 创建对象的一组图像(垫子)并将它们保存到具有对象身份的共同响应索引的目录中。
  2. 将目录内容加载为 Mats,将其排序为数组并将其传递给模型进行训练。
  3. 从模型中获取特征向量和平均垫并用它重建对象。
  4. 比较重建对象与原始对象的相似性并预测身份。

这是我将用于培训的代码(第 2 步):

//check if the contrib module is available first
bool contribModelStatus = initModule_contrib();
if ( !contribModelStatus )
    exit(1);

//define the model
Ptr<FaceRecognizer> model;
model = Algorithm::create<FaceRecognizer>(recAlgorithmFisherfaces);
//check if the model was loaded properly
if (model.empty())
    exit(1);

//train the model
model->train(objectsArray, labelsArray); 

用于识别(步骤 3):

Mat eigenvectors = model->get<Mat>("eigenvectors");
Mat average = model->get<Mat>("mean");

int height = obj.rows;

//define a projection Mat based on the eigenvectors, avarage object and the object we'll like to test
Mat projection = subspaceProject(eigenvectors, average, obj.reshape(1,1));
//reconstruct the projection and reshape it.
Mat reconstructionRow = subspaceReconstruct(eigenvectors, average, projection);
Mat reconstructionMat = reconstructionRow.reshape(1, height);
Mat reconsructedObj = Mat(reconstructionMat.size(), CV_8U);
reconstructionMat.convertTo(reconsructedObj, CV_8U, 1, 0 );

对于预测(第 4 步):

// ... compeare the similarity of the reconstructionMat to the original object and predict
double similarity = getSimilarity(recognizeMat, reconsructedObj);
float obj_treshold = 0.7f;
check if the similarity is larger then the treshold
f (similarity > obj_treshold) {
    identity = model->predict(recognizeMat);
    cout << "Object identity: " << toString(identity) << endl;
} else {
    cout << "unidentified object" << endl;
}

我在尝试这个时遇到了一些错误 - 我认为这与我没有训练大量数据的事实有关,但是我的问题是这对于不是人脸的对象是否可靠,或者人脸识别算法是否可靠仅适用于面部,opencv 中是否有不同的算法可用于识别非面部对象。

这是我遇到的错误的链接。 http://lab.onetwoclick.com/stuff/stackoverflow/opencv_Fisherfaces_Eigenfaces.jpg

4

0 回答 0