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

第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_locationcv2.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_recognitiondef 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 = Noneif 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_DUPLEXcv2.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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/33121.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【源码】Spring Data JPA原理解析之Auditing执行原理

Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查询、部分字段查询 3、Spring Data JPA数据批量插入、批量更新真的用对了吗 4、Spring Data JPA的一对一、LazyInitializationException异常、一对多、多对多操作 5、Spring Data JPA自定…

7.系统工具——黑马程序员Java最新AI+若依框架项目

目录 前言一、表单构建任务:设计添加课程表单 二、 代码生成1.任务:将部门表在页面端显示改为树形结构 三、系统接口任务:使用sagger进行接口测试 前言 提示:本篇讲解若依框架 系统工具 一、表单构建 功能:完成前端…

欧洲杯赛况@20240623

估计点击标题下「蓝色微信名」可快速关注 老牌劲旅捷克队面对格鲁吉亚,这是两队的首次交锋,格鲁吉亚是很放松的状态,每场比赛对他们都很新鲜,而捷克则谨慎多,至今为止,最倒霉的球员,可能就是捷克…

nvm安装

1、官网下载nvm压缩包 Releases coreybutler/nvm-windows (github.com)https://github.com/coreybutler/nvm-windows/releases 2、安装nvm cmd下查看nvm版本号 nvm version 3、配置镜像 在安装目录下找到settings.txt文件,追加淘宝镜像 node_mirror:https:/…

Java——封装(Encapsulation)

一、封装简介 1、封装是什么 封装(Encapsulation)是面向对象编程(OOP)中的一个基本概念,它指的是将对象的状态(数据)和行为(方法)绑定在一起,并对外隐藏对象…

websocket 安全通信

WebSocket 协议 WebSocket:在 2008 年诞生,2011 年成为国际标准。它允许服务器主动向客户端推送信息,客户端也可以主动向服务器发送信息,实现了真正的双向平等对话。它是一种在单个 TCP 连接上进行全双工通讯的协议,能…

【Python如何输入升高和体重判断你是偏胖还是偏瘦】

1、求体质指数得Python代码如下&#xff1a; # BMI&#xff08;Body Mass Index&#xff09;指数:简称体质指数&#xff0c; # 是国际上常用的衡量人体胖瘦程度以及是否健康的一个标准。 # 常用指标:BMI<18.5 偏瘦 18.5<MBI<24 正常 MBI>24 偏胖 # 计算公式:BMI…

express+vue 在线五子棋(一)

示例 在线体验地址五子棋&#xff0c;记得一定要再拉个人才能对战 本期难点 1、完成了五子棋的布局&#xff0c;判断游戏结束 2、基本的在线对战 3、游戏配套im(这个im的实现&#xff0c;请移步在线im) 下期安排 1、每步的倒计时设置 2、黑白棋分配由玩家自定义 3、新增旁观…

# Kafka_深入探秘者(3):kafka 消费者

Kafka_深入探秘者&#xff08;3&#xff09;&#xff1a;kafka 消费者 一、kafka 消费者、消费组 1、Kafka 消费者是消费组的一部分&#xff0c;当多个消费者形成一个消费组来消费主题时&#xff0c;每个消费者会收到不同分区的消息。假设有一个 T1 主题&#xff0c;该主题有…

Web应用防火墙(WAF)(上:基础概念篇)

运维专题 Web应用防火墙&#xff08;WAF&#xff09;&#xff08;上&#xff1a;基础概念篇&#xff09; - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. She…

pgAdmin后台命令执行漏洞(CVE-2023-5002)

​ 我们可以看到针对于漏洞 CVE-2022-4223&#xff0c;官方做了一定的修复措施。 web\pgadmin\misc_init_.py#validate_binary_path ​ 首先是添加了 login_required​ 进行权限校验。在 Flask 框架中&#xff0c;login_required​ 装饰器通常与 Flask-Login 扩展一起使用。…

LED恒流调光电路

LED等在工作的时候发热较大&#xff0c;所以通常选用铝基板作为底板&#xff1b;常用白色油墨。 LED必须在恒流源电路下工作&#xff0c;下图为最简单的恒流源&#xff1a;B极电压3.3V不变左下侧蓝色的为稳压二极管&#xff0c;由于BE极可以看做二极管&#xff0c;压降为0.7V&…

OpenCV颜色检测

OpenCV颜色检测 前言策略分析根据颜色检测目标对象相关链接 前言 绿幕技术是一种经典的视频编辑技术&#xff0c;可以用于将人物置于不同的背景中。例如在电影制作中&#xff0c;技术的关键在于演员不能身着特定颜色的衣服(比如绿色)&#xff0c;站在只有绿色的背景前。然后&a…

异地组网如何OEM?

在现代信息社会中&#xff0c;企业越来越需要跨地域进行数据传输与共享。面临的挑战却是如何在不暴露在公网的情况下&#xff0c;实现异地组网并保障数据的安全性。本文将介绍一种名为“异地组网OEM”的解决方案&#xff0c;该方案能够通过私有通道传输数据并对数据进行安全加密…

我的大学生活-人面不知何处去(大三篇)

我的大学生活&#xff08;大三篇&#xff09; 前言推荐大三&#xff08;人面不知何处去&#xff09;2022年8月2022年9月2022年10月2022年11月2022年12月 寒假2023年1月 大三&#xff08;人面不知何处去&#xff09;2023年2月2023年3月2023年4月2023年5月2023年6月 暑假2023年7月…

【LeedCode】二分查找算法(一)

二分查找算法的时间复杂度是O(logN) &#xff0c;更优于传统的遍历数组算法值得我们学习。 注意二分查找一般使用的前提是&#xff1a;待操作的数组的元素有某种规律也就是要有二阶性&#xff0c;二段性就是在数组中选取一点根据该数组元素某种规律可以把数组分为两部分&#x…

国企:2024年6月中国移动相关招聘信息 三

中国移动卓望公司-卓望信息 卓望公司成立于2000年6月,是中国移动的控股子公司,积极拓展互联网、IT、ICT领域,提供平台及应用开发、运营运维等服务。  成立二十余年来,卓望公司逐渐形成包括业务合作管理、内容渠道运营、网络集中运维、企业服务、安全服务、行业DICT服务等…

LDR6500U,让设备爱上“被骗”的充电速度!

在数字设备日新月异的今天&#xff0c;兼容性和充电效率已成为用户关注的核心焦点。尤其是随着电子设备市场的全球化发展&#xff0c;标准化的需求日益凸显。近期&#xff0c;欧洲联盟&#xff08;简称“欧盟”&#xff09;就电子设备充电接口问题做出了重要决策&#xff0c;要…

高校新生如何选择最优手机流量卡?

一年一度的高考已经结束了&#xff0c;愿广大学子金榜题名&#xff0c;家长们都给孩子准备好了手机&#xff0c;那么手机流量卡应该如何选择呢&#xff1f; 高校新生在选择手机流量卡时&#xff0c;需要综合考量流量套餐、费用、网络覆盖、售后服务等多方面因素&#xff0c;以下…