face_recognition人脸识别

face_recognition 介绍

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

主要功能

人脸检测 :

          • - 检测图像中的人脸位置。
          • - 支持使用 HOG 特征或 CNN(卷积神经网络)进行人脸检测。

面部特征点定位 :

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

人脸识别 :

          • - 提取人脸的特征向量(128维),并用于比较不同人脸之间的相似度。
          • - 支持从图像或视频中识别特定的人脸。

它和opencv关系

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

联系

          • 尽管   face_recognition   和 OpenCV 各有侧重,但在实际应用中,它们经常被组合起来使用,以发挥各自的优势:
          • -  图像预处理 :通常情况下,我们会先使用 OpenCV 对图像进行预处理,比如调整大小、灰度化、去噪等。这些预处理步骤有助于提高后续人脸识别的准确率。
          • -  人脸检测与识别 :预处理后的图像可以传递给   face_recognition   库来执行人脸检测和识别。  face_recognition   可以高效地完成这些任务,并返回人脸位置、面部特征点等信息。
          • -  结果可视化 :最后,我们可以再次利用 OpenCV 来对识别结果进行可视化处理,例如在图像上画出人脸框、标注识别到的名字等。

人脸操作

检测人脸

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 face_recognition
import cv2
#加载图片
image = cv2.imread("../face_train_images/ldh.jpg")
#读取人脸位置
face_locations = face_recognition.face_locations(image)
print(face_locations)

for (top, right, bottom, left) in face_locations:
    # 画出人脸区域
    cv2.rectangle(image, (left, top), (right, bottom), (0, 255, 0), 2)
# 显示结果
cv2.imshow("Detected Faces", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

切割人脸

例:
import face_recognition
import cv2
#加载图片
image = cv2.imread("../face_train_images/ldh.jpg")
#读取人脸位置
face_locations = face_recognition.face_locations(image)
print(face_locations)

for (top, right, bottom, left) in face_locations:
    # 画出人脸区域
    cv2.rectangle(image, (left, top), (right, bottom), (0, 255, 0), 2)
    qg_image = image[top:bottom,left:right]
# 显示结果
cv2.imshow("Detected Faces", qg_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

提取人脸特征

  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 维的特征向量。
例:
import face_recognition
import cv2
#加载图片
image = cv2.imread("../face_train_images/ldh.jpg")

#提取人脸特征码
face_encodings = face_recognition.face_encodings(image)[0]
print(face_encodings)

计算人脸的欧几里得距离

例:
import face_recognition
import cv2
import numpy as np
#加载图片
image1 = cv2.imread("../face_train_images/ldh.jpg")

#提取人脸特征码
face_encodings1 = face_recognition.face_encodings(image1)[0]

#加载图片
image2 = cv2.imread("../face_train_images/4.jpg")

#提取人脸特征码
face_encodings2 = face_recognition.face_encodings(image2)[0]

# 计算两个人脸编码之间的欧几里得距离。
distance = np.linalg.norm(face_encodings1 - face_encodings2)
print(distance)

*欧几里得距离*

          • 欧几里得距离(Euclidean distance)是一种测量两个点之间直线距离的方式,常用于数学、物理学和计算机科学中的各种应用,包括机器学习中的数据点距离计算。它是基于欧几里得几何的概念,通常用于计算空间中两点之间的距离。
          • 应用
            • -  数据分析 : 欧几里得距离常用于计算数据点之间的距离,例如在聚类算法(如K均值聚类)中。
            • -  计算机视觉 : 在人脸识别等任务中,欧几里得距离用于计算特征向量之间的相似度。
            • -  优化 : 在路径规划和优化问题中,计算两点之间的欧几里得距离可以帮助寻找最短路径。
          • 欧几里得距离的意义
            • 1.  距离越小,相似度越高 :
              •    -  特征向量相似 :当欧几里得距离越小说明两个特征向量之间的差异越小,即这两个人脸在特征空间中很接近。因此,这两个图像可能是同一个人或者相似度很高。
              •    -  相同身份的概率大 :在许多人脸识别系统中,如果计算出的距离小于某个设定的阈值,则系统会认为这两个面孔属于同一个人。
            • 2.  距离阈值 :
              •    -  匹配判断 :通常,系统会设置一个阈值来判断两个特征向量是否属于同一身份。如果计算出的距离小于这个阈值,则认为两张图片中的人脸是相同的;如果距离大于阈值,则认为是不同的身份。
              •    -  误识别率 :设置的阈值会影响系统的误识别率(假阳性和假阴性率)。距离阈值的选择需要根据具体应用场景进行调整。

计算人脸匹配程度

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,值越小表示匹配要求越高。
          • 返回
            • 一个布尔值列表,表示待检测人脸特征向量是否与已知人脸特征向量匹配
例:
import face_recognition
import cv2
#提取已知人脸图片
known_image = image1 = cv2.imread("../face_train_images/ldh.jpg")
#提取提取已知人脸图片的人脸特征码
face_encodings1 = face_recognition.face_encodings(known_image)[0]
#提取未知人脸图片
unknown_image  = image1 = cv2.imread("../face_train_images/1.jpg")
#提取未知人脸图片的人脸特征码
face_encodings2 = face_recognition.face_encodings(unknown_image)
#计算是否匹配
results = face_recognition.compare_faces([face_encodings1], face_encodings2[0],tolerance=0.5)
print(results)
          • 提取提取已知人脸图片的人脸特征码要获取下标未0的数值
          • 提取未知人脸图片的人脸特征码不获取小标
          • 在计算匹配的时候传入到函数的参数,已知人脸图片的人脸特征码获取放入到列表中,未知获取下标未0

图片预处理

如果对图片进行:

import face_recognition
import cv2
import numpy as np
#加载图片
image1 = cv2.imread("../face_train_images/ldh.jpg")
# 使用 OpenCV 进行图像预处理
gray_image1 = cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY)
#使用高斯滤波去除噪声
gs_img1 =cv2.GaussianBlur(gray_image1,(3,3),0)

image1 = cv2.cvtColor(gs_img1,cv2.COLOR_GRAY2BGR)
#读取人脸位置
face_locations1 = face_recognition.face_locations(image1)
#提取人脸特征码
face_encodings1 = face_recognition.face_encodings(image1)[0]

#加载图片
image2 = cv2.imread("../face_train_images/1.jpg")
# 使用 OpenCV 进行图像预处理
gray_image2 = cv2.cvtColor(image2, cv2.COLOR_BGR2GRAY)
#使用高斯滤波去除噪声
gs_img2 =cv2.GaussianBlur(gray_image2,(3,3),0)

image2 = cv2.cvtColor(gs_img2,cv2.COLOR_GRAY2BGR)
#读取人脸位置
face_locations2 = face_recognition.face_locations(image2)
#提取人脸特征码
face_encodings2 = face_recognition.face_encodings(image2)[0]

# 计算两个人脸编码之间的欧几里得距离。
distance = np.linalg.norm(face_encodings1 - face_encodings2)
print(distance)
#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值