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

问题描述

我正在进行一个face recognition项目,在该项目中我识别出正在运动的人的脸,这意味着该人一直在运动,我必须检测并识别出脸。

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

enter image description here

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

解决方法

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

,

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

步骤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,cv2.NORM_MINMAX)

第3步:从norm_imgcaffemodel

这种方法可以大大提高准确性。

,

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

假设您有以下图片:

enter image description here

如何找到面孔?还是脸在哪里?

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

如果我们应用GaussianBlur

enter image description here

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

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的功能找到。因此,您的方法必须检测以下图像。否则,您应该更改方法。

enter image description here

  • 应用高斯模糊

enter image description here

  • 检测脸部

enter image description here

  • 使用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,h) in faces:
    img = cv2.rectangle(img,(255,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()

可能的问题 为什么不提及面部对齐?

最具挑战性的事实是面部识别中的闪电效应。如果您的方法能够解决问题,那么您所能做的就是用更多样本来训练网络,或者您可以使用经过预先训练的网络。

,

根据google的研究,人脸对齐将模型成功率提高了近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")

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...