使用face_recognition模块进行人脸识别并输出图片名字
face_recognition介绍
- face_recognition是一个基于Python的人脸识别库,它使用dlib顶尖的深度学习人脸识别技术构建。该库不仅提供了丰富的API接口,还封装了许多复杂的操作,使得开发者能够更加简单快捷地进行人脸识别相关的工作。
- face_recognition模块的核心优势在于其高准确率。在户外脸部检测数据库基准(Labeled Faces in the Wild benchmark)上,其准确率高达99.38%。这使得face_recognition模块在成人人脸识别领域具有显著的优势。然而,对于小孩或未成年人,以及特定种族(如亚洲人)的识别率,可能尚待提升。
- face_recognition模块的功能强大且多样化。它可以对已知的人脸图片进行读取编码,再对拟检测的未知图片进行读取编码,然后对已知和未知的两张图片的编码进行比对,给出判断结果。因此,它可以用于查找最相似的人脸,或者在监控摄像头捕获的面部与包含通缉犯面部的数据库中进行检查。此外,face_recognition模块还可以进行脸部位置检测、脸部关键点检测等操作,甚至可以在网络摄像头中采集到的人脸进行高斯模糊处理或美妆等应用。
face_recognition安装
直接使用pip命令进行安装,会自动安装依赖库,如果是python较新的版本(如3.11,3.12),可能会报错。请移步:安装教程
人脸匹配流程
- 图像采集:用户站在人脸识别终端前,通过摄像头采集用户的面部图像。这一步要确保拍摄角度、光线等因素对图像质量的影响尽可能小,以获得高质量的面部图像。
- 预处理:采集到的图像需要进行预处理,以提高后续处理的准确性和效率。预处理过程包括图像去噪、灰度化等操作,以及人脸的定位和对齐。人脸对齐是为了确保图像中的人脸以正脸的角度呈现,这有助于提高人脸识别的准确性。
- 特征提取:在预处理的基础上,通过图像处理算法提取出人脸的特征信息。这些特征信息可以是面部的轮廓、纹理、关键点等,用于后续的人脸比对和识别。
- 特征比对:将预先存储的人脸特征与当前提取的特征进行比对。比对方法一般采用度量方法,如欧氏距离、余弦相似度等,通过计算特征之间的相似度来确定是否匹配。
- 决策判断:根据特征比对结果,系统做出决策判断。如果相似度达到一定的阈值,则判定为认证成功,否则认证失败。这个判断结果将决定后续的操作,如开门、登录等。
- 反馈结果:最后,将认证结果反馈给用户或系统。如果认证成功,用户可以顺利进行后续操作;如果认证失败,系统可能会提示用户重新进行人脸识别或采取其他身份验证方式。
区分刘亦菲与刘德华
用于作为对比的人脸库:
先看能不能识别出刘亦菲:
输入的图片:
成功识别!
来测试一下识别刘德华
同样识别成功!
代码
# 导入必要的库
import os # 导入os库,用于操作文件
import cv2 # 导入cv2库,用于图像处理,例如绘制矩形框
from PIL import Image # 导入PIL库中的Image模块,用于图像处理,例如绘制图片
import face_recognition # 导入face_recognition库,用于人脸识别
# 下面三个函数是自定义的,不是库内直接提供的。
# 将识别到的人脸绘制出来
def print_image(face, image):
# 遍历所有识别到的人脸位置
for face_location in face:
# 获取人脸的坐标,face_location的顺序是top, right, bottom, left
top, right, bottom, left = face_location
# 根据坐标裁剪出人脸部分
face_image = image[top:bottom, left:right]
# 将裁剪出的人脸部分转换为PIL Image对象
pil_image = Image.fromarray(face_image)
# 显示转换后的图片
pil_image.show()
# 根据坐标在图片中画出框框
def print_image_tru(images, image_list):
# 读取图片
image = cv2.imread(images)
# 遍历所有提供的坐标
for one in image_list:
# 根据提供的坐标顺序调整,以匹配OpenCV的矩形框绘制函数
y1 = one[0]
x1 = one[3]
y2 = one[2]
x2 = one[1]
# 在图片上绘制矩形框,颜色为红色,线宽为2
cv2.rectangle(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
# 显示带有矩形框的图片
cv2.imshow("fff", image)
# 等待用户按键,之后关闭窗口
cv2.waitKey()
# 将目录中的图片加载到已知人脸库中
def get_face_data():
# 设置图片所在的目录路径
base_path = 'tmp_img/'
# 获取该目录下的所有文件名
name_content = os.listdir(base_path)
# 初始化一个列表,用于存储人脸编码
image_encoding_content = []
# 遍历目录下的所有文件
for one in name_content:
# 拼接文件路径
img = base_path + "/" + str(one)
# 加载图片
load = face_recognition.load_image_file(img)
# 获取图片中的人脸编码,这里假设每张图片只有一个人脸
encodings = face_recognition.face_encodings(load)[0]
# 将人脸编码添加到列表中
image_encoding_content.append(encodings)
# 打印人脸编码的数量
# 返回文件名列表和人脸编码列表
return name_content, image_encoding_content
# 1、查找人脸的个数
def count_face(images):
# 加载图片文件
image = face_recognition.load_image_file(images)
# 查找图片中所有的人脸位置
face_locations = face_recognition.face_locations(image)
# 打印出识别到的人脸数量
print(f"该照片中识别出了{len(face_locations)}张人脸")
# 使用矩形框标出人脸位置并显示图片
print_image_tru(images, face_locations)
# 2、人脸识别
def face_recognitions(data_base_image, tmp_image):
# 1、将传入的临时图片转化为人脸编码
picture_of_tmp = face_recognition.load_image_file(tmp_image)
# 2、尝试识别临时图片中的人脸编码
try:
# 获取临时图片中人脸的编码,假设只有一个人脸,所以取第一个元素
tmp_encoding = face_recognition.face_encodings(picture_of_tmp)[0]
except IndexError:
# 如果未能识别出人脸,则打印提示信息并返回
print('未识别出人脸')
return
# 使用数据库中的人脸编码与临时图片的人脸编码进行比较
# compare_faces 返回一个布尔值列表,表示是否与数据库中的人脸匹配
results = face_recognition.compare_faces(data_base_image[1], tmp_encoding)
# 如果结果列表中有 True,说明匹配成功
if True in results:
# 获取匹配成功的人脸在数据库中的索引
index = results.index(True)
# 从数据库中获取匹配成功的人脸对应的姓名(假设姓名与文件名相关)
names = data_base_image[0][index].split('.')[0]
# 打印出验证成功的信息及姓名
print(f"人脸验证成功,身份是{names}")
else:
# 如果列表中没有 True,说明匹配失败
print("验证失败")
# 临时图片的路径
tmp_image = r'hua.jpg'
# 调用之前定义的 get_face_data 函数获取数据库中的图片文件名和人脸编码
tuple_data = get_face_data()
# 调用人脸识别函数进行人脸识别
face_recognitions(tuple_data, tmp_image)