Python中人脸识别的预处理方法

Posted

技术标签:

【中文标题】Python中人脸识别的预处理方法【英文标题】:Preprocessing methods for face recognition in Python 【发布时间】:2020-12-14 22:20:24 【问题描述】:

我正在从事一个face recognition 项目,我正在识别运动中的人的面部,这意味着这个人一直在移动,我必须检测和识别面部。

为此,我使用caffemodel 进行人脸检测,并使用改进的knn 方法进行人脸识别。它工作正常,但大多数情况下它会给出错误的识别。因为人在移动,所以很难得到一个好的人脸图像。以下是一些人脸捕捉示例:

相机放置在离人的位置有点远的地方,因为它不是很清晰和正面的脸。人脸图像尺寸为 100x120。我必须使用这些图像进行人脸识别。我想知道是否有人可以指导我在识别之前可以使用的一些预处理方法,以便提高准确性。请帮忙。谢谢

【问题讨论】:

【参考方案1】:

您可以做的最好的预处理方法是消除闪电效果。

假设你有以下图片:

你怎么能找到这张脸?或者脸在哪里?

在目前的情况下,即使是人眼也无法在图像中找到人脸。

如果我们申请GaussianBlur:

至少我们可以看到人脸在图像中的位置。

import cv2

img = cv2.imread('input.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
smooth = cv2.GaussianBlur(gray, (125,125), 0)
division = cv2.divide(gray, smooth, scale=255)
cv2.imwrite('output.jpg',division)

现在,我们如何定位人脸?

上图是一张具有挑战性的图片,您可以在其中测试您的方法。由于上面的图像无法被 Haar 检测到,而face-recognition。如果您的方法找到它,您可以确定您的方法。

例如:

下图可以通过类似 Haar 的特征找到。因此,您的方法必须检测到下图。否则,你应该改变你的方法。

应用高斯模糊

检测人脸

使用 Haar
img = cv2.imread('face_shaded_division.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
face_cascade = cv2.CascadeClassifier('/opencv/data/haarcascades/haarcascade_frontalface_default.xml')

faces = face_cascade.detectMultiScale(img, 1.3, 5)
for (x,y,w,h) in faces:
    img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2)
    roi_gray = gray[y:y+h, x:x+w]
    roi_color = img[y:y+h, x:x+w]
cv2.imwrite('output.png', img)
cv2.imshow('img', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

可能的问题你为什么不提一下面部对齐?

最具挑战性的事实是人脸识别中的闪电效应。如果你的方法解决了这个问题,你所能做的就是用更多的样本训练你的网络,或者你可以使用预训练的网络。

【讨论】:

【参考方案2】:

如果您有不同的退化(模糊、极端姿势、照明等),knn 方法是不好的。如果你有数据,我建议你使用一个经过退化和姿势训练的小型神经网络(Megaface)。它将具有更好的识别精度。当然,您应该为实时应用程序使用较小的网络。除了我的建议之外,还有几种用于人脸识别的预处理方法。第一个是面部对齐,它扭曲面部以获得相同的对齐以获得更好的准确性。为了对齐,有地标预测模型可以在脸上找到 68 个地标点(例如鼻子、眼睛、嘴巴)。但是,在极端姿势(右上角)中对齐是不够的。

【讨论】:

我以前使用过面部对齐,但在我的情况下它并没有给出好的结果。面部对齐在面部正面但稍微向右或向左倾斜的情况下效果最佳,因此我们可以使用对齐来使它们相对于相机对齐。但感谢其他好的建议 是的,我知道。如果您的姿势非常极端,则很难对齐。因此,唯一的选择是使用极端姿势训练的神经网络。然而,即使是最先进的模型也难以识别极端姿势,因为面部识别系统主要使用眼睛和嘴巴区域的属性。所以你应该期待更低的结果。但是,当人脸模糊时,神经网络可以解决您的问题。 谢谢。你能给我指出一些有用的文章/代码来解释所有这些吗?【参考方案3】:

由于您是人脸识别,因此只需要面部细节而不是周围环境。由于误报,周围的物体会降低准确性。 您可以按照以下步骤来提高图像质量:

第 1 步:仅使用 haarcascade

检测人脸
face_cascade = cv2.CascadeClassifier(‘haarcascade_frontalface_default.xml’)
faces_detected = face_cascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=5)
(x, y, w, h) = faces_detected[0]
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 1);
cv2.imshow(img)

第 2 步:裁剪图像

p = 20 #padding 
img_cropped = img[y-p+1:y+h+p, x-p+1:x+w+p]

第 3 步:重塑为原始大小

im_reshape = cv2.resize(img_cropped , (img.shape[0], img.shape[1]), interpolation=cv2.INTER_LINEAR)

第 3 步:标准化图像以固定亮度

norm_img = np.zeros((img.shape[0], img.shape[1]))
norm_img = cv2.normalize(img, norm_img, 0, 255, cv2.NORM_MINMAX)

第 3 步:norm_imgcaffemodel

这种方法可以显着提高准确率。

【讨论】:

Haarcascade 在这种情况下不会工作。正如我所提到的,人脸不是正面的,因此我使用了咖啡模型。但感谢第三步的标准化图像选项。我将测试并查看它对面部图像的影响。谢谢【参考方案4】:

根据谷歌的研究,人脸对齐将模型成功率提高了近 1%。

我建议你使用 deepface。它在后台应用一些预处理步骤,例如检测和对齐。此外,它的人脸识别模块包含了基于深度学习的最先进的人脸识别技术。基于 KNN 的方法不再现代。

#!pip install deepface
from deepface import DeepFace

#real-time web cam implementation
DeepFace.stream("C:/database")

#this will look for img in the my_db and img could be exact image path (c:/img1.jpg) or numpy array.
obj = DeepFace.find(img, db_path = "C:/workspace/my_db", model_name = "VGG-Face")

【讨论】:

【参考方案5】:

deepface.find 的问题在于它会搜索整个图像数据库以找到与当前在帧中检测到的人脸的最佳匹配,使得过程非常缓慢

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于Python中人脸识别的预处理方法的主要内容,如果未能解决你的问题,请参考以下文章

人脸识别原理及处理流程

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

人脸识别的人像处理流程是怎样的?

gabor变换人脸识别的python实现,att_faces数据集平均识别率99%

PCA人脸识别的python实现

人脸识别怎么用