头歌——机器、深度学习——人脸识别

发布于:2024-06-28 ⋅ 阅读:(15) ⋅ 点赞:(0)

第1关:人脸检测

在前面的几个实训中,我们已经学习了人脸识别的基本流程,包括人脸图像采集、人脸检测、特征点提取和人脸识别的整个流程。不仅了解了其中的原理,还学会了编写实际应用的代码。

本实训主要将介绍使用Face Recognition库进行人脸识别。因为Face Recognition是对Dlib的封装,所以其原理和我们前几个实训中,讲解的相同。在本实训中主要为大家讲解其基本使用方法。

为什么在学习完整个流程之后还要讲Face Recognition库呢?因为,在前面的实训中,我们主要使用Dlib库,它是一个在工业界和学术界广受好评,极其优秀的库。而Face Recognition基于Dlib库做了高度封装,当之无愧的称之为世界上最简洁的人脸识别库。

所以,我们学习完基础的原理以及Dlib库,就好比学会了“走路”;而Face Recognition库的高效与简洁,可以让我们彻底“跑起来”。

任务描述

本关任务:使用 face_recognitionface_locations 函数,定位人脸位置。

相关知识

face recognition库中,人脸检测只需两步:

  1. 读取照片;
  2. 检测人脸。

也就是将模型选择之类的操作都封装,默认使用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_recognitionface_landmarks 函数,获取人脸特征点。

相关知识

人脸特征点的提取,在face_recognition库中同样分为两步:

  1. 读取照片;

  2. 获取照片中人脸特征点。

假设我们要获取如下图片的特征点:

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,另一个值为 smalllarge 代表识别68个特征点,small 代表识别5个特征点。

例如:

face_landmarks_list = face_recognition.face_landmarks(image)

完整代码示例

完整的人脸特征点检测,代码同样十分简洁:

  • # 导入face_recognition库
  • import face_recognition
  • # 读取照片
  • image = face_recognition.load_image_file("./images/face.jpg")
  • # 获取中铺中人脸特征点
  • face_landmarks_list = face_recognition.face_landmarks(image)

程序运行结果的其中一个人脸特征值如下:

  • [{
  • 'chin': [(366, 261), (367, 272), (368, 282), (372, 293), (375, 303), (380, 312), (387, 319), (396, 324), (407, 325), (420, 324), (432, 319), (443, 312), (452, 302), (457, 289), (460, 276), (462, 262), (463, 248)],
  • 'left_eyebrow': [(367, 252), (369, 244), (376, 240), (384, 239), (393, 241)],
  • 'right_eyebrow': [(402, 239), (412, 234), (423, 233), (434, 235), (443, 240)],
  • 'nose_bridge': [(398, 251), (398, 257), (398, 263), (397, 269)],
  • 'nose_tip': [(391, 280), (395, 280), (400, 281), (406, 279), (411, 278)],
  • 'left_eye': [(375, 258), (379, 254), (385, 253), (391, 256), (385, 258), (379, 259)],
  • 'right_eye': [(414, 253), (420, 248), (427, 248), (433, 250), (427, 253), (421, 253)],
  • 'top_lip': [(388, 298), (392, 293), (397, 290), (401, 290), (406, 289), (415, 291), (423, 295), (421, 295), (407, 292), (402, 293), (398, 293), (391, 297)],
  • 'bottom_lip': [(423, 295), (416, 302), (408, 305), (403, 306), (398, 306), (393, 304), (388, 298), (391, 297), (398, 300), (402, 300), (407, 299), (421, 295)]
  • }]

可以看出,返回的结果是一个一位数组,数组的元素为 JSON 格式,包含的特征区域细分为:

脸颊 chin

左眼眉毛 left_eyebrow

右眼眉毛 right_eyebrow

鼻梁 nose_bridge

鼻尖 nose_tip

左眼 left_eye

右眼 right_eye

上嘴唇 top_lip

下嘴唇 bottom_lip

如果指定为 small 模式:

face_landmarks_list = face_recognition.face_landmarks(image, model='small')

其中一张脸的5个特征点结果如下:

[{

'nose_tip': [(401, 281)],

'left_eye': [(373, 258), (390, 256)],

'right_eye': [(433, 250), (414, 252)]

}]

绘制特征点

我们使用之前学到的OpenCV绘制点的方法,再前面获取到人脸特征点的基础代码上,加上下面的绘制代码:

  • for face_landmarks in face_landmarks_list:
  • for facial_feature in face_landmarks.keys():
  • for pt_pos in face_landmarks[facial_feature]:
  • cv2.circle(image, pt_pos, 1, (255, 0, 0), 2)
  • # 展示图片
  • image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
  • cv2.imshow("laugh.jpg", image_rgb)
  • cv2.waitKey(0)

得到的绘制图片结果如下:

(提示:点击图片可以放大查看。)

编程要求

根据提示,在右侧编辑器补充代码,获取特征并绘图保存,

  • 获取指定路径下(./step2/image/laugh.jpg)得图片文件68个特征点,并打印结果;

  • 使用cv2绘制人脸特征点,点的颜色为红色。

第2关任务——代码题

import face_recognition
'''****************BEGIN****************'''
# 获取人脸特征点
image_path = './step2/image/laugh.jpg'
image = face_recognition.load_image_file(image_path)
face_landmarks_list = face_recognition.face_landmarks(image)
print(face_landmarks_list)
'''**************** END ****************'''
 
import cv2
 
# 绘制人脸特征点
for face_landmarks in face_landmarks_list:
    '''****************BEGIN****************'''
    for facial_feature in face_landmarks.keys():
        for pt_pos in face_landmarks[facial_feature]:
                cv2.circle(image, pt_pos, 1, (255, 0, 0), 2)
 
    '''**************** END ****************'''
 
# 保存图片
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
cv2.imwrite("./step2/out/laugh.jpg", image_rgb)

第3关:人脸识别

任务描述

本关任务:使用face_recognition中 编写一个能识别人脸的程序。

相关知识

face recognition库中,人脸识别分为三步:

  1. 读取人脸图片,包括已知姓名图片和未知姓名图片;

  2. 对各图片中人脸进行编码,获取128维的特征向量;

  3. 比较128维的特征向量距离,识别人脸。

1. 读取图片

与前面不同,因为是识别图片,所以我们需要分别读取已知名字图片和未知名字图片:

  1. known_image = face_recognition.load_image_file("./step3/images/cyx2.jpg")
  2. unknown_image = face_recognition.load_image_file("./step3/images/cyx4.jpg")
2. 获取128维的特征向量

可以使用 face_encodings 函数对人脸进行编码,获取到对应128维的人脸特征向量:

face_encodings(face_image, known_face_locations=None, num_jitters=1)

其中,各个参数的含义如下:

  • face_image:包含单个或者多个人脸的图片对象;

  • known_face_locations:可选值,已经知道名字的人脸位置;

  • num_jitters:当计算编码时,进行多少次的re-sample操作,次数越多,越精准(但同时会更慢,例如,值为100时,会慢100倍)。

分别对已知名字的人脸和未知名字的人脸,进行编码,示例代码如下:

cyx_encoding = face_recognition.face_encodings(known_image)[0]

unknown_encoding = face_recognition.face_encodings(unknown_image)[0]

3. 比较特征向量,识别人脸

最后,使用 compare_faces函数,比较已经人脸与未知人脸之间特征向量:

compare_faces(known_face_encodings, face_encoding_to_check, tolerance=0.6)

其中,各个参数的含义如下:

  • known_face_encodings:已知人脸特征向量的数组;
  • face_encoding_to_check:一个用于与已知向量相比较的未知人脸特征向量;
  • tolerance:容错率,默认的容错率是0.6,容错率越低,识别越严格准确。

如果未知图片高于指定的容错率阈值,将会返回真(True);如果低于指定的阈值,将会返回假(False)。

results = face_recognition.compare_faces([cyz_encoding], unknown_encoding, tolerance=0.4)

完整示例

我们以下 图片1作为已知图片:

图片1陈奕迅:

通过人脸识别,检测以下图片2,是否是同一个人:

图片2

人脸识别的完整示例代码如下:

  • import face_recognition
  • # 导入图片
  • known_image_cyz = face_recognition.load_image_file(
  • "./step3/images/cyx2.jpg")
  • unknown_image = face_recognition.load_image_file("./step3/images/cyx3.jpg")
  • # 编码获取128维特征向量
  • cyz_encoding = face_recognition.face_encodings(known_image_cyz)[0]
  • unknown_encoding = face_recognition.face_encodings(unknown_image)[0]
  • # 比较特征向量值,识别人脸
  • results = face_recognition.compare_faces([cyz_encoding], unknown_encoding, tolerance=0.4)
  • # 打印结果
  • print(results)

程序运行结果为:

[True]

可以看出,人脸识别结果正确。

编程要求

请在右侧编辑器中的BEGIN-END之间编写代码,完成如下要求:

  1. 导入已知和未知图片;

  2. 编码已知和未知图片的编码获取128维特征向量;

  3. 分别识别第一张和第二张未知图片,其中tolerance值设定为0.5

第3关任务——代码题

import face_recognition
 
 
def recognition():
    '''****************BEGIN****************'''
    # 导入图片
    known_image_path = "./step3/known_image/cyx1.jpg"
    known_image_cyz = face_recognition.load_image_file(known_image_path)
 
    unknown_image_1_path = "./step3/unknown_image/cyx2.jpg"
    unknown_image_2_path = "./step3/unknown_image/wlh.jpg"
    unknown_image_1 = face_recognition.load_image_file(unknown_image_1_path)
    unknown_image_2 = face_recognition.load_image_file(unknown_image_2_path)
    '''**************** END ****************'''
 
    '''****************BEGIN****************'''
    # 编码获取128维特征向量
    cyz_encoding = face_recognition.face_encodings(known_image_cyz)[0]
    unknown_encoding_1 = face_recognition.face_encodings(unknown_image_1)[0]
    unknown_encoding_2 = face_recognition.face_encodings(unknown_image_2)[0]
    '''**************** END ****************'''
 
    '''****************BEGIN****************'''
    # 比较特征向量值,识别人脸
    face1_result = face_recognition.compare_faces([cyz_encoding],unknown_encoding_1, tolerance=0.5)
    face2_result = face_recognition.compare_faces([cyz_encoding],unknown_encoding_2, tolerance=0.5)
    '''**************** END ****************'''
    return face1_result, face2_result

第4关:人脸识别绘制并展示

任务描述

本关任务:识别人脸并将识别的人名结果绘制到图片上。

相关知识

在前面的关卡中,我们学会了人脸检测和人脸识别。现在让我们整合之前学到的内容,完成一个完整的人脸识别流程,并将识别的人名结果绘制到图片上。

给定一系列已知的人脸图片和一系列未知的人脸图片,通过人脸识别技术,自动化的识别出未知人脸图片中包含人脸的名字,主要分为以下五个流程:

  1. 导入已知图片;
  2. 编码已知图片;
  3. 导入未知图片;
  4. 遍历识别;
  5. 绘制姓名和人脸。

我们以《军师联盟》中的四个人物:曹操、司马懿、张春华和荀彧为例。讲解以上五个步骤。

1. 导入已知图片

首先,我们准备已经名字的图片,如下:

使用load_image_file导入这些图片,代码如下:

  • # 加载已知图片
  • known_image_cc = face_recognition.load_image_file("./step3/know_image/Caocao.jpg")
  • known_image_xy = face_recognition.load_image_file("./step3/know_image/XunYu.jpg")
  • known_image_smy = face_recognition.load_image_file("./step3/know_image/SiMayi.jpg")
  • known_image_zch= face_recognition.load_image_file("./step3/know_image/ZhangChunhua.jpg")
2. 编码已知图片

然后,使用face_encodings对图片进行编码,获取128维特征向量。同时,之后我们需要遍历已经照片来识别,所以先将已知人脸存为数组。

