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

0

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

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

float d_i = projectedTestFace[i] - projectedTrainFaceMat->data.fl[iTrain*nEigens + i];
distSq += d_i*d_i; // Euclidean distance
Теги:
opencv
classification
face-recognition

2 ответа

1

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

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

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

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

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

  • 0
    Я сделал выравнивание, изменение размера и выравнивание гистограммы, но результат все тот же. Я пробую расстояние L2, но полученный результат "-nan" @berak
0
// 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
    «Значит ли это, что предварительно обработанное и реконструированное лицо имеет разный размер?» - да. но, пожалуйста, не пропустите это, вместо этого отрегулируйте размер изображения
  • 0
    Mat k является чем-то пороговым? (я не получаю: data.fl[iTrain*nEigens + i] , так как iTrain*nEigens + i для меня не выглядит действительным индексом)
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню