选择最强的 SIFT 特征进行人脸识别

Posted

技术标签:

【中文标题】选择最强的 SIFT 特征进行人脸识别【英文标题】:Selecting strongest SIFT features for face recognition 【发布时间】:2019-10-06 08:01:48 【问题描述】:

我正在尝试构建一个识别人脸的 python 代码。我提取了训练人脸和测试人脸的 SIFT 特征,并匹配如下代码:

img1 = cv2.imread("path\of\tested\image")
img2 = cv2.imread("path\of\trained\image")
sift = cv2.xfeatures2d.SIFT_create()
kp1, des1 = sift.detectAndCompute(img1, None)
kp2, des2 = sift.detectAndCompute(img2, None)

# Brute Force Matching
bf = cv2.BFMatcher(cv2.NORM_L1, crossCheck=True)
matches = bf.match(des1, des2)
matches = sorted(matches, key = lambda x:x.distance)
matching_result = cv2.drawMatches(img1, kp1, img2, kp2, matches[:50], None, flags=2)

我想选择其中最强的特征来比较两张脸是否属于同一个人。如何根据 SIFT 特征识别人脸?谁能帮帮我吗?任何提示都可能有用我是初学者。谢谢。

【问题讨论】:

使用 SIFT 特征,一种流行的方法是创建一个 Bag of Visual Words 框架,在其中获取从所有面部检测到的所有特征,然后创建一个字典,通常使用 k-Means。一旦你找到了这些聚类,你就可以为每一张脸找出哪个特征映射到哪个聚类,然后构建一个直方图。您获取这些直方图并训练分类模型。这是一个很好的起点:towardsdatascience.com/…。我会为你写一个完整的答案,但我无权访问你的数据。祝你好运! @rayryeng 是个好主意,我会尝试实现它。非常感谢。 【参考方案1】:

正如@rayryeng 所说,一个很好的解决方案是使用视觉词/特征袋方法。

视觉特征袋 (BoVF) 的灵感来自 自然语言处理 (NLP) 领域中使用的 词袋 (BoW) Information Retrieval (IR),例如,在文本分类中,文档的分类由词的频率给出。

视觉特征包,另一方面,以图像分类为特征,其中图像的分类由视觉特征的频率给出,使其简单且计算量低成本法。

下面我将我的代码留在 GitHub 上,使用 Multilayer Perceptron (MLP)支持的 Bag of Visual Features 方法MNISTCIFAR-10FER-2013 视觉数据集的向量机 (SVM) 分类器。

这些存储库的酷之处在于,您可以测试特征检测和描述任务,不仅可以使用本地描述符 SIFT,还可以使用其他本地描述符(例如,SURFKAZE)和本地二进制描述符(例如,BRIEFORBBRISKAKAZE , FREAK)。

BoVF with MLP Classifier BoVF with SVM Classifier

我没有将代码直接放在这里,因为它会是一个太长的答案。

【讨论】:

如果答案解决了您的问题或者您认为是最佳解决方案,请将此答案标记为已接受!谢谢!

以上是关于选择最强的 SIFT 特征进行人脸识别的主要内容,如果未能解决你的问题,请参考以下文章

eigenface 怎样进行人脸识别

高科技应用之人脸识别人证比对

Apple Vision Framework 识别人脸

人脸识别怎么用

图像人脸检测(框出人脸笑脸眼睛)

android人脸识别活体识别人脸动作活体静默活体Demo源码实现讲解