人脸识别目前正被用于让世界变得更安全、更智能、更方便。在本文中,您将学习如何使用Python构建人脸识别系统。人脸识别比人脸检测更进一步。有兴趣的可以研究一下。
目录
介绍人脸识别的实际应用。建立人脸识别系统的步骤。安装库。导入库。加载图像,找到人脸位置,画出边界框。为人脸识别训练图像构建人脸识别系统。人脸识别系统面临的挑战
介绍
在本文中,您将学习如何使用Python构建人脸识别系统。人脸识别比人脸检测更进一步。在人脸检测中,我们只检测人脸在图像中的位置,而在人脸识别中,我们做了一个可以识别人的系统。
“人脸识别是验证或识别图片或视频中的人的一项挑战。大型科技巨头仍在努力构建更快、更准确的人脸识别模型。”
人脸识别的实际应用
人脸识别目前正被用于让世界变得更安全、更智能、更方便。
有几个使用案例:
寻找失踪人员
零售犯罪
安全标识
识别社交媒体上的账户
考勤系统
指认车里的司机。
根据性能和复杂程度,有许多方法可以执行面部识别。
传统人脸识别算法:
20世纪90年代,整体方法被用于人脸识别。手工制作的局部描述符在20世纪20年代初开始流行,然后在2000年代后期采用了局部特征学习方法。目前OpenCV中广泛使用和实现的算法如下:
特征脸(1991年)
局部二元模式直方图(LBPH) (1996年)
渔民的面孔(1997年)
尺度不变特征变换(SIFT) (1999年)
加速强健功能(SURF)(2006年)
每种方法都遵循不同的方法来提取图像信息并将其与输入图像进行匹配。
Fischer-faces和Eigenfaces的冲浪和筛选方法几乎相同。
LBPH是一种简单但非常有效的方法,但它比现代人脸识别器慢。
与现代人脸识别算法相比,这些算法的速度并不快。传统算法不能只通过拍摄一个人的单张照片来训练。
人脸识别深度学习:
一些广泛使用的基于深度学习的人脸识别系统如下:
深脸
DeepID系列系统
VGGFace
FaceNet
一般情况下,人脸识别器在人脸图像中寻找重要的点,如嘴角、眉毛、眼睛、鼻子、嘴唇等。这些点的坐标称为五感点,这样的点有66个。这样,寻找特征点的不同技术给出不同的结果。
资料来源:https://www.pinterest.com/mrmosherart/face-landmarks/
人脸识别模型中涉及的步骤:
1.人脸检测:定位人脸,在人脸周围画一个包围盒,并保持包围盒的坐标。
2.面部对齐:标准化面部以与训练数据库一致。
3.特征提取:提取将用于训练和识别任务的面部特征。
4.人脸识别:将人脸与准备好的数据库中的一个或多个已知人脸进行匹配。
在传统的人脸识别方法中,我们有一个单独的模块来执行这四个步骤。在本文中,您将看到一个在一个步骤中结合了这4个步骤的库。
构建人脸识别系统的步骤
安装库
我们需要安装2个库来实现人脸识别。
DLIB: DLIB是一个现代的C工具包,它包含机器学习算法和工具,用于用C语言创建复杂的软件来解决实际问题。
#安装dlib
pip安装dlib
人脸识别:在face_recognition库中创建并维护Adam Geitgey,其中包含dlib人脸识别功能。
#安装面部识别
pip安装面部识别
Opencv用于一些图像预处理。
#安装opencv
pip安装opencv
导入库
现在您已经下载了所有重要的库,让我们导入它们来构建系统。
导入cv2
将numpy作为np导入
导入人脸识别
加载图像
导入库后,您需要加载图像。
人脸识别库以BGR的形式加载图像。为了打印图像,您应该使用OpenCV将其转换为RGB。
im gelon _ bgr=face _ recognition . load _ image _ file(' elon . jpg ')
img elon _ RGB=cv2 . CVT color(img elon _ bgr,cv2。COLOR_BGR2RGB)
cv2.imshow('bgr ',imgelon_bgr)
cv2.imshow('rgb ',imgelon_rgb)
cv2.waitKey(0)
正如你所看到的,RGB看起来很自然,所以你总是会将通道更改为RGB。
查找人脸位置并绘制边界框
您需要在人脸周围绘制一个边界框,以显示人脸是否已被检测到。
im gelon=face _ recognition . load _ image _ file(' elon . jpg ')
imgelon=cv2.cvtColor(imgelon,cv2。COLOR_BGR2RGB)
# -查找绘制边界框的面位置-
face=face _ recognition . face _ locations(imgelon _ RGB)[0]
copy=imgelon.copy()
# -绘制矩形-
cv2.rectangle(copy,(face[3],face[0]),(face[1],face[2]),(255,0,255),2)
cv2.imshow('copy ',copy)
cv2.imshow('elon ',imgelon)
cv2.waitKey(0)
为人脸识别训练图像
库是通过自动查找人脸,只处理人脸制作的,不需要从图片中裁剪人脸。
培训:
在这个阶段,我们将训练图像转换成一些代码,并使用图像的名称来存储代码。
train _ elon _ encodings=face _ recognition . face _ encodings(imgelon)[0]
测试:
为了测试,我们加载图像并将其转换为代码,然后在训练时将代码与存储的代码进行匹配。这种匹配是基于找到最大的相似性。当您找到与测试图像匹配的代码时,您将获得与训练代码相关联的名称。
#让我们测试一个图像
test=face _ recognition . load _ image _ file(' elon _ 2 . jpg ')
test=cv2.cvtColor(测试,cv2。COLOR_BGR2RGB)
test _ encode=face _ recognition . face _ encodings(test)[0]
print(face _ recognition . compare _ faces([train _ encode],test_encode))
Face_recognition.compare_faces,如果两幅图像中的人相同,则返回True,否则返回False。
构建人脸识别系统
导入必要的库。
导入cv2
导入人脸识别
导入操作系统
将numpy作为np导入
从日期时间导入日期时间
进口泡菜
定义存储训练图像数据集的文件夹路径。
path='student_images '
注意:对于训练,我们只需要把训练图片放在路径目录下。图片的名称必须采用“人物_ name.jpg/jpeg.”的格式
例如:
正如你在我的学生图片路径中看到的,有6个人。所以我们的模型只能识别这六个人。你可以在这个目录中添加更多的图片,以便更多的人能够认出它们。
现在创建一个列表来存储person_name和image数组。
遍历路径目录中存在的所有图像文件,读取图像,将图像数组附加到图像列表,并将文件名附加到类名。
图像=[]
classNames=[]mylist=os.listdir(路径)
对于我的列表中的cl:
curImg=cv2 . im read(f“{ path }/{ cl }”)
images.append(curImg)
class names . append(OS . path . split ext(cl)[0])
创建一个函数,对所有训练图像进行编码,并存储在变量encoding_face_train中。
def findEncodings(图像):
encodeList=[]
对于图像中的img:
img=cv2.cvtColor(img,cv2。COLOR_BGR2RGB)
encoded _ face=face _ recognition . face _ encodings(img)[0]
encodeList.append(encoded_face)
返回编码列表
encoded _ face _ train=find encodings(images)
创建一个函数,该函数将创建一个Attendance.csv文件来存储出勤时间。
注意:这里需要手动创建Attendance.csv文件,并在函数中给出路径。
def markAttendance(姓名):
用open('Attendance.csv ',' r ')作为f:
myDataList=f.readlines()
名称列表=[]
对于myDataList中的行:
entry=line.split(',')
nameList.append(条目[0])
如果姓名不在姓名列表中:
now=datetime.now()
time=now.strftime('%I:%M:%S:%p ')
date=now.strftime('%d-%B-%Y ')
f . writelines(f ' n {姓名},{时间},{日期} ')
首先,我们检查attenting.csv中是否已经有与会者的姓名。
如果attends.csv中没有参加者的姓名,我们将在函数调用时写入参加者的姓名。
读取网络摄像头进行实时识别
#通过网络摄像头拍照
cap=cv2。真实时的视频捕获(0 ):
success,img=cap.read()
imgS=cv2.resize(img,(0,0),None,0.25,0.25)
imgS=cv2.cvtColor(imgS,cv2。COLOR_BGR2RGB)
face _ in _ frame=face _ recognition . face _ locations(img)
encoded _ faces=face _ recognition . face _ encodings(imgS,faces_in_frame)for encode_face,faceloc in zip(encoded_faces,faces_in_frame):
matches=face _ recognition . compare _ faces(encoded _ face _ train,encode_face)
face dist=face _ recognition . face _ distance(encoded_face _ train,encoded _ face)
matchIndex=np.argmin(faceDist)
打印(匹配索引)
如果匹配[matchIndex]:
name=classNames[matchIndex]。鞋帮()。下部()
y1,x2,y2,x1=faceloc
#自从我们缩小了4倍
y1,x2,y2,x1=y1*4,x2*4,y2*4,x1*4
cv2.rectangle(img,(x1,y1),(x2,y2),(0,255,0),2)
cv2.rectangle(img,(x1,y2-35),(x2,y2),(0,255,0),cv2。已填充)
cv2.putText(img,name,(x1 6,y2-5),cv2。FONT_HERSHEY_COMPLEX,1,(255,255,255),2)
markAttendance(姓名)
cv2.imshow('网络摄像头',img)
if cv2.waitKey(1)0xFF==ord('q '):
破裂
仅将已识别部分的图像尺寸调整为1/4。输出帧将是原始大小。
调整大小会增加每秒的帧数。
在调整大小的图像(img)上调用face _ recognition . face _ locations()。面边界框的坐标必须乘以4才能覆盖输出帧。
* * face _ recognition . distance()* *返回测试图像的距离数组,其中包含我们的训练目录中存在的所有图像。
最小面部距离的索引将是匹配的面部。
找到匹配的名字后,我们调用markAttendance函数。
使用**cv2.rectangle()**绘制边界框。
我们使用**cv2.putText()**将匹配的名称放在输出帧上。
考勤报告
人脸识别系统面临的挑战
虽然构造面部识别看起来很容易,但在没有任何限制的真实世界图像中并不容易。面部识别系统面临的几个挑战如下:
* *光照:* *它极大地改变了面部外观,并且观察到光照条件的轻微变化对其结果有显著影响。
* *姿势:* *面部识别系统对姿势高度敏感。如果数据库只在正面视图上训练,可能会导致识别错误或者无法识别。
面部表情:同一个人的不同表情是另一个需要考虑的重要因素。然而,现代识别器可以轻松处理它。
低分辨率:识别器的训练必须在分辨率好的图片上进行,否则模型将无法提取特征。
* *衰老:* *随着年龄的增长,人脸的形状、线条、纹理的变化又是一个挑战。
结论
在这篇文章中,我们讨论了如何使用人脸识别库来创建一个人脸识别系统和一个考勤系统。可以使用Tkinter或者Pyqt进一步设计人脸识别考勤系统的GUI。
以上是基于Python构建人脸识别考勤系统的详细内容。更多关于Python人脸识别考勤系统的信息,请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。