代码如下:

  • # 对图片进行编码,获取128维特征向量
  • caocao_encoding = face_recognition.face_encodings(known_image_cc)[0]
  • xy_encoding = face_recognition.face_encodings(known_image_xy)[0]
  • zys_encoding = face_recognition.face_encodings(known_image_smy)[0]
  • cyz_encoding = face_recognition.face_encodings(known_image_zch)[0]
  • # 存为数组以便之后识别
  • known_faces = [
  • caocao_encoding,
  • xy_encoding,
  • zys_encoding,
  • cyz_encoding]
3. 导入未知图片

准备好已知图片信息之后,我们加载将要识别的未知图片:

四张照片分布对应于不同的已知照片中的任务。

代码如下:

  • # 加载待识别图片
  • unknown_image_1 = face_recognition.load_image_file(
  • "./step3/unknown_image/Caocao.jpg")
  • unknown_image_2 = face_recognition.load_image_file(
  • "./step3/unknown_image/SiMayi.jpg")
  • unknown_image_3 = face_recognition.load_image_file(
  • "./step3/unknown_image/ZhangChunhua.jpg")
  • unknown_image_4 = face_recognition.load_image_file(
  • "./step3/unknown_image/XunYu.jpg")
  • unknown_faces = [
  • unknown_image_1,
  • unknown_image_2,
  • unknown_image_3,
  • unknown_image_4]
4. 遍历识别

遍历未知图片,对每一种未知图片,获取其人脸位置和特征向量。将得到的位置图片特征向量与所有已知的特征向量进行比较,判断是否为同一个人。需要注意的是这里我们设置 tolerance0.5,实际应用时,可以根据自己对准确度的要求,进行调整。

  • # 初始化一些变量
  • face_locations = []
  • face_encodings = []
  • face_names = []
  • frame_number = 0
  • for frame in unknown_faces:
  • face_names = []
  • # 获取人脸区域位置
  • face_locations = face_recognition.face_locations(frame)
  • # 对图片进行编码,获取128维特征向量
  • face_encodings = face_recognition.face_encodings(frame, face_locations)
  • for face_encoding in face_encodings:
  • # 识别图片中人脸是否匹配已知图片
  • match = face_recognition.compare_faces(
  • known_faces, face_encoding, tolerance=0.5)

得到是否是同一个人的结果之后,我们可以对应其姓名,添加到face_names数组中。

代码如下:

  • name = None
  • if match[0]:
  • name = "Caocao"
  • elif match[1]:
  • name = "XunYu"
  • elif match[2]:
  • name = "SiMayi"
  • elif match[3]:
  • name = 'ZhangChunhua'
  • else:
  • name = 'Unknown'
  • face_names.append(name)
5. 绘制姓名和人脸

得到对应的人脸识别结果之后,我们将遍历每一张未知图片中的人脸,通过 OpenCVrectangle绘制脸部区域框和putText对应的人名。

代码如下:

  • # 结果打上标签
  • for (top, right, bottom, left), name in zip(face_locations, face_names):
  • # 绘制脸部区域框
  • cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)
  • # 在脸部区域下面绘制人名
  • cv2.rectangle(frame, (left, bottom - 25),
  • (right, bottom), (0, 0, 255), cv2.FILLED)
  • font = cv2.FONT_HERSHEY_DUPLEX
  • cv2.putText(frame, name, (left + 6, bottom - 6),
  • font, 0.5, (255, 255, 255), 1)

最后,再将绘制完成的代码展示或者保存。

完整代码示例

