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

2024-05-07 04:02:34 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

enter image description here

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


Tags: 项目方法图像示例地方错误情况人脸
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)

第三步:norm_imgcaffemodel

这种方法可以显著提高精度

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

最好的预处理方法是去除闪电效应

假设您具有以下图像:

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,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()

可能的问题你为什么不提到面部对齐

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

相关问题 更多 >