目录
- 1. 前言
- 2. 人脸对齐基本原理与步骤
- 3. 人脸对齐代码实现
1. 前言
在做人脸识别的时候,前期的数据处理过程通常会遇到一个问题,需要将各种人脸从不同尺寸的图像中截取出来,再进行人脸对齐
操作:即将人脸截取出来并将倾斜的人脸处理成正常的姿态。这样可以使每一个截取的人脸中的眼睛等位置处于同一位置,会对后面的识别算法起到一定的优化作用。
比如,下面3张图片所示,人脸的位置、图像的大小各不一样。我们需要做的就是将人脸从各个图片中截取出来,再进行旋转校正,使得眼睛在同一水平位置上,最后将人脸区域的图片大小也统一调整为224x 224。
人脸对齐前照片:
人脸对齐后照片:
2. 人脸对齐基本原理与步骤
人脸对齐主要包括以下几个步骤:
1,提取出每张图片里眼睛的坐标,进行读取数据
2,找两眼间的直线距离并计算该直线与水平线之间的夹角,即倾斜角度3,根据找到的倾斜角度旋转图片
4,在旋转后的图片中找到眼睛的位置
5,根据眼睛坐标找到包含面部的框的宽度和高度,调整图片的尺寸
3. 人脸对齐代码实现
我们可以根据以上步骤去实现人脸对齐,但是过程可能较为复杂。此处我们使用更为简便的一种方法进行实现。
在imutils
库中集成了一个人脸对齐的类FaceAligner
,我们直接使用它进行进行人脸对齐处理,代码如下:
# coding:utf-8
#人脸对齐:利用dlib的模型可以识别出图片中的人脸,为方便后续处理,片中的人脸截取出来并将倾斜的人脸处理成正常的姿态。
#imutils库中集成了一个人脸对齐的类FaceAligner,我们直接使用它进行处理。
from imutils.face_utils import FaceAligner
from imutils.face_utils import rect_to_bb
import imutils
import dlib
import cv2# initialize dlib 's face detector (HOG-based) and then create
# the facial landmark predictor and the face aligner
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
fa = FaceAligner(predictor, desiredFaceWidth=256)
# load the input image,resize it, and convert it to grayscale
image = cv2.imread('2.jpg')
image = imutils.resize(image, width=800)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# show the original input image and detect faces in the grayscale#image
cv2.imshow( "Input", image)
#返回人脸,(灰度图,采样次数)
rects = detector(gray,2)
#loop over the face detections
for rect in rects :# extract the ROI of the *original* face, then align the face# using facial landmarks(x, y, w, h) = rect_to_bb(rect)faceOrig = imutils.resize(image[y:y + h, x: x + w], width = 256)faceAligned = fa.align(image, gray, rect)# display the output imagescv2.imshow("Original", faceOrig)cv2.imshow("Aligned", faceAligned)cv2.waitKey(0)
可以看到,人脸对齐后可以将倾斜状态的人脸,很好的变为竖直状态的人脸,效果还是很好的。
如果文章对你有帮助,感谢点赞+关注!
欢迎关注下方GZH:阿旭算法与机器学习,共同学习交流~