我刚刚认识了cv2.createEigenFaceRecognizer
的一些面孔。
但是我要知道的是输入的人脸多少看起来像计算出的特征脸。
这个想法是,您可以重新识别不在数据库中的人员。
编辑:
例如:我在模型上训练了A,B和C面,然后看到了C和D面。我希望能够将C面与D面区分开。
谢谢!
最佳答案
您可以在cv::FaceRecognizer
的文档中找到有关设置阈值的部分,位于:
它与OpenCV Python包装器的工作原理相同,在Python中调用
help(cv2.createFaceRecognizer)
时可以很容易地看到它:Help on built-in function createEigenFaceRecognizer in module cv2:
createEigenFaceRecognizer(...)
createEigenFaceRecognizer([, num_components[, threshold]]) -> retval
因此,在代码中,您将创建一个带有阈值的模型,我将其设置为
100.0
。低于此值的任何内容都将在预测中生成-1
,这意味着此面孔为unknown
:# Create the Eigenfaces model. We are going to use the default
# parameters for this simple example, please read the documentation
# for thresholding:
model = cv2.createEigenFaceRecognizer(threshold=100.0)
如演示中所示,您可以通过以下方式获得预测和相关的置信度(即到您的训练数据集中最近的邻居的距离):
[predicted_label, predicted_confidence] = model.predict(image)
因此,如果您在使用阈值的主题
A
,B
,C
和上训练模型,则对D
的预测应产生-1
,而应识别A
,B
或C
。鉴于事实,您正在使用阈值。至于迭代添加新面孔而无需重新估计整个模型。对于本征面或Fisherfaces方法而言,这是不可能的。您始终必须为这两种算法调用
FaceRecognizer::train
来学习模型。您可以使用cv2.createLBPHFaceRecognizer
创建的本地二进制模式直方图(LBPH)模型支持更新模型而无需重新计算其他训练样本。请参阅以下API文档:关于python - openCV的特征脸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12291243/