Обращаясь к предыдущему сообщению, метод, используемый для классификации, был Euclidean Distance with Nearest Neighbor. Однако полученный результат не является точным, поскольку как известный набор данных, так и неизвестный набор данных дают сходство 99%. Даже с расстоянием Махаланобис дает аналогичный результат.
Есть ли другой метод классификации распознавания лиц? Не могли бы вы предоставить мне несколько примеров/формул?
float d_i = projectedTestFace[i] - projectedTrainFaceMat->data.fl[iTrain*nEigens + i];
distSq += d_i*d_i; // Euclidean distance
imho, если вы получаете плохие результаты, обвините свой вход, а не формулу расстояния
без какой-либо дополнительной предварительной обработки (выравнивание, обрезка, выравнивание) даже обычная норма L2 над пикселями дает лучшие результаты, чем собственные. (печальная правда здесь)
поскольку 2.4.2, opencv имеет распознавание лиц из коробки. (также с альтернативными возможностями рыбалки и lbph)
вы, вероятно, должны использовать это, вместо того, чтобы кататься самостоятельно (и, пожалуйста, используйте c++ api, а не тайную c).
если вы хотите придерживаться собственных границ, вы все равно можете попробовать расстояние L2 от "восстановленного" (от собственного) изображения и тестового изображения в качестве меры уверенности, как это делается здесь (через шервин, опять же)
// Compare two images by getting the L2 error (square-root of sum of squared error).
double getSimilarity(const Mat A, const Mat B)
{
if (A.rows > 0 && A.rows == B.rows && A.cols > 0 && A.cols == B.cols) {
// Calculate the L2 relative error between the 2 images.
double errorL2 = norm(A, B, CV_L2);
// Convert to a reasonable scale, since L2 error is summed across all pixels of the image.
double similarity = errorL2 / (double)(A.rows * A.cols);
return similarity;
}
else {
//cout << "WARNING: Images have a different size in 'getSimilarity()'." << endl;
return 100000000.0; // Return a bad value
}
}
Интересно, почему я всегда получаю возврат 100000000. Означает ли это, что предварительно обработанное и реконструированное лицо имеет размер разности? Почему он пропускает сравнение расстояний L2?
Ниже приведены некоторые из моих кодов:
Mat j =projectedTestFace[i];
Mat k =projectedTrainFaceMat>data.fl[iTrain*nEigens + i];
similarity=getSimilarity(j,k);
без выражения else, я получаю результат сходства = -nan, задаваясь вопросом, что означают -nan и -inf.
data.fl[iTrain*nEigens + i]
, так как iTrain*nEigens + i
для меня не выглядит действительным индексом)