【发布时间】:2012-09-05 23:47:23
【问题描述】:
我刚刚认出了一些带有cv2.createEigenFaceRecognizer 的面孔。
但我想知道输入面与计算出的特征面有多少相似之处。
这个想法是您可以重新识别不在数据库中的人。
编辑:
例如:我在模型上训练了面部 A、B 和 C,然后我看到了面部 C 和 D。我希望能够区分面部 C 和 D。
谢谢!
【问题讨论】:
我刚刚认出了一些带有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、CAND 上训练您的模型,那么您正在使用阈值,那么对 D 的预测应该会产生 -1,而A、B 或C 应该被识别。鉴于您正在使用阈值这一事实。
至于在不重新估计整个模型的情况下迭代地添加新面孔。这对于 Eigenfaces 或 Fisherfaces 方法是不可能的。你总是需要调用FaceRecognizer::train 这两种算法来学习模型。您可以使用cv2.createLBPHFaceRecognizer 创建的局部二进制模式直方图 (LBPH) 模型支持更新模型,而无需重新计算其他训练样本。请参阅 API 文档:
【讨论】:
help(cv2.createFaceRecognizer)会报错,因为没有模块createFaceRecognizer,折腾了好久才放弃搜索源码。
cv2.createFaceRecognizer 之类的方法,这就是您收到错误的原因。查看上述答案中链接的 API 文档,了解哪些功能可用。