Ell*_*ung 2 python opencv face-recognition convolution neural-network
首先,这是我的问题的github链接.
这是我的问题:
我想用Python做一个面部比较功能.我可以使用OpenCV成功地(?)识别人脸.现在,我该如何做比较呢?
我的理解是这样的:
在一般的机器学习方法中,我需要收集关于该特定人的大量数据并使用CNN完成它.
但是,我刚收到2张图片,我该怎么做比较呢?我应该在分类或聚类方面考虑它(使用KNN)?
非常感谢您的所有帮助.
sas*_*cha 10
您可以使用面部嵌入的概念,例如在高度引用的论文FaceNet中提出并在OpenFace中实现(也是预先训练的).
总的想法:需要一些预处理面(正面,裁剪,...),并且它使嵌入到与特征部分较低维度,即在输入相似的面部应该在输出低欧氏距离.
因此,在您的情况下:使用embedding-CNN将面部映射到缩小的空间(通常是大小为128的向量)并计算距离在欧几里德空间中.当然你也会聚集面孔,但这不是你的任务.
除了一般的想法之外,这里的好处是:openface是一个很好的实现,随时可以使用它的主页也解释了这个想法:
使用深度神经网络在128维单位超球面上表示(或嵌入)面部.
嵌入是任何人脸上的通用表示.与其他面部表示不同,这种嵌入具有良好的特性,即两个面嵌入之间的较大距离意味着面部可能不是同一个人.
此属性使得聚类,相似性检测和分类任务比其他特征之间的欧几里德距离无意义的人脸识别技术更容易.
他们甚至在这里进行了比较演示.
我用过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])
Run Code Online (Sandbox Code Playgroud)
输出将是:
{'verified': True,
'distance': 0.2304540972887159,
'threshold': 0.4,
'model': 'VGG-Face',
'detector_backend': 'ssd',
'similarity_metric': 'cosine'}
Run Code Online (Sandbox Code Playgroud)
如果两张照片中有两个不同的人,则为 False。
请注意, ssd和retinaface更准确,但速度较慢,opencv速度超快,但会丢失。