本项目使用face_recognition库编写一个简单的python程序,实现人脸识别。这个库是基于深度学习技术,希望尽量用最方便最简单的方式实现人脸识别,只要使用一张图片进行训练就能从大量的人脸数据找到验证者对应的身份,准确率达96%。
一、face_recognition介绍
face_recognition是一个人脸识别开源库,是在深度学习框架dlib上做的整合。通过 Python 语言将它封装为一个非常简单就可以实现人脸识别的 API 库,屏蔽了人脸识别的算法细节,大大降低了人脸识别功能的开发难度。
关于face_recognition库中的相关API说明见下表。
api | 说明 |
---|---|
load_image_file | 将img文件加载到numpy 数组中 |
face_locations | 查找图像中所有面部和所有面部特征的位置 |
batch_face_locations | 批次人脸定位函数(GPU) |
face_encodings | 图像编码转为特征向量 |
compare_faces | 特征向量比对) |
face_landmarks | 人脸特征提取函数 |
face_distance | 计算特征向量差值 |
二、实验准备
1.库安装
(1)安装人脸识别库dlib库,一般安装方法如下:
pip install dlib
如果安装出错,可以详见之前写过的博客
Dlib库安装方法
(2)安装实际的人脸识别库face_recognition,安装方法如下:
pip install face_recognition
(3)安装opencv库,安装方法如下:
pip install opencv
2.人脸数据库
这里我在桌面新建了一个face文件夹,用来存放一些人脸图像。
3.实现代码
程序说明:该程序实现了调用摄像头拍摄一张人脸图像,以“img.jpg”命名并保存到桌面。然后利用face_recognition函数中load_image_file指令将图片文件加载到numpy 数组中,利用face_encodings指令将图像编码转为特征向量。同样的方法遍历人脸数据库face文件夹里面的每一张图片,然后将文件的图像编码转为特征向量。
#将本程序命名为Recognition.py
#人脸检测的程序,测试一张训练的图片,然后从文件夹中获取所有的图片进行人脸对比,获取同一个人脸的图片
import cv2
import face_recognition
import os
#拍摄照片函数
def get_photo():
capture = cv2.VideoCapture(0, cv2.CAP_DSHOW) #打开摄像头,参数0是摄像头端口,可以更换
img = "C:/Users/Administrator/Desktop/img.jpg" #给拍摄的图片命名,保存到指定的路经
ref,frame=capture.read() #将摄像头中的一帧数据保存下来
cv2.imwrite(img,frame) #将图片保存下来
cv2.imshow(img,frame) #窗口显示
cv2.waitKey(1000) #延时1000ms,即1s
cv2.destroyAllWindows() #关闭窗口
return img #返回图片数据
#load_image_file加载人脸图像
img_modi = face_recognition.load_image_file(get_photo()) #参数调用拍照函数,获取一张验证者的图像
img_modi_rgb =cv2.cvtColor(img_modi,cv2.COLOR_BGR2RGB) #图像类型转换函数
#给定一个图像,返回图像中每个面的128维人脸编码
train_encode = face_recognition.face_encodings(img_modi)[0] #编码.如果这里报错,那就是没有拍到人脸图像,需要调整相机拍到完整的人脸图像
#返回face文件夹里面的内容,要从人脸库face文件夹中,获取验证者的身份
pathDir = os.listdir("C:/Users/Administrator/Desktop/face/") #返回的是文件夹里的每一张图片
flag = 0 #标志位
#测试另外一张图像
for i in pathDir: #遍历6张图片
test = face_recognition.load_image_file("C:/Users/Administrator/Desktop/face/" + i) #将文件夹里的每一张图片打开
test = cv2.cvtColor(test,cv2.COLOR_BGR2RGB) #将文件夹里的每一张图片进行转换
test_encode = face_recognition.face_encodings(test)[0] #将图像编码
#compare_faces比较脸部编码列表和候选编码,看看它们是否匹配
s = face_recognition.compare_faces([train_encode],test_encode,tolerance=0.49) #参数tolerance是两张脸之间有多少距离才算匹配。该值越小对比越严格,0.49是我测出来最佳的
#print(s,type(s)) #打印类型
if s == [True] : #如果匹配成功则返回的是布尔型列表里的True
flag = 1 #成功的话将标志位赋值为1
break #直接跳出循环
else:
flag = 0 #没有匹配成功则标志位为0
if flag ==1:
print("验证者图片是:" , i) #输出对比结果
运行程序后,利用摄像头拍摄人脸图像,即可从窗口中打印输出验证者的信息