我在代码中使用特征脸(PCA)进行人脸识别。我使用了OpenCV网站上的教程作为参考。虽然这对于识别人脸非常有用(即它可以正确地告诉您谁是谁),但基于置信度分数的人脸验证(或冒名顶替者检测 - 验证人脸是否已注册在训练集中)根本不起作用。
我计算欧几里德距离并将其用作置信度阈值。还有其他方法可以计算置信阈值吗?我尝试使用马哈拉诺比斯距离,如中提到的http://www.cognotics.com/opencv/servo_2007_series/part_5/page_5.html http://www.cognotics.com/opencv/servo_2007_series/part_5/page_5.html,但它产生了非常奇怪的值。
PS:像face.com 这样的解决方案可能不适合我,因为我需要在本地完成所有操作。
您可以使用以下命令将新的输入面投影到特征空间上subspaceProject()
函数,然后使用特征空间生成重建的面subspaceReconstruct()
然后比较相似程度输入面和重建面是。已知的人脸(训练数据集中的人脸)的重建图像将更类似于输入面比冒名顶替者的脸。
您可以设置相似度阈值进行验证。
这是代码:
// Project the input face onto the eigenspace.
Mat projection = subspaceProject(eigenvectors, FaceRow,input_face.reshape(1,1));
//Generate the reconstructed face
Mat reconstructionRow = subspaceReconstruct(eigenvectors,FaceRow, projection);
// Reshape the row mat to an image mat
Mat reconstructionMat = reconstructionRow.reshape(1,faceHeight);
// Convert the floating-point pixels to regular 8-bit uchar.
Mat reconstructed_face = Mat(reconstructionMat.size(), CV_8U);
reconstructionMat.convertTo(reconstructed_face, CV_8U, 1, 0);
然后,您可以使用以下命令比较输入人脸和重建人脸cv::norm()
。例如:
// Calculate the L2 relative error between the 2 images.
double err = norm(input_face,reconstructed_face, CV_L2);
// Convert to a reasonable scale
double similarity = error / (double)(input_face.rows * input_face.cols);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)