基于Python搭建人脸识别考勤系统
作者:woshicver 发布时间:2021-07-08 10:17:42
介绍
在本文中,你将学习如何使用 Python 构建人脸识别系统。人脸识别比人脸检测更进一步。在人脸检测中,我们只检测人脸在图像中的位置,但在人脸识别中,我们制作了一个可以识别人的系统。
“人脸识别是验证或识别图片或视频中的人的挑战。大型科技巨头仍在努力打造更快、更准确的人脸识别模型。”
人脸识别的实际应用
人脸识别目前正被用于让世界更安全、更智能、更方便。
有几个用例:
寻找失踪人员
零售犯罪
安全标识
识别社交媒体上的帐户
考勤系统
识别汽车中的驾驶员
根据性能和复杂性,有多种方法可以执行面部识别。
传统人脸识别算法:
在 1990 年代,整体方法被用于人脸识别。手工制作的局部描述符在 1920 年代初期开始流行,然后在 2000 年代后期采用局部特征学习方法。目前广泛使用并在OpenCV中实现的算法如下:
Eigenfaces (1991)
Local Binary Patterns Histograms (LBPH) (1996)
Fisherfaces(1997)
Scale Invariant Feature Transform (SIFT) (1999)
Speed Up Robust Features (SURF)(2006)
每种方法都遵循不同的方法来提取图像信息并将其与输入图像进行匹配。
Fischer-faces和Eigenfaces与 SURF 和 SIFT 具有几乎相似的方法。
LBPH 是一种简单但非常有效的方法,但与现代人脸识别器相比,速度较慢。
与现代人脸识别算法相比,这些算法并不快。传统算法不能仅通过拍摄一个人的单张照片来训练。
人脸识别深度学习:
一些广泛使用的基于深度学习的人脸识别系统如下:
DeepFace
DeepID series of systems
VGGFace
FaceNet
人脸识别器一般是在人脸图像中找出重要的点,如嘴角、眉毛、眼睛、鼻子、嘴唇等。这些点的坐标称为五官点,这样的点有66个。这样,寻找特征点的不同技术给出不同的结果。
来源:https://www.pinterest.com/mrmosherart/face-landmarks/
人脸识别模型涉及的步骤:
1.人脸检测:定位人脸并在人脸周围绘制边界框并保留边界框的坐标。
2.人脸对齐:标准化人脸以与训练数据库一致。
3.特征提取:提取将用于训练和识别任务的人脸特征。
4.人脸识别: 将人脸与准备好的数据库中的一张或多张已知人脸进行匹配。
在传统的人脸识别方法中,我们有单独的模块来执行这 4 个步骤。在本文中,你将看到一个将这 4 个步骤组合在一个步骤中的库。
构建人脸识别系统的步骤
安装库
我们需要安装 2 个库来实现人脸识别。
dlib : dlib是一个现代 C++ 工具包,包含机器学习算法和工具,用于在 C++ 中创建复杂的软件以解决实际问题。
# installing dlib
pip install dlib
脸部识别:将face_recognition库,创建和维护 Adam Geitgey,包含了dlib人脸识别功能。
# installing face recognition
pip install face recognition
Opencv 用于一些图像预处理。
# installing opencv
pip install opencv
导入库
现在你已经下载了所有重要的库,让我们导入它们来构建系统。
import cv2
import numpy as np
import face_recognition
加载图像
导入库后,你需要加载图像。
face_recognition 库以 BGR 的形式加载图像,为了打印图像,你应该使用 OpenCV 将其转换为 RGB。
imgelon_bgr = face_recognition.load_image_file('elon.jpg')
imgelon_rgb = cv2.cvtColor(imgelon_bgr,cv2.COLOR_BGR2RGB)
cv2.imshow('bgr', imgelon_bgr)
cv2.imshow('rgb', imgelon_rgb)
cv2.waitKey(0)
如你所见,RGB 看起来很自然,因此你将始终把通道更改为 RGB。
查找人脸位置并绘制边界框
你需要在人脸周围绘制一个边界框,以显示是否已检测到人脸。
imgelon =face_recognition.load_image_file('elon.jpg')
imgelon = cv2.cvtColor(imgelon,cv2.COLOR_BGR2RGB)
#----------Finding face Location for drawing bounding boxes-------
face = face_recognition.face_locations(imgelon_rgb)[0]
copy = imgelon.copy()
#-------------------Drawing the Rectangle-------------------------
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]
测试:
为了测试,我们加载图像并将其转换为编码,然后在训练期间将编码与存储的编码进行匹配,这种匹配基于寻找最大相似度。当你找到与测试图像匹配的编码时,你将获得与训练编码相关联的名称。
# lets test an image
test = face_recognition.load_image_file('elon_2.jpg')
test = cv2.cvtColor(test, 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。
构建人脸识别系统
导入必要的库
import cv2
import face_recognition
import os
import numpy as np
from datetime import datetime
import pickle
定义将存储训练图像数据集的文件夹路径
path = 'student_images'
注意:对于训练,我们只需要将训练图片放到path目录下,图片名称必须是person_name.jpg/jpeg格式。
例如:
正如你在我的 student_images 路径中看到的,有 6 个人。因此我们的模型只能识别这 6 个人。你可以在此目录中添加更多图片,以便更多人识别
现在创建一个列表来存储 person_name 和图像数组。
遍历path目录中存在的所有图像文件,读取图像,并将图像数组附加到图像列表,并将文件名附加到classNames。
images = []
classNames = []mylist = os.listdir(path)
for cl in mylist:
curImg = cv2.imread(f'{path}/{cl}')
images.append(curImg)
classNames.append(os.path.splitext(cl)[0])
创建一个函数来对所有训练图像进行编码并将它们存储在一个变量encoding_face_train 中。
def findEncodings(images):
encodeList = []
for img in images:
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
encoded_face = face_recognition.face_encodings(img)[0]
encodeList.append(encoded_face)
return encodeList
encoded_face_train = findEncodings(images)
创建一个函数,该函数将创建一个Attendance.csv文件来存储考勤时间。
注意:这里需要手动创建Attendance.csv文件并在函数中给出路径
def markAttendance(name):
with open('Attendance.csv','r+') as f:
myDataList = f.readlines()
nameList = []
for line in myDataList:
entry = line.split(',')
nameList.append(entry[0])
if name not in nameList:
now = datetime.now()
time = now.strftime('%I:%M:%S:%p')
date = now.strftime('%d-%B-%Y')
f.writelines(f'n{name}, {time}, {date}')
我们首先检查出席者的名字是否已经在attenting .csv中可用。
如果出席者的名字在attends.csv中不可用,我们将在函数调用的时间中写入出席者的名字。
阅读网络摄像头进行实时识别
# take pictures from webcam
cap = cv2.VideoCapture(0)while True:
success, img = cap.read()
imgS = cv2.resize(img, (0,0), None, 0.25,0.25)
imgS = cv2.cvtColor(imgS, cv2.COLOR_BGR2RGB)
faces_in_frame = face_recognition.face_locations(imgS)
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)
faceDist = face_recognition.face_distance(encoded_face_train, encode_face)
matchIndex = np.argmin(faceDist)
print(matchIndex)
if matches[matchIndex]:
name = classNames[matchIndex].upper().lower()
y1,x2,y2,x1 = faceloc
# since we scaled down by 4 times
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.FILLED)
cv2.putText(img,name, (x1+6,y2-5), cv2.FONT_HERSHEY_COMPLEX,1,(255,255,255),2)
markAttendance(name)
cv2.imshow('webcam', img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
仅将识别部分的图像大小调整为 1/4。输出帧将是原始大小。
调整大小可提高每秒帧数。
face_recognition.face_locations()在调整大小的图像(imgS)上被调用。对于人脸边界框坐标必须乘以 4 才能覆盖在输出帧上。
**face_recognition.distance()**返回测试图像的距离数组,其中包含我们训练目录中存在的所有图像。
最小人脸距离的索引将是匹配的人脸。
找到匹配的名称后,我们调用markAttendance函数。
使用**cv2.rectangle()**绘制边界框。
我们使用**cv2.putText()**将匹配的名称放在输出帧上。
考勤报告
人脸识别系统面临的挑战
尽管构建面部识别看起来很容易,但在没有任何限制的情况下拍摄的现实世界图像中却并不容易。面部识别系统面临的几个挑战如下:
**照明:**它极大地改变了面部外观,观察到照明条件的轻微变化对其结果产生重大影响。
**姿势:**面部识别系统对姿势高度敏感,如果数据库仅在正面视图上进行训练,可能会导致识别错误或无法识别。
面部表情:同一个人的不同表情是另一个需要考虑的重要因素。不过,现代识别器可以轻松处理它。
低分辨率:识别器的训练必须在分辨率好的图片上进行,否则模型将无法提取特征。
**老化:**随着年龄的增长,人脸的形状、线条、纹理变化是另一个挑战。
结论
在本文中,我们讨论了如何使用face_recognition库创建人脸识别系统并制作了考勤系统。你可以使用Tkinter或Pyqt进一步设计用于人脸识别考勤系统的GUI。
来源:https://blog.csdn.net/woshicver/article/details/122119664


猜你喜欢
- 本文实例讲述了PHP5.6读写excel表格文件操作。分享给大家供大家参考,具体如下:测试环境:php5.6.24.这块没啥兼容问题。需要更
- import介绍import语句作用就是用来导入模块的,它可以出现在程序中的任何位置。import语句语法使用import语句导入模块,im
- SHA (Secure Hash Algorithm,译作安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研
- 如何让页面超时并指定一个超时时间?下面就是利用缓冲的程序页面事例: <%@ OutputCache Du
- 介绍对于服务器后端开发者而言,有时候需要把自己的一些服务直接暴露给PM或者其他RD使用,这个时候需要搭建一套web服务可以和前端用户做简单交
- k-means 聚类算法思想先随机选择k个聚类中心,把集合里的元素与最近的聚类中心聚为一类,得到一次聚类,再把每一个类的均值作为新的聚类中心
- 使用运算符“+”PHP的数组运算符“+”可以用来联合两个(或
- 最近因为要安装Tensorflow,然后发现tensorflow居然不支持python3.7,于是怒而将其降级到3.6以下是具体命令,mar
- 目录当前时间实例1:实例2:指定时间戳实例1:实例2:总结我们将会启用到time库:当前时间实例1:import time# 获得当前时间时
- pydev debugger: process 10341 is connecting无法debu今天在Pycharm中debug时无法正常
- 一、推荐方法 CURL获取<?php$c = curl_init();$url = 'www.jb51.net';cu
- 换脸!这段时间,deepfakes搞得火热,比方说把《射雕英雄传》里的朱茵换成了杨幂,看下面的图!毫无违和感!其实早在之前,基于AI换脸的技
- 1.open使用open打开文件后一定要记得调用文件对象的close()方法。比如可以用try/finally语句来确保最后能关闭文件。fi
- 前言一向用Python 3,最近研究微信公众号开发,各云平台只支持Python 2.7,想用其他版本需要自己搭建环境。而网上又搜不到Pyth
- Anaconda is a completely free Python distribution (including for comme
- 在javascript里怎么样才能把int型转换成string型(1)var x=100 a = &nb
- 在研究ezSQL的时候就看到了mssql_connect()等一些php提供的连接MSSQL的函数,本以为php这个开源的风靡世界的编程语言
- 今天登录社区的时候看到有之前的文章有个留言的评论,说如何统计typecho所有文章的字数,这里分享一下代码。在当前主题的functions.
- 假设有两个dict x和y,合并成一个新的dict,不改变 x和y的值,例如x = {'a': 1, 'b'
- 1、注释单行注释,使用#,#号后面的都是注射,例如#我是单行注释print("Hello Python world")多