基于FaceX-Zoo实现的Face Mask Adding人脸戴口罩

人脸系列文章目录

文章目录

  • 人脸系列文章目录
  • 前言
  • 一、加口罩效果
  • 二、实现原理
  • 二、代码实现


前言

目前人脸加口罩均为在人脸位置贴图式的,非常不真实。前段时间京东开源一个基于PRnet实现的3D口罩拟合人脸,加口罩非常逼真,但是只是单独一个加口罩demo,没有完整的流程。于是本人结合人脸检测,关键点对齐。PRnet加口罩实现一个完整的加口罩流程。只需一个命令简单方便调用,实现人脸加口罩。
https://github.com/JDAI-CV/FaceX-Zoo
本人完整代码:https://github.com/zengwb-lx/Face_Mask_Add

一、加口罩效果

下图可以看出效果还是非常逼真的
基于FaceX-Zoo实现的Face Mask Adding人脸戴口罩_第1张图片
基于FaceX-Zoo实现的Face Mask Adding人脸戴口罩_第2张图片
基于FaceX-Zoo实现的Face Mask Adding人脸戴口罩_第3张图片

二、实现原理

基于FaceX-Zoo实现的Face Mask Adding人脸戴口罩_第4张图片
由上图可知a->b->c流程:
1、找到需要加的口罩样式,分割出口罩,得到mask texture
2、通过三维重建生成UC texture map

如下图,8个口罩样式,如需其他的可自己制作:
基于FaceX-Zoo实现的Face Mask Adding人脸戴口罩_第5张图片
由上图可知d->e->f->g流程:
1、输入原始图像和人脸106关键点,三维重建生成人脸UV texture map,
2、结合口罩融合成新的UV texture map
3、通过cv的渲染,生成新的加口罩后的图像

二、代码实现

主要看main.py, 本人将人脸检测,关键点对齐。PRnet加口罩分别写成三个类,简单方便嵌入到自己的项目中
代码如下(示例):

def main():
    show_result = False
    # image_path = './Data/test-data/test1.jpg'
    image_path = './1.png'
    image = cv2.imread(image_path, cv2.IMREAD_COLOR)
    face_detector = FaceDet()  # 人脸检测类
    face_align = FaceAlign()   # 人脸对齐类

    bboxs = face_detector(image)  # 获取人脸bbox
    # print(bboxs)
    image_show = image.copy()
    face_lms = []
    for box in bboxs:   
        # print(box)
        landmarks = face_align(image, box)   #  #获取人脸landmarks
        # print(landmarks, landmarks.shape)
        lms = np.reshape(landmarks.astype(np.int32), (-1))
        # print(lms, lms.shape)
        face_lms.append(lms)
        cv2.rectangle(image_show, (box[0], box[1]), (box[2], box[3]), (0, 0, 255), 2)
        for (x, y) in landmarks.astype(np.int32):
            cv2.circle(image_show, (x, y), 2, (255, 0, 0), -1)
        if show_result:
            cv2.imshow('lms', image_show)
            cv2.waitKey(0)

    # face masker
    is_aug = True
    mask_template_name = '0.png'
    mask_template_name2 = '1.png'
    masked_face_path = 'test1_mask1.jpg'
    face_masker = FaceMasker(is_aug)
    # ======masked one face========
    # 入参原始image,人脸关键点,返回加口罩后的image
    new_image = face_masker.add_mask_one(image, face_lms[0], mask_template_name, mask_template_name)
    # imsave(mask_template_name, new_image)
    plt.imshow(new_image)
    plt.show()

你可能感兴趣的:(人脸检测,人脸识别)