整合以上五个步骤,完整的代码示例如下:

  • import face_recognition
  • import cv2
  • # 加载已知图片
  • known_image_cc = face_recognition.load_image_file(
  • "./step3/know_image/Caocao.jpg")
  • known_image_xy = face_recognition.load_image_file(
  • "./step3/know_image/XunYu.jpg")
  • known_image_smy = face_recognition.load_image_file(
  • "./step3/know_image/SiMayi.jpg")
  • known_image_zch = face_recognition.load_image_file(
  • "./step3/know_image/ZhangChunhua.jpg")
  • # 对图片进行编码,获取128维特征向量
  • caocao_encoding = face_recognition.face_encodings(known_image_cc)[0]
  • xy_encoding = face_recognition.face_encodings(known_image_xy)[0]
  • zys_encoding = face_recognition.face_encodings(known_image_smy)[0]
  • cyz_encoding = face_recognition.face_encodings(known_image_zch)[0]
  • # 存为数组以便之后识别
  • known_faces = [
  • caocao_encoding,
  • xy_encoding,
  • zys_encoding,
  • cyz_encoding]
  • # 加载待识别图片
  • unknown_image_1 = face_recognition.load_image_file(
  • "./step3/unknown_image/Caocao.jpg")
  • unknown_image_2 = face_recognition.load_image_file(
  • "./step3/unknown_image/SiMayi.jpg")
  • unknown_image_3 = face_recognition.load_image_file(
  • "./step3/unknown_image/ZhangChunhua.jpg")
  • unknown_image_4 = face_recognition.load_image_file(
  • "./step3/unknown_image/XunYu.jpg")
  • unknown_faces = [
  • unknown_image_1,
  • unknown_image_2,
  • unknown_image_3,
  • unknown_image_4]
  • # 初始化一些变量
  • face_locations = []
  • face_encodings = []
  • face_names = []
  • frame_number = 0
  • for frame in unknown_faces:
  • face_names = []
  • # 获取人脸区域位置
  • face_locations = face_recognition.face_locations(frame)
  • # 对图片进行编码,获取128维特征向量
  • face_encodings = face_recognition.face_encodings(frame, face_locations)
  • for face_encoding in face_encodings:
  • # 识别图片中人脸是否匹配已知图片
  • match = face_recognition.compare_faces(
  • known_faces, face_encoding, tolerance=0.5)
  • name = None
  • if match[0]:
  • name = "Caocao"
  • elif match[1]:
  • name = "XunYu"
  • elif match[2]:
  • name = "SiMayi"
  • elif match[3]:
  • name = 'ZhangChunhua'
  • else:
  • name = 'Unknown'
  • face_names.append(name)
  • # 结果打上标签
  • for (top, right, bottom, left), name in zip(face_locations, face_names):
  • if not name:
  • continue
  • # 绘制脸部区域框
  • cv2.rectangle(frame, (left, top), (right, bottom), (0, 0, 255), 2)
  • # 在脸部区域下面绘制人名
  • cv2.rectangle(frame, (left, bottom - 25),
  • (right, bottom), (0, 0, 255), cv2.FILLED)
  • font = cv2.FONT_HERSHEY_DUPLEX
  • cv2.putText(frame, name, (left + 6, bottom - 6),
  • font, 0.5, (255, 255, 255), 1)
  • # 显示图片
  • image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
  • cv2.imshow("laugh.jpg", image_rgb)
  • cv2.waitKey(0)

完成了整个流程,看看人脸识别的效果吧:

编程要求

请在右侧编辑器中的BEGIN-END之间编写代码,识别人脸并绘制人脸区域和名字,具体任务如下:

  1. 导入已知图片,图片路径已经指定;

  2. 对导入的已知图片进行编码,获得特征向量;

  3. 将已经图片编码存为数组known_faces

  4. 导入未知图片,图片路径也已经指定;

  5. 将未知图片存为数组unknown_faces

  6. 对于每一张未知图片,获取其人脸区域face_locations以及特征编码face_encodings

  7. 对于图片中的每一个人脸编码,识别图片中人脸是否匹配已知图片;

  8. 将匹配的图片,与名字一一对应;

  9. 绘制脸部区域框并在在脸部区域下面绘制人名。

第4关任务——代码题

import face_recognition
import cv2
 
'''****************BEGIN****************'''
# 加载已知图片
known_image_c_path = "./step4/known_image/Caocao.jpg"
known_image_xy_path = "./step4/known_image/XunYu.jpg"
known_image_smy_path = "./step4/known_image/SiMayi.jpg"
known_image_zch_path = "./step4/known_image/ZhangChunhua.jpg"
known_image_cc = face_recognition.load_image_file(known_image_c_path)
known_image_xy = face_recognition.load_image_file(known_image_xy_path)
known_image_smy = face_recognition.load_image_file(known_image_smy_path)
known_image_zch = face_recognition.load_image_file(known_image_zch_path)
'''**************** END ****************'''
 
