使用OpenCV和Keras进行人脸比较(不是识别或检测)?

12
首先,这是我关于此问题的github链接
以下是我的问题:
我想使用Python编写人脸比较功能。使用OpenCV,我可以成功地识别出人脸。现在,如何进行比较呢
我的理解是:
在一般的机器学习方法中,我需要收集关于该特定人物的大量数据,并使用CNN将其确定下来。
但是,我只有两张图片,我应该如何进行比较? 应该考虑分类或聚类(使用KNN)吗?
非常感谢您提前的帮助。
4个回答

20
您可以使用面部嵌入的概念,例如在高引用论文FaceNet中提出并在OpenFace中实现(也预先训练)。
总体思路:采用一些预处理的面部图像(正面,裁剪等),将其嵌入到具有以下特征的较低维度中,即输入中类似的面部应在输出中具有较低的欧几里得距离。
因此,在您的情况下,使用嵌入CNN将您的面部映射到降维空间(通常是大小为128的向量),并像欧几里得空间一样计算距离。当然,您还可以对面孔进行聚类,但这不是您的任务。
除了总体思路之外,好处在于openface是一个不错的实现,可以直接使用,并且它的主页还解释了这个想法:
使用深度神经网络来表示(或嵌入)128维单位超球面上的面部。
嵌入是任何人脸的通用表示形式。与其他面部表示不同,该嵌入具有良好的属性,即两个面部嵌入之间的较大距离意味着这些面部很可能不属于同一个人。
这种属性使聚类、相似性检测和分类任务比其他面部识别技术更容易,其中特征之间的欧几里得距离没有意义。
他们甚至在here上有一个比较演示。

5

我使用了DeepFace
它已经默认提供了一个人脸比较器:

from deepface import DeepFace

f1 = "/Users/face/path/face1.jpg"
f2 = "/Users/face/path/face2.jpg"
backends = ['opencv', 'ssd', 'dlib', 'mtcnn', 'retinaface', 'mediapipe']
result = DeepFace.verify(img1_path=f1, img2_path=f2, detector_backend=backends[1])

输出结果如下:
{'verified': True,
'distance': 0.2304540972887159,
'threshold': 0.4,
'model': 'VGG-Face',
'detector_backend': 'ssd',
'similarity_metric': 'cosine'}

如果两张照片中有两个不同的人,返回False。

注意:ssdretinaface更加精确但速度较慢,opencv非常快速但可能会漏检。


有一件事我忘了告诉你:第一次运行DeepFace中包装的每个模型时,它会下载模型权重和参数文件。所以如果第一次执行时间太长,请不要惊慌... - Skulas

5

您需要学习人脸相似性度量。这将允许提取用于区分不同人的良好特征。然后,您将能够找到它们之间的差异(距离)。例如,您可以在这里阅读更详细的信息。kNN和类似的工具可用于查找相似面孔的组,但需要使用先前提取的特征。


1
使用face_recognition库(比较人脸特征)来进行编码比较,并返回布尔值。

1
目前你的回答不够清晰。请编辑并添加更多细节,以帮助其他人理解它如何回答所提出的问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接