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

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

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

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

person Newbiesss    schedule 10.04.2014    source источник


Ответы (2)


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

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

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

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

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

person berak    schedule 10.04.2014
comment
Я сделал выравнивание, изменение размера и гистограмму, но результат все тот же. Я пробую расстояние L2, но полученный результат -нан @berak - person Newbiesss; 11.04.2014

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

person Newbiesss    schedule 11.04.2014
comment
Означает ли это, что предварительно обработанное и реконструированное лицо имеют разный размер? - да. но, пожалуйста, не пропустите это, вместо этого отрегулируйте размер изображения - person berak; 11.04.2014
comment
Mat k это что-то пороговое? (я не понимаю: data.fl[iTrain*nEigens + i] , так как iTrain*nEigens + i не выглядит для меня допустимым индексом) - person berak; 11.04.2014
comment
В настоящее время я работаю с кембриджской базой данных лиц, которая имеет стандартный размер 112x92, я также тестирую один из ее образцов 112x92. Понятия не имею, почему это все еще указывает размер разницы. Mat k — это лицо базы данных, которое нужно сравнить с тестовым лицом, Mat k относится к 1-му местоположению собственного лица (хранится в 2D-массиве). Это из моего понимания. Я все еще спрашиваю из предыдущего поста [ссылка] (stackoverflow.com/questions/22791971/) @berak - person Newbiesss; 11.04.2014
comment
хм, такое выражение, как Mat a,b; a = b>17;, определяет порог. я не использую ваше использование '›' там. также data.fl должен относиться к CvMat, а не к cv::Mat. смешивание устаревших функций/структур c-api с C++ — это рецепт катастрофы - person berak; 11.04.2014
comment
о, глядя на вашу предыдущую. пост делает это немного яснее. я думаю, вы взяли это отсюда: float d_i = projectedTestFace[i]-projectedTrainFaceMat>data.fl[iTrain*nEigens + i]; («›» должно было быть «-›» (доступ к указателю), нет? - person berak; 11.04.2014
comment
и нет, вы сравниваете его не с 1-м собственным лицом, а с реконструированным изображением. см. код Шервина здесь и здесь - person berak; 11.04.2014
comment
да, это была моя опечатка, предположительно ->, я путаю API C и C++ в opencv. Я пробовал в C, getSimilarity (const IplImage A, const IplImage B), я получил много ошибок, а .cols .rows не найден. В настоящее время я работаю с Shervin Face Recognition в C API в предыдущем посте, потому что его новая программа в C++ API не поддерживает офлайн-распознавание. @берак - person Newbiesss; 11.04.2014
comment
к, к. в общем, избегайте IplImages и всего устаревшего c-api. действительно, предпочитайте код Mastering_opencv старому веб-сайту Шервина (или тому, что вы найдете на SO) - person berak; 11.04.2014
comment
не используйте-c-api. (только дебилы стреляют в ногу дважды, чтобы быть уверенным) - person berak; 11.04.2014