人脸识别——face_recognition 介绍

face_recognition` 是一个非常流行的 Python 库,专门用于人脸识别任务。它基于 dlib 库和 HOG(Histogram of Oriented Gradients)特征以及深度学习模型,提供了简单易用的接口来进行人脸检测、面部特征点定位和人脸识别。`face_recognition` 库由 Adam Geitgey 开发,旨在简化人脸识别任务,使其更加容易上手。

1.主要功能

  1. 人脸检测

    • 检测图像中的人脸位置。

    • 支持使用 HOG 特征或 CNN(卷积神经网络)进行人脸检测。

  2. 面部特征点定位

    • 检测人脸上的关键特征点(如眼睛、鼻子、嘴巴等)。

  3. 人脸识别

    • 提取人脸的特征向量(128维),并用于比较不同人脸之间的相似度。

    • 支持从图像或视频中识别特定的人脸。

2.它和opencv的关系

face_recognition 和 OpenCV 是两个独立的计算机视觉库,但它们在功能上有一些重叠,并且经常一起使用来完成复杂的视觉任务。下面简要介绍两者的联系:

联系:

尽管 face_recognition 和 OpenCV 各有侧重,但在实际应用中,它们经常被组合起来使用,以发挥各自的优势:

  • 图像预处理:通常情况下,我们会先使用 OpenCV 对图像进行预处理,比如调整大小、灰度化、去噪等。这些预处理步骤有助于提高后续人脸识别的准确率。

  • 人脸检测与识别:预处理后的图像可以传递给 face_recognition 库来执行人脸检测和识别。face_recognition 可以高效地完成这些任务,并返回人脸位置、面部特征点等信息。

  • 结果可视化:最后,我们可以再次利用 OpenCV 来对识别结果进行可视化处理,例如在图像上画出人脸框、标注识别到的名字等。

3.检测人脸

语法:

face_recognition.face_locations(img, number_of_times_to_upsample=1, model='hog')

功能:检测图像中的人脸位置。

参数说明:

  • img:图像的 NumPy 数组。

  • number_of_times_to_upsample:图像上采样的次数,用于提高检测精度。

  • model:使用的模型,可以是 'hog'(默认)或 'cnn'

返回值:一个列表,每个元素是一个 (top, right, bottom, left) 的元组,表示人脸的位置

import cv2
import face_recognition as fr

# 读取人脸图片
img = cv2.imread("images/p3.png")

# 检测人脸
face_list = fr.face_locations(img)

# 获取人脸坐标 top最上面 left最左边 right最右边 bottom最下面
for i in face_list:
    cv2.rectangle(img, (i[3], i[0]), (i[1], i[2]), (0,255,255), 2)
    # 切割人脸
    qie_img = img[i[0]: i[2], i[3]:i[1]]
    cv2.imwrite("save_images/save_p3.png",qie_img,)
    cv2.imshow("a", qie_img)
    cv2.waitKey(0)
cv2.destroyAllWindows()

4.提取人脸特征

语法:

face_recognition.face_encodings(img, known_face_locations=None, num_jitters=1, model='small')

功能:提取图像中人脸的特征向量。

参数:

  • img:图像的 NumPy 数组。

  • known_face_locations:人脸位置的列表,如果为 None,则自动检测人脸位置。

  • num_jitters:对每个人脸进行多次编码以提高精度。

  • model:使用的模型,可以是 'small''large'(默认)。

返回值:一个列表,每个元素是一个 128 维的特征向量。

5.计算欧几里得距离:

欧几里得距离(Euclidean distance)是一种测量两个点之间直线距离的方式,常用于数学、物理学和计算机科学中的各种应用,包括机器学习中的数据点距离计算。它是基于欧几里得几何的概念,通常用于计算空间中两点之间的距离。

应用

  • 数据分析: 欧几里得距离常用于计算数据点之间的距离,例如在聚类算法(如K均值聚类)中。

  • 计算机视觉: 在人脸识别等任务中,欧几里得距离用于计算特征向量之间的相似度。

  • 优化: 在路径规划和优化问题中,计算两点之间的欧几里得距离可以帮助寻找最短路径。

欧几里得距离的意义

  1. 距离越小,相似度越高

    • 特征向量相似:当欧几里得距离越小说明两个特征向量之间的差异越小,即这两个人脸在特征空间中很接近。因此,这两个图像可能是同一个人或者相似度很高。

    • 相同身份的概率大:在许多人脸识别系统中,如果计算出的距离小于某个设定的阈值,则系统会认为这两个面孔属于同一个人。

  2. 距离阈值

    • 匹配判断:通常,系统会设置一个阈值来判断两个特征向量是否属于同一身份。如果计算出的距离小于这个阈值,则认为两张图片中的人脸是相同的;如果距离大于阈值,则认为是不同的身份。

    • 误识别率:设置的阈值会影响系统的误识别率(假阳性和假阴性率)。距离阈值的选择需要根据具体应用场景进行调整。

语法:

np.linalg.norm(array01-array02)

参数: 

  • 两个数组
  • 返回一个浮点值
import face_recognition
import cv2
import numpy as np

# 读取人脸库图片
img01 = cv2.imread("face_train_images/1.jpg")

# 提取人脸特征向量
face01 = face_recognition.face_encodings(img01)[0]
print(face01)

# 读取人脸库图片
img02 = cv2.imread("face_train_images/3.jpg")

# 提取人脸特征向量
face02 = face_recognition.face_encodings(img02)[0]

# 计算欧几里得距离
v = np.linalg.norm(face01-face02)

if v<0.5:
    print("是一个人!")
else:
    print("不是一个人!")
print(v)

 6.计算人脸匹配程度

语法:

face_recognition.compare_faces(known_face_encodings, face_encoding_to_check, tolerance=0.6)

功能:

  •  比较已知人脸特征向量和待检测人脸特征向量,判断是否匹配。

参数说明:

  • known_face_encodings:已知人脸特征向量的列表。

  • face_encoding_to_check:待检测的人脸特征向量。

  • tolerance:匹配的阈值,范围是 0.0 到 1.0,值越小表示匹配要求越高。

  • 返回值:一个布尔值列表,表示待检测人脸特征向量是否与已知人脸特征向量匹配

注意:

  • 提取提取已知人脸图片的人脸特征码要获取下标未 0 的数值
  • 提取未知人脸图片的人脸特征码 不获取小标
  • 在计算匹配的时候传入到函数的参数,已知人脸图片的人脸特征码 获取放入到列表中,未知获取下标未0
import face_recognition
import cv2
import numpy as np

# 读取人脸库图片
img01 = cv2.imread("face_train_images/1.jpg")
# 灰度图像
g_img01 = cv2.cvtColor(img01, cv2.COLOR_BGR2GRAY)
# 双边滤波去噪
b_img01 = cv2.bilateralFilter(g_img01,20, 40, 50)
# 转换回彩度BRG
a_img01 = cv2.cvtColor(b_img01, cv2.COLOR_BayerGBRG2BGR)
# 提取人脸特征向量
face01 = face_recognition.face_encodings(a_img01)[0]

# 读取人脸库图片
img02 = cv2.imread("face_train_images/3.jpg")
# 灰度图像
g_img02 = cv2.cvtColor(img02, cv2.COLOR_BGR2GRAY)
# 双边滤波去噪
b_img02 = cv2.bilateralFilter(g_img02,20, 40, 50)
# 转换回彩度BRG
a_img02 = cv2.cvtColor(b_img02, cv2.COLOR_BayerGBRG2BGR)
# 提取人脸特征向量
face02 = face_recognition.face_encodings(a_img02)[0]

img03 = cv2.imread("face_train_images/4.jpg")
face03 = face_recognition.face_encodings(img03)[0]

v = np.linalg.norm(face01-face02)
print(v)
# 计算欧几里得距离
is_ = face_recognition.compare_faces([face01,face03], face02,tolerance=0.5)
print(is_)

7.人脸识别

import cv2

# 开启摄像头
c = cv2.VideoCapture(0)

while True:
    ret, frame = c.read()
    if ret:
        # 显示图片
        cv2.imshow("a", frame)
    if cv2.waitKey(20) ==27 :
        break
    if cv2.waitKey(20) ==113:
        # 保存图片
        iss = cv2.imwrite("save_images/renlian01.png", frame)
        if iss:
            print("图片收集成功")
        else:
            print("没有收集到人脸")
cv2.destroyAllWindows()
import cv2
import face_recognition
import numpy as np
import os

# 开启摄像头
c = cv2.VideoCapture(0)

while True:
    ret, frame = c.read()
    if ret:
        # 显示图片
        cv2.imshow("a", frame)

    if cv2.waitKey(20) == 27:
        break
    if cv2.waitKey(20) ==113 :
        # 保存图片
        face_list = face_recognition.face_locations(frame)
        if len(face_list) > 0:
            print("检测到人脸")
            # 遍历目录 查找人脸
            path_dir = os.listdir("save_images")
            print(path_dir)
            for i in path_dir:
                # 获取人脸特征
                img01 = cv2.imread(f"save_images/{i}")
                en01 = face_recognition.face_encodings(img01)[0]
                en02 = face_recognition.face_encodings(frame)[0]
                iss = np.linalg.norm(en01-en02)
                print(iss)
                if iss<0.5:
                    print("是同一个人")
                else:
                    print("不是同一个人")

cv2.destroyAllWindows()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值