第1关:人脸检测
在前面的几个实训中,我们已经学习了人脸识别的基本流程,包括人脸图像采集、人脸检测、特征点提取和人脸识别的整个流程。不仅了解了其中的原理,还学会了编写实际应用的代码。
本实训主要将介绍使用Face Recognition
库进行人脸识别。因为Face Recognition
是对Dlib
的封装,所以其原理和我们前几个实训中,讲解的相同。在本实训中主要为大家讲解其基本使用方法。
为什么在学习完整个流程之后还要讲Face Recognition
库呢?因为,在前面的实训中,我们主要使用Dlib
库,它是一个在工业界和学术界广受好评,极其优秀的库。而Face Recognition
基于Dlib
库做了高度封装,当之无愧的称之为世界上最简洁的人脸识别库。
所以,我们学习完基础的原理以及Dlib
库,就好比学会了“走路”;而Face Recognition
库的高效与简洁,可以让我们彻底“跑起来”。
任务描述
本关任务:使用 face_recognition
中 face_locations
函数,定位人脸位置。
相关知识
在face recognition
库中,人脸检测只需两步:
- 读取照片;
- 检测人脸。
也就是将模型选择之类的操作都封装,默认使用Dlib
库中已经训练完成的模型。
例如,我们要识别以下图片中的人脸:
读取照片
在face rcognition
中使用 load_image_file
函数读取图片:
load_image_file(file, mode='RGB')
其中,各个参数的含义如下:
file
:带检测的图片文件路径;
mode
:可选值,默认为RGB
,也可以指定为L
,代表转化为灰度照片。
示例代码如下:
image = face_recognition.load_image_file("./images/Sheldon.jpg")
检测照片中人脸并返回人脸位置
我们使用face_locations
函数检测人脸:
face_locations(img, number_of_times_to_upsample=1, model="hog")
其中,各个参数的含义如下:
img
:待检测的图片对象;
number_of_times_to_upsample
:可选值,为寻找人脸进行多少次图片变换,值越大,越能找到更小的人脸;
model
:可选值,默认使用hog
模式,hog
模式在CPU
上运行表现更好;如果有GPU
加速,也可以指定为cnn
模式。
示例代码如下:
face_locations = face_recognition.face_locations(image)
完整示例
一个简单的完整示例非常简洁,只需几行:
# 加载face_recognition库
import face_recognition
# 读取照片
image = face_recognition.load_image_file("./images/Sheldon.jpg")
# 获取检测到的人脸位置
face_locations = face_recognition.face_locations(image)
# 打印人脸位置
print(face_locations)
运行程序,输出如下:
[(171, 438, 439, 171)]
同之前所学的人脸检测输出一样,输出包含了人脸左上角的位置 (247, 718)
, 以及人脸的宽度632
,和人脸的高度332
。
绘制人脸区域
我们同样可以使用之前学到的OpenCV
绘制人脸区域,再前面识别的基础代码上,加上下面的绘制代码:
import cv2
for face_location in face_locations:
top, right, bottom, left = face_location
cv2.rectangle(image, (left, top), (right, bottom), (0, 255, 0), 2)
# Show the picture
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
cv2.imshow("sd.png", image_rgb)
cv2.waitKey(0)
得到的绘制图片结果如下:
编程要求
根据提示,在右侧编辑器补充代码,检测图片中人脸并绘制:
获取指定路径中图片文件中的人脸,并打印输出结果;
使用
cv2
绘制人脸区域框。
第1关任务——代码题
'''****************BEGIN****************'''
import face_recognition
image_path = './step1/image/children.jpg'
image = face_recognition.load_image_file(image_path)
face_locations = face_recognition.face_locations(image)
print(face_locations)
'''**************** END ****************'''
import cv2
for face_location in face_locations:
'''****************BEGIN****************'''
top,right,bottom,left = face_location
cv2.rectangle(image,(left,top),(right,bottom),(0,255,0),2)
'''**************** END ****************'''
# 保存图片
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
cv2.imwrite("./step1/out/children.jpg", image_rgb)
第2关:人脸特征点获取
任务描述
本关任务:使用 face_recognition
中 face_landmarks
函数,获取人脸特征点。
相关知识
人脸特征点的提取,在face_recognition
库中同样分为两步:
读取照片;
获取照片中人脸特征点。
假设我们要获取如下图片的特征点:
1. 读取照片
同样的,我们使用 load_image_file
函数读取照片,传入参数为照片文件路径,代码如下:
image = face_recognition.load_image_file("./images/face.jpg")
2. 获取照片中人脸特征点
可以使用face_landmarks
函数,获取人脸中特征点:
face_landmarks(face_image, face_locations=None, model="large")
其中,各个参数含义如下:
face_image
:图片对象;
face_locations
:可选,默认为空,也可以指定要识别的人脸区域位置;
model
:可选,不指定时的默认值为large
,另一个值为small
。large
代表识别68
个特征点,small
代表识别5
个特征点。
例如:
face_landmarks_list = face_recognition.face_landmarks(image)
完整代码示例
完整的人脸特征点检测,代码同样十分简洁:
# 导入face_recogni