我刚刚认出了一些面孔cv2.createEigenFaceRecognizer
。但我想知道输入面与计算出的特征面有多少相似之处。这个想法是您可以重新识别不在数据库中的人。
编辑:
例如:我在模型上训练了 A、B 和 C 面,然后我看到 C 和 D 面。我希望能够区分 C 面和 D 面。
谢谢你!
您可以在以下文档中找到有关设置阈值的部分cv::FaceRecognizer
:
它对 OpenCV Python Wrapper 的工作方式相同,在 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
应该被识别。鉴于您正在使用阈值这一事实。
至于在不重新估计整个模型的情况下迭代地添加新面孔。这对于 Eigenfaces 或 Fisherfaces 方法是不可能的。你总是需要调用FaceRecognizer::train
这两种算法来学习模型。您可以使用 创建的局部二进制模式直方图 (LBPH) 模型cv2.createLBPHFaceRecognizer
支持更新模型,而无需重新计算其他训练样本。请参阅 API 文档: