前言
好想玩点不一样的,感觉平常的已经不能吸引大家了。想了又想,我今天给大家分享如何给人像添加口罩吧。毕竟最近疫情那么
严重,也只能玩玩这个了,大家千万别乱跑啊。
效果展示
数据集展示
数据集来源:使用了开源数据集FaceMask_CelebA
github地址:https://github.com/sevenHsu/FaceMask_CelebA.git
部分人脸数据集:
口罩样本数据集:
为人脸照片添加口罩代码
这部分有个库face_recognition需要安装,如果之前没有用过的小伙伴可能得费点功夫。
Face Recognition 库主要封装了dlib这一 C++ 图形库,通过 Python 语言将它封装为一个非常简单就可以实现人脸识别的 API
库,屏蔽了人脸识别的算法细节,大大降低了人脸识别功能的开发难度。
Python学习交流Q群:906715085###
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : 2014Vee
import os
import numpy as np
from PIL import Image, ImageFile
__version__ = '0.3.0'
IMAGE_DIR = os.path.dirname
('E:/play/FaceMask_CelebA-master/facemask_image/')
WHITE_IMAGE_PATH = os.path.join
(IMAGE_DIR, 'front_14.png')
BLUE_IMAGE_PATH = os.path.join(IMAGE_DIR,
'front_14.png')
SAVE_PATH = os.path.dirname
('E:/play/FaceMask_CelebA-
master/save/synthesis/')
SAVE_PATH2 = os.path.dirname
('E:/play/FaceMask_CelebA-
master/save/masks/')
class FaceMasker:
KEY_FACIAL_FEATURES = ('nose_bridge',
'chin')
def __init__(self, face_path,
mask_path, white_mask_path, save_path,
save_path2, model='hog'):
self.face_path = face_path
self.mask_path = mask_path
self.save_path = save_path
self.save_path2 = save_path2
self.white_mask_path =
white_mask_path
self.model = model
self._face_img: ImageFile = None
self._black_face_img = None
self._mask_img: ImageFile = None
self._white_mask_img = None
def mask(self):
import face_recognition
face_image_np =
face_recognition.load_image_file
(self.face_path)
face_locations =
face_recognition.face_locations
(face_image_np, model=self.model)
face_landmarks =
face_recognition.face_landmarks
(face_image_np, face_locations)
self._face_img = Image.fromarray
(face_image_np)
self._mask_img = Image.open
(self.mask_path)
self._white_mask_img = Image.open
(self.white_mask_path)
self._black_face_img = Image.new
('RGB', self._face_img.size, 0)
found_face = False
for face_landmark in face_landmarks:
# check whether facial features meet requirement
skip = False
for facial_feature in self.KEY_FACIAL_FEATURES:
if facial_feature not in face_landmark:
skip = True
break
if skip:
continue
# mask face
found_face = True
self._mask_face(face_landmark)
if found_face:
# save
self._save()
else:
print('Found no face.')
def _mask_face(self, face_landmark: dict)