Opencv — можно ли использовать Fisherfaces или Eigenfaces для распознавания объектов, не являющихся лицами?

Я экспериментировал с распознаванием лиц, используя алгоритм 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

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]