使用face_recognition模块进行人脸识别并输出图片名字

使用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),可能会报错。请移步:安装教程

人脸匹配流程

  1. 图像采集:用户站在人脸识别终端前,通过摄像头采集用户的面部图像。这一步要确保拍摄角度、光线等因素对图像质量的影响尽可能小,以获得高质量的面部图像。
  2. 预处理:采集到的图像需要进行预处理,以提高后续处理的准确性和效率。预处理过程包括图像去噪、灰度化等操作,以及人脸的定位和对齐。人脸对齐是为了确保图像中的人脸以正脸的角度呈现,这有助于提高人脸识别的准确性。
  3. 特征提取:在预处理的基础上,通过图像处理算法提取出人脸的特征信息。这些特征信息可以是面部的轮廓、纹理、关键点等,用于后续的人脸比对和识别。
  4. 特征比对:将预先存储的人脸特征与当前提取的特征进行比对。比对方法一般采用度量方法,如欧氏距离、余弦相似度等,通过计算特征之间的相似度来确定是否匹配。
  5. 决策判断:根据特征比对结果,系统做出决策判断。如果相似度达到一定的阈值,则判定为认证成功,否则认证失败。这个判断结果将决定后续的操作,如开门、登录等。
  6. 反馈结果:最后,将认证结果反馈给用户或系统。如果认证成功,用户可以顺利进行后续操作;如果认证失败,系统可能会提示用户重新进行人脸识别或采取其他身份验证方式。

区分刘亦菲与刘德华

用于作为对比的人脸库:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
先看能不能识别出刘亦菲:
输入的图片:
在这里插入图片描述
成功识别!
在这里插入图片描述
来测试一下识别刘德华
在这里插入图片描述
同样识别成功!

代码

# 导入必要的库
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)
  • 21
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

立秋6789

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值