手把手教你:人脸识别考勤系统

系列文章

手把手教你:人脸识别考勤系统


本文为系列第一篇


项目简介

本文主要介绍如何使用python搭建:一个基于FaceNet(TensorFlow版)和PyQt5的人脸识别的考勤系统。

博主也参考过网上其他博主介绍FaceNet的文章,但大多是理论大于方法。很多同学肯定对原理不需要过多了解,只需要搭建出一个识别系统即可。

本文只会告诉你如何快速搭建一个人脸识别的考勤系统并运行,原理的东西可以参考其他博主

也正是因为我发现网上大多的帖子只是针对原理进行介绍,功能实现的相对很少。

如果您有以上想法,那就找对地方了!


提示:以下是本篇文章正文内容

一、项目展示

项目展示
系统界面
项目演示可以参考我在B站发的视频
手把手教你搭建:人脸识别考勤系统

二、环境需求

因为本项目基于TensorFlow因此需要以下环境:

  • tensorflow==1.7
  • scipy
  • scikit-learn
  • opencv-python
  • h5py
  • matplotlib
  • Pillow
  • requests
  • psutil
  • pyqt5

环境安装实例

环境都可以通过pip进行安装。如果只是想要功能跑起来,这边建议tensorflow安装cpu版的。

如果没使用过pycharm通过pip安装包的同学可以参考如下:

环境安装方法
点开“终端”,然后通过pip进行安装tensorflow,其他环境包也可以通过上面的方法安装。

三、功能模块介绍

1.人脸库图像

人脸库图像放在项目中:data/my_data/“人名”/“图片名”.jpg。

我这里只用了4个明星的人脸图像,可以根据你自己需要识别的人脸构建你自己的人脸库。

如下:
人脸库图片

2.构建人脸库

将图片放好后

执行:src/align/align_dataset_mtcnn.py文件
和:src/classifier.py文件

执行人脸库构建
执行上述2个文件完成后。
在:data/my_data_160文件夹中会生成自己的人脸库图像。
在:20170512-110547/my_classifier.pkl中会生成自己的人脸库图像分类。

3.启动人脸识别功能

确保上述文件执行完成并成功后。

执行:contributed/my_view.py,即可启动上面的人脸识别界面。

下面附一部分界面功能代码:

class GUI(QtWidgets.QWidget):

    def __init__(self):

        # 初始化————init__

        super().__init__()

        # 实例化人脸识别线程
        self.thread = Thread()
        self.initGUI()
        # 定义消息链接
        self.thread.signal.connect(self.show_success_box)

    def initGUI(self):

        # 设置窗口大小

        self.resize(500, 600)

        # 设置窗口位置(下面配置的是居于屏幕中间)

        qr = self.frameGeometry()

        cp = QtWidgets.QDesktopWidget().availableGeometry().center()

        qr.moveCenter(cp)

        self.move(qr.topLeft())

        # 设置窗口标题和图标

        self.setWindowTitle('人脸识别门禁系统')

        self.setWindowIcon(QtGui.QIcon('../data/images/icon.png'))

        # 设置窗口提示

        self.setToolTip('窗口提示')

        # 设置label信息

        self.label = QtWidgets.QLabel(self)

        self.label.setGeometry(QtCore.QRect(150, 50, 200, 100))

        self.label.setText('请点击下方按钮进行人脸认证!')
        # 设置自动换行
        self.label.setWordWrap(True)
        # 设置文字居中
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName('label')
        self.label.setStyleSheet("font: 75 18pt \"微软雅黑\";"
                                 "color: rgb(0, 0, 0);")
        # 设置label提示
        self.label.setToolTip('认证')

        '''
        设置打卡按钮
        '''
        self.btn = QtWidgets.QPushButton('开始认证!', self)
        self.btn.resize(200, 180)
        self.btn.move(150, 150)
        # 设置按钮样式
        self.btn.setStyleSheet("background-color: rgb(130, 60, 140);"
                               "border-color: rgb(255, 255, 255);"
                               "font: 75 24pt \"微软雅黑\";"
                               "color: rgb(255, 255, 255);")
        # 设置按钮提示
        self.btn.setToolTip('按钮提示')
        # 点击鼠标触发事件
        self.btn.clicked.connect(self.clickbtn)

        '''
        设置统计查看按钮
        '''
        self.btn_checked = QtWidgets.QPushButton('查看通过信息', self)
        self.btn_checked.resize(200, 50)
        self.btn_checked.move(150, 380)
        # 设置按钮样式
        self.btn_checked.setStyleSheet("background-color: rgb(130, 60, 140);"
                                       "border-color: rgb(255, 255, 255);"
                                       "font: 75 18pt \"微软雅黑\";"
                                       "color: rgb(255, 255, 255);")
        # 设置按钮提示
        self.btn_checked.setToolTip('按钮提示')
        # 点击鼠标触发事件
        self.btn_checked.clicked.connect(self.checked_show)

        '''
        设置统计查看按钮
        '''
        self.btn_file = QtWidgets.QPushButton('查看通过文件', self)
        self.btn_file.resize(200, 50)
        self.btn_file.move(150, 480)
        # 设置按钮样式
        self.btn_file.setStyleSheet("background-color: rgb(130, 60, 140);"
                                    "border-color: rgb(255, 255, 255);"
                                    "font: 75 18pt \"微软雅黑\";"
                                    "color: rgb(255, 255, 255);")
        # 设置按钮提示
        self.btn_file.setToolTip('按钮提示')
        # 点击鼠标触发事件
        self.btn_file.clicked.connect(self.csv_show)
        # 展示窗口
        self.show()