'''****************BEGIN****************'''
# 对图片进行编码,获取128维特征向量
caocao_encoding = face_recognition.face_encodings(known_image_cc)[0]
xy_encoding = face_recognition.face_encodings(known_image_xy)[0]
zys_encoding = face_recognition.face_encodings(known_image_smy)[0]
cyz_encoding = face_recognition.face_encodings(known_image_zch)[0]
'''**************** END ****************'''
 
'''****************BEGIN****************'''
# 存为数组以便之后识别
known_faces = [
    caocao_encoding,
    xy_encoding,
    zys_encoding,
    cyz_encoding
]
'''**************** END ****************'''
 
'''****************BEGIN****************'''
# 加载待识别图片
unknown_image_1_path = "./step4/unknown_image/Caocao.jpg"
unknown_image_2_path = "./step4/unknown_image/Cuple.jpg"
unknown_image_3_path = "./step4/unknown_image/ZhangChunhua.jpg"
unknown_image_4_path = "./step4/unknown_image/XunYu.jpg"
unknown_image_5_path = './step4/unknown_image/A.jpg'
unknown_image_1 = face_recognition.load_image_file(unknown_image_1_path)
unknown_image_2 = face_recognition.load_image_file(unknown_image_2_path)
unknown_image_3 = face_recognition.load_image_file(unknown_image_3_path)
unknown_image_4 = face_recognition.load_image_file(unknown_image_4_path)
unknown_image_5 = face_recognition.load_image_file(unknown_image_5_path)
'''**************** END ****************'''
 
'''****************BEGIN****************'''
# 存为数组以遍历识别
unknown_faces = [
    unknown_image_1,
    unknown_image_2,
    unknown_image_3,
    unknown_image_4,
    unknown_image_5
]
'''**************** END ****************'''
 
# 初始化一些变量
face_locations = []
face_encodings = []
face_names = []
frame_number = 0
for frame in unknown_faces:
    face_names = []
    '''****************BEGIN****************'''
    # 获取人脸区域位置
    face_locations = face_recognition.face_locations(frame)
    # 对图片进行编码,获取128维特征向量
    face_encodings = face_recognition.face_encodings(frame, face_locations)
    '''**************** END ****************'''
    for face_encoding in face_encodings:
        '''****************BEGIN****************'''
        # 识别图片中人脸是否匹配已知图片
        match = face_recognition.compare_faces(known_faces, face_encoding,tolerance=0.5)
        '''**************** END ****************'''
        '''****************BEGIN****************'''
        name = None
        if match[0]:
            name = "Caocao"
        elif match[1]:
            name = "XunYu"
        elif match[2]:
            name = "SiMayi"
        elif match[3]:
            name = 'ZhangChunhua'
        else:
            name = 'Unknown'
        '''**************** END ****************'''
        face_names.append(name)
    # 结果打上标签
    for (top, right, bottom, left), name in zip(face_locations, face_names):
        if not name:
            continue
        '''****************BEGIN****************'''
        # 绘制脸部区域框
        cv2.rectangle(frame, (left, top), (right, bottom),(0, 0, 255), 2)
        # 在脸部区域下面绘制人名
        cv2.rectangle(frame, (left, bottom - 25),
                      (right, bottom), (0, 0, 255), cv2.FILLED)
        font = cv2.FONT_HERSHEY_DUPLEX
        cv2.putText(frame, name, (left + 6, bottom - 6),
                font, 0.5, (255, 255, 255), 1)
        '''**************** END ****************'''
        print(frame[left+6, bottom-6])
        print(frame[left, bottom])
    print(face_locations)
    print(face_names)
    # 保存图片
    image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    path = './step4/out/' + name + str(face_locations[0][0]) + '.jpg'
    cv2.imwrite(path, image_rgb)


网站公告

今日签到

点亮在社区的每一天
去签到