Классификатор распознавания лиц

Ссылаясь на предыдущий сообщение, метод, используемый для классификации, был евклидово расстояние с ближайшим соседом. Однако полученный результат не является точным, поскольку как известный набор данных, так и неизвестный набор данных дают сходство 99%. Даже с расстоянием Махаланобиса также дает аналогичный результат.

Есть ли другой метод классификации по распознаванию лиц? Не могли бы вы дать мне несколько примеров / формул?

float d_i = projectedTestFace[i] - projectedTrainFaceMat->data.fl[iTrain*nEigens + i];
distSq += d_i*d_i; // Euclidean distance

0

Решение

imho, если вы получите плохие результаты, обвините ваш вклад, а не формулу расстояния

без какой-либо дополнительной предварительной обработки (выравнивание, обрезка, выравнивание) даже простая норма L2 по пикселям дает лучшие результаты, чем собственные грани. (грустная правда здесь)

начиная с 2.4.2, opencv имеет распознавание лица из коробки. (также с альтернативными функциями fisher и lbph)

Вы, вероятно, должны использовать это, вместо того, чтобы катить свой собственный (и, пожалуйста, используйте API C ++, а не тайный C).

если вы хотите придерживаться собственных граней, вы все равно можете попробовать расстояние L2 между «восстановленным» (из собственных векторов) изображением и тестовым изображением в качестве меры достоверности, так как сделано здесь (снова Шервином)

1

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

// 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.

0