因为项目中启动人脸识别存在一定延迟,所以项目中还使用了多线程。

完整代码地址

感兴趣的同学可以下载完整代码,使用过程中如遇到任何问题可以私信我,我都会一一解答。

【代码分享】手把手教你:人脸识别考勤系统

  • 26
    点赞
  • 288
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 72
    评论
人脸识别是一种非常实用的技术,可以广泛应用于安防、门禁、签到等领域。在Python中,我们可以使用OpenCV库来实现人脸识别。 以下是一个简单的手把手程,帮助您使用Python和OpenCV实现人脸识别: 1. 安装OpenCV库 在命令行中输入以下命令来安装OpenCV库: ``` pip install opencv-python ``` 2. 收集人脸数据 首先,我们需要收集一些人脸数据,用于训练我们的人脸识别模型。可以使用OpenCV中内置的`cv2.face.createFisherFaceRecognizer()`方法来训练模型。以下是一个收集人脸数据的代码示例: ```python import cv2 import os # 创建一个人脸识别器 recognizer = cv2.face.createFisherFaceRecognizer() # 收集人脸数据 def collect_faces(): # 从摄像头中捕捉图像 camera = cv2.VideoCapture(0) # 循环收集人脸数据 count = 0 while True: # 读取一帧图像 ret, image = camera.read() # 转换为灰度图像 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 检测人脸 face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5) # 在图像中标记人脸 for (x, y, w, h) in faces: cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2) # 保存人脸数据 count += 1 cv2.imwrite("image%d.jpg" % count, gray[y:y+h,x:x+w]) # 显示图像 cv2.imshow("Collecting Faces", image) # 按下ESC键退出 if cv2.waitKey(1) == 27: break # 清理资源 camera.release() cv2.destroyAllWindows() # 训练人脸识别模型 def train_model(): # 加载人脸数据 images = [] labels = [] for filename in os.listdir("."): if filename.startswith("image"): label = int(filename.split(".")[0].replace("image", "")) image = cv2.imread(filename, cv2.IMREAD_GRAYSCALE) images.append(image) labels.append(label) # 训练人脸识别器 recognizer.train(images, np.array(labels)) # 收集人脸数据 collect_faces() # 训练人脸识别模型 train_model() ``` 3. 进行人脸识别 现在,我们已经训练好了一个人脸识别模型,可以使用它来进行人脸识别了。以下是一个简单的人脸识别代码示例: ```python import cv2 # 加载人脸识别器 recognizer = cv2.face.createFisherFaceRecognizer() recognizer.load("model.xml") # 进行人脸识别 def recognize_face(): # 从摄像头中捕捉图像 camera = cv2.VideoCapture(0) # 循环进行人脸识别 while True: # 读取一帧图像 ret, image = camera.read() # 转换为灰度图像 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 检测人脸 face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') faces = face_cascade.detectMultiScale(gray, scaleFactor=1.2, minNeighbors=5) # 对每个人脸进行识别 for (x, y, w, h) in faces: # 标记人脸 cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2) # 进行人脸识别 label, confidence = recognizer.predict(gray[y:y+h,x:x+w]) print("Label: %d, Confidence: %.2f" % (label, confidence)) # 显示图像 cv2.imshow("Recognizing Faces", image) # 按下ESC键退出 if cv2.waitKey(1) == 27: break # 清理资源 camera.release() cv2.destroyAllWindows() # 进行人脸识别 recognize_face() ``` 以上代码示例仅仅只是一个简单的例子,实际应用中还需要进行更多的优化和改进。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 72
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大雾的小屋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值