人脸识别分类器

时间:2014-04-10 05:50:16

标签: c++ c opencv classification face-recognition

通过参考前面的post,用于分类的方法是欧几里德距离与最近邻。然而,获得的结果并不准确,因为已知数据集和未知数据集都给出99%的相似性。即使与马哈拉诺比斯距离也给出了类似的结果。

脸部识别分类还有其他方法吗?你能给我一些例子/公式吗?

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

2 个答案:

答案 0 :(得分:1)

imho,如果你得到不好的结果,责怪你的输入,而不是距离公式

没有任何进一步的预处理(对齐,裁剪,均衡),甚至像素上的普通L2范数也能提供比特征脸更好的结果。 (这里有可悲的事实)

从2.4.2开始,opencv有face-recognition out of-the-box。 (还有其他渔民和lbph特征)

你可能应该使用它,而不是自己滚动(请使用c ++ api,而不是奥术c)。

如果你想坚持使用特征脸,你仍然可以尝试“重建”(来自特征)图像和测试图像之间的L2距离作为置信度量,如done here(再由shervin,再次)

答案 1 :(得分: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代表。