Opencv 关于人脸验证(相对于人脸识别)的置信度评分有什么建议吗?

Opencv 关于人脸验证(相对于人脸识别)的置信度评分有什么建议吗?,opencv,face-recognition,Opencv,Face Recognition,我在代码中使用特征脸(PCA)进行人脸识别。我使用OpenCV网站上的教程作为参考。虽然这对于识别人脸非常有效(即它可以告诉你谁是正确的),但基于置信度评分的人脸验证(或冒名顶替者检测-验证人脸是否已注册到训练集中)根本不起作用 我计算一个欧几里德距离,并将其用作置信阈值。有没有其他方法可以计算置信阈值?我尝试使用中提到的马氏距离,但它产生了非常奇怪的值 PS:像face.com这样的解决方案可能对我不起作用,因为我需要在本地完成所有工作。除了PCA(线性判别分析)或本地二进制模式(LBP)之外

我在代码中使用特征脸(PCA)进行人脸识别。我使用OpenCV网站上的教程作为参考。虽然这对于识别人脸非常有效(即它可以告诉你谁是正确的),但基于置信度评分的人脸验证(或冒名顶替者检测-验证人脸是否已注册到训练集中)根本不起作用

我计算一个欧几里德距离,并将其用作置信阈值。有没有其他方法可以计算置信阈值?我尝试使用中提到的马氏距离,但它产生了非常奇怪的值


PS:像face.com这样的解决方案可能对我不起作用,因为我需要在本地完成所有工作。

除了PCA(线性判别分析)或本地二进制模式(LBP)之外,你可以研究其他特征提取算法

LDA模型类间变化和LBP是一个照明不变的描述符。您可以在OpenCV中实现这两种算法。检查下面的链接


您可以使用
子空间项目()
函数将新的输入面投影到特征空间,然后使用
子空间结构()
从特征空间生成重构面,然后比较输入面重构面的相似程度。已知人脸(训练数据集中的人脸)的重建图像将比冒名顶替者的人脸更类似于输入_人脸。 您可以设置用于验证的相似性阈值。 代码如下:

// 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);