使用OpenCV和Keras?进行面部比较(非识别或检测)

eqoofvh9  于 2022-11-15  发布在  其他
关注(0)|答案(4)|浏览(204)

首先是我的github link for the question
我的问题是:
我想用Python做一个人脸比较函数。我可以用OpenCV成功地(?)识别人脸。现在,我该怎么做比较呢
我的理解是:
在一般的机器学习方法中,我需要收集关于那个特定的人的大量数据,并使用CNN完成它。
但是,我只得到了两张图片,我该怎么做比较呢?我应该从分类还是聚类的Angular 来考虑(使用KNN)?
非常感谢您的帮助。

jogvjijk

jogvjijk1#

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

ct3nt3jp

ct3nt3jp2#

你需要学习人脸的相似性度量。它将允许提取很好的特征来区分不同的人。然后你将能够找到他们之间的相异度(距离)。你可以阅读更详细的here,例如。kNN和这样的东西是有用的,以找到相似的人脸组,但它需要使用的特征,提取之前。

3duebb1j

3duebb1j3#

使用 face_recognition 库 ( 比较 面部 特征 ) 。 它 将 比较 面部 特征 的 编码 , 并 返回 布尔 值 。

6mw9ycah

6mw9ycah4#

我使用了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 超快,但未命中。

相关问题