文章目录
- face_recognition 介绍
- 主要功能**
- 与opencv联系
- 联系
- 检测人脸
- 切割人脸
- 提取人物关键特征
- 计算人脸的欧几里得距离
- 计算人脸匹配程度
- 总结
face_recognition 介绍
face_recognition 介绍
face_recognition
是一个非常流行的 Python 库,专门用于人脸识别任务。它基于 dlib 库和 HOG(Histogram of Oriented Gradients)特征以及深度学习模型,提供了简单易用的接口来进行人脸检测、面部特征点定位和人脸识别。face_recognition
库由 Adam Geitgey 开发,旨在简化人脸识别任务,使其更加容易上手。
首先我们要明白face_recognition跟opencv库一样能够作为图像识别,一个主要针对的是人脸,一个针对的是图像
主要功能**
- 人脸检测:
- 检测图像中的人脸位置。
- 支持使用 HOG 特征或 CNN(卷积神经网络)进行人脸检测。
- 面部特征点定位:
- 检测人脸上的关键特征点(如眼睛、鼻子、嘴巴等)。
- 人脸识别:
- 提取人脸的特征向量(128维),并用于比较不同人脸之间的相似度。
- 支持从图像或视频中识别特定的人脸。
`
与opencv联系
face_recognition
和 OpenCV 是两个独立的计算机视觉库,但它们在功能上有一些重叠,并且经常一起使用来完成复杂的视觉任务。下面简要介绍两者的联系:
联系
尽管 face_recognition
和 OpenCV 各有侧重,但在实际应用中,它们经常被组合起来使用,以发挥各自的优势:
- 图像预处理:通常情况下,我们会先使用 OpenCV 对图像进行预处理,比如调整大小、灰度化、去噪等。这些预处理步骤有助于提高后续人脸识别的准确率。
- 人脸检测与识别:预处理后的图像可以传递给
face_recognition
库来执行人脸检测和识别。face_recognition
可以高效地完成这些任务,并返回人脸位置、面部特征点等信息。 - 结果可视化:最后,我们可以再次利用 OpenCV 来对识别结果进行可视化处理,例如在图像上画出人脸框、标注识别到的名字等。
检测人脸
功能:- 检测图像中的人脸位置。
- 参数
img
:图像的 NumPy 数组。number_of_times_to_upsample
:图像上采样的次数,用于提高检测精度。model
:使用的模型,可以是'hog'
(默认)或'cnn'
。
- 返回:一个列表,每个元素是一个
(top, right, bottom, left)
的元组,表示人脸的位置
举例:
import cv2
import face_recognition
import os
#读取人脸图片
img = cv2.imread("images/p1.png")
#检测人脸,返回人脸坐标信息
face_List= face_recognition.face_locations(img)
print(face_List)
#获取人脸坐标
for x in face_List:cv2.rectangle(img,(x[3],x[0]),(x[1],x[2]),(0,255,0),1)cv2.imshow("a",qie_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行的结果:
人脸信息坐标:
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/32864dc153ab45c1b651fc699d2e7bb9.png
切割人脸
qie_img = img[x[0]:x[2],x[3]:x[1]]
在检测人脸的基础上加入人脸的坐标进行具体的切割
完整代码:
import cv2
import face_recognition
import os
#读取人脸图片
img = cv2.imread("images/p1.png")
#检测人脸,返回人脸坐标信息
face_List= face_recognition.face_locations(img)
print(face_List)
#获取人脸坐标
for x in face_List:cv2.rectangle(img,(x[3],x[0]),(x[1],x[2]),(0,255,0),1)#切割人脸qie_img = img[x[0]:x[2],x[3]:x[1]]
cv2.imshow("old",img)
cv2.imshow("new",qie_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
提取人物关键特征
基于本文的内容我们需要在切割人脸后多找几个图片进行保存,等待后面进行分析
保存图像的代码:cv2.imwrite("需要保存的图片路径/保存图片的名称",需要放入图片的名称)
import face_recognition
import cv2
import numpy as np
#读取人脸库
img1 = cv2.imread("images/p1.png")
#提取人脸特征向量
face01 = face_recognition.face_encodings(img1)[0]#读取人脸原图的图片
img2 = cv2.imread("images/p2.png")
face02 = face_recognition.face_encodings(img2)[0]
#计算欧几里得距离
v = np.linalg.norm(face01-face02)
print(v)
if v < 0.4:print("是一个人")
else:print("不是一个人")
进行判断:
计算人脸的欧几里得距离
欧几里得距离**
欧几里得距离(Euclidean distance)是一种测量两个点之间直线距离的方式,常用于数学、物理学和计算机科学中的各种应用,包括机器学习中的数据点距离计算。它是基于欧几里得几何的概念,通常用于计算空间中两点之间的距离。
应用
- 数据分析: 欧几里得距离常用于计算数据点之间的距离,例如在聚类算法(如K均值聚类)中。
- 计算机视觉: 在人脸识别等任务中,欧几里得距离用于计算特征向量之间的相似度。
- 优化: 在路径规划和优化问题中,计算两点之间的欧几里得距离可以帮助寻找最短路径。
欧几里得距离的意义
- 距离越小,相似度越高:
- 特征向量相似:当欧几里得距离越小说明两个特征向量之间的差异越小,即这两个人脸在特征空间中很接近。因此,这两个图像可能是同一个人或者相似度很高。
- 相同身份的概率大:在许多人脸识别系统中,如果计算出的距离小于某个设定的阈值,则系统会认为这两个面孔属于同一个人。
- 距离阈值:
- 匹配判断:通常,系统会设置一个阈值来判断两个特征向量是否属于同一身份。如果计算出的距离小于这个阈值,则认为两张图片中的人脸是相同的;如果距离大于阈值,则认为是不同的身份。
- 误识别率:设置的阈值会影响系统的误识别率(假阳性和假阴性率)。距离阈值的选择需要根据具体应用场景进行调整。
- 导入代码块:
v = np.linalg.norm(face01-face02)
应用
计算人脸匹配程度
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 的数值
提取未知人脸图片的人脸特征码 不获取小标
首先进行人脸信息的采集:
import cv2#开启摄像头
c = cv2.VideoCapture(0)
if c.isOpened():print("d")
while(True):ret,frame = c.read()if ret:#显示图cv2.imshow("a",frame)if cv2.waitKey(20)==27:breakif cv2.waitKey(20) == 113:#保存人脸iss = cv2.imwrite("save_image/renlian01.png",frame)if iss ==True:print("收集人脸成功")else:print("收集人脸失败")
cv2.destroyAllWindows()
**在计算匹配的时候传入到函数的参数,已知人脸图片的人脸特征码 获取放入到列表中,未知获取下标未0
举例:
import cv2
import face_recognition
import os
import numpy as np
#开启摄像头
c = cv2.VideoCapture(0)while(True):ret,frame = c.read()if ret:#显示图cv2.imshow("a",frame)if cv2.waitKey(20)==27:breakif cv2.waitKey(20) == 113:# 检测人脸face_list = face_recognition.face_locations(frame)print(len(face_list))if len(face_list) > 0:print("检测到人脸")# 遍历目录,查找人脸path = os.listdir("save_image")print(path)for i in path:#获取人脸特征img = cv2.imread(f"save_image\\{i}")print(img)en1 = face_recognition.face_encodings(img)[0]en2 = face_recognition.face_encodings(frame)[0]iss = np.linalg.norm(en1-en2)print(iss)if iss < 0.5:print("是同一个人")else:print("不是同一个人")cv2.destroyAllWindows()
关于人脸采集信息的验证。
总结
相关的关于人脸识别的项目和题目练习,将在下一篇笔记进行更新。