简单说说人脸对齐操作的部分作用
人脸对齐操作的目的就是能够把检测到的水平角度不正的人脸采用数学的方式进行角度的纠正。从而,在一定程度上提升后期人脸识别的精确度。
人脸对齐操作的基本步骤
- 人脸检测
- 人脸关键点信息检测(眼睛,鼻子,嘴巴,下吧等…)
- 人脸对齐
人脸对齐的方法有很多,本文只是采用dlib库提供的68点关键点信息检测的模型来实现人脸对齐操作,本人能力和技术有限,代码和思路供大家参考和学习,不足之处还请多多谅解!!互相学习!!
直接上代码
注意:需要提前安装好dlib库
(代码的功能: 批量对文件夹内的人脸照片进行人脸检测以及人脸对齐操作,并且将检测和对齐好的人脸保存至指定目录)
face_alignment.py
# -*-coding: utf-8-*-
# author: HXY
"""
采用68个关键点进行批量图片中人脸对齐操作
"""
import os
import sys
import dlib
import logging
import time
import numpy as np
from cv2 import cv2 as cv2
def logset():
#设置日志格式
logging.basicConfig(level=logging.INFO, format='%(asctime)s -%(filename)s:%(lineno)d - %(levelname)s - %(message)s')
def load_model():
'''
1. 加载需要对齐的人脸照片;
2. 加载特征点检测模型
'''
current_path = os.getcwd()
logging.debug(current_path + '\n')
model_path = current_path + '/main/dlib_model/shape_predictor_68_face_landmarks.dat'
detector = dlib.get_frontal_face_detector()
landmark = dlib.shape_predictor(model_path)
logging.info('Landmark model load sucessed !!!')
return detector, landmark
def face_aligniment(file_path, save_path):
'''
对文件夹中的照片进行批量的人脸对齐操作
'''
logging.info('Begin to alignment faces !!!')
imgs = os.listdir(file_path)
for img in imgs:
img_full_path = file_path + '/' + img
bgr_imgs = cv2.imread(img_full_path)
if bgr_imgs is None:
logging.warn('Load pics failed !!! Please check file path !!!')
exit()
# 照片颜色通道转换:dlib检测的图片空间是RGB, cv2的颜色空间是BGR
rgb_imgs = cv2.cvtColor(bgr_imgs, cv2.COLOR_BGR2RGB)
face_location = detector(rgb_imgs, 1)
if len(face_location) == 0:
logging.warn('No face detected in pic: {}'.format(img_full_path))
continue
# 人脸关键点检测
face_keypoints = dlib.full_object_detections()
for location in face_location:
face_keypoints.append(landmark(rgb_imgs, location))
# 人脸对齐
alignmented_face = dlib.get_face_chips(rgb_imgs, face_keypoints, size=120)
logging.info('Alignment face sucessed: {}'.format(img_full_path))
# 保存对齐后的人脸照片
for image in alignmented_face:
rgb_img = np.array(image).astype(np.uint8)
bgr_img = cv2.cvtColor(rgb_img, cv2.COLOR_RGB2BGR)
cv2.imwrite(save_path + str(img.split('.')[0]) + '.jpg', bgr_img)
cv2.destroyAllWindows()
if __name__ == '__main__':
logset()
detector, landmark = load_model()
save_path = 'aligmented/'
if not os.path.exists(save_path):
os.mkdir(save_path)
start = time.time()
face_aligniment(file_path='./main/alignment',
save_path=save_path)
end = time.time()
logging.info('Operate Finished !!! Costed time:{} s'.format(end-start))
(ps: 使用代码时,只需要修改需要对齐操作的人脸照片路径、照片存储路径以及68_points模型的路径即可)
对齐效果图展示:
- 原图
- 对齐后的人脸