《人脸识别之川剧变脸》学习任务单
(建议课时:2)
学 校:__________________________
姓 名:__________________________
班 级:__________________________
活动 1:基于 Dlib实现人脸检测
运行以下程序,基于 Dlib实现人脸检测,了解其检测结果的含义是什么:
# 首先,初始化一个 HOG人脸检测器
detector = dlib.get_frontal_face_detector()
# 读取图像
image = cv2.imread('./data/face-pics/pic0.png')
# 转换图像为灰度(Dlib人脸检测器需要灰度图像)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 使用检测器检测人脸
faces = detector(gray, 0)
# 遍历检测到的人脸并用矩形框出
for face in faces:
x, y, w, h = face.left(), face.top(), face.width(), face.height()
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.axis('off') # 隐藏坐标轴
plt.show()
活动 2:基于人脸检测的脸谱绘制
补全以下程序并运行,实现基于人脸检测的脸谱绘制,观察绘制效果是否如
意?分析可能的原因以及如何解决?
from utils.mask_controller import Mask
mask = Mask('./data/masks/')
# 读取图像并转为灰度
image = cv2.imread('./data/face-pics/pic0.png')
img_gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
# 检测视频画面中的人脸
faces = detector(img_gray, 0)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
'''
请在此处补全程序,为每张人脸绘制脸谱
'''
for face in faces:
plt.imshow(image)
plt.axis('off') # 隐藏坐标轴
plt.show()
活动 3:为摄像头界面组件绑定 check_keypoints
我们导入面部关键点检测模型 shape_predictor_68_face_landmarks之后,并以
了一个 check_keypoints函数,用于检测并绘制面部关键点,请补全以下程序,将
check_keypoints绑定到 image_recorder上,每次捕获一张图像就触发这个函数:
'''
编写程序,将上述流程绑定到 image_recorder上,每次捕获一张图像就执行上述流程
'''
任务四:模型构建与训练
我们我们来实现一个 cover_facial_mask函数,用于绘制和切换脸谱,请在下一
段程序中补全核心程序,根据面部关键点坐标计算脸谱的尺寸(高度、宽度)以
及位置(y,x)。运行程序,与之前的脸谱绘制效果对比,是否有了提升?
# 接下来,我们来实现一个 cover_facial_mask函数,用于绘制和切换脸谱
def cover_facial_mask(_):
.
.
.
'''
请在此处补全程序
'''
# 计算脸谱的尺寸
mask_height =
mask_width =
# 定位脸谱的位置 (y, x)
mask_position =
.
.
.
推荐的学习资源:
1. Dlib官方网站:http://dlib.net/.
2. Dlib frontal_face_detector:https://github.com/davisking/dlib-models.
3. OpenCV官方网站:https://opencv.org.
4. 《Python人脸识别:从入门到工程实践》,王天庆,机械工业出版社,2019,
978-7-111-62385-4.
课后作业
在学习中,我们仅实现了单个人脸的川剧变脸效果。现在请你尝试将其改造
为多人版,即对于视频画面中的每一张人脸都能实现变脸效果。
提示:在关键点检测部分,我们实现了同时给多张人脸标定关键点;在变脸部分,我们
实现了单张人脸的川剧脸谱切换效果;将二者结合起来,分析 check_keypoints()和
cover_facial_mask()的核心程序,即可实现多人版。
我的收获: