人脸对齐--采用dlib库的68_face_landmark进行人脸对齐操作

简单说说人脸对齐操作的部分作用
人脸对齐操作的目的就是能够把检测到的水平角度不正的人脸采用数学的方式进行角度的纠正。从而,在一定程度上提升后期人脸识别的精确度。

人脸对齐操作的基本步骤

  • 人脸检测
  • 人脸关键点信息检测(眼睛,鼻子,嘴巴,下吧等…)
  • 人脸对齐

人脸对齐的方法有很多,本文只是采用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模型的路径即可)

对齐效果图展示:

  • 原图
    在这里插入图片描述
  • 对齐后的人脸
    在这里插入图片描述
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值