python人脸识别系统 计算机毕业设计 LBPH算法 sqlite数据库 (源码)✅

184 篇文章 44 订阅
178 篇文章 6 订阅

毕业设计:2023-2024年计算机专业毕业设计选题汇总(建议收藏)

毕业设计:2023-2024年最新最全计算机专业毕设选题推荐汇总

🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅

1、项目介绍

技术栈:
Python语言、 opencv库、 LBPH算法 pyqt5、sqlite数据库

LBPH算法是一种基于局部二值模式的人脸识别算法。它是一种简单且高效的算法,常用于人脸识别、人脸表情识别、行人检测等领域。

原理
LBPH算法将人脸图像分为许多小的局部区域,对每个局部区域进行特征提取,然后将每个局部区域的特征串联成一个整体特征向量,最终完成相似度计算。

2、项目界面

(1)系统首页

在这里插入图片描述

(2)人脸录入

在这里插入图片描述

(3)人脸识别

在这里插入图片描述

(4)数据库管理

在这里插入图片描述

3、项目说明

LBPH算法是一种基于局部二值模式的人脸识别算法。它是一种简单且高效的算法,常用于人脸识别、人脸表情识别、行人检测等领域。

原理
LBPH算法将人脸图像分为许多小的局部区域,对每个局部区域进行特征提取,然后将每个局部区域的特征串联成一个整体特征向量,最终完成相似度计算。

LBPH算法不是深度学习算法,
它是一种基于图像纹理特征的传统机器学习算法。
LBPH算法用于人脸识别,它通过将图像划分为小区域,并计算每个区域的局部二值模式,
然后使用直方图统计这些局部二值模式的分布来表示图像特征。与深度学习相比,
LBPH算法不需要大量的标注数据和复杂的网络结构,但在某些场景下仍然具有一定的应用价值。

人脸识别系统是一种基于计算机视觉技术的应用程序,能够在图像或视频中识别和验证人脸。其主要包括两个部分:人脸检测和人脸识别。

人脸检测是指在图像或视频中寻找可能是人脸的区域,并将其框出来。常用的方法有Haar级联检测器、基于深度学习的方法等。

人脸识别是指在检测到人脸的基础上,对人脸进行特征提取和比对,实现人脸的自动识别和验证。常用的算法有Eigenface、Fisherface、LBPH等。

LBPH算法是一种基于局部二值模式(Local Binary Pattern)的特征提取算法,它将人脸图像划分成若干个小区域,对每个区域进行二值化处理,然后提取局部二值模式特征。LBPH算法具有简单易实现、鲁棒性强等优点,在小样本情况下也表现良好,因此得到了广泛应用。

Python语言和OpenCV库是构建人脸识别系统的关键工具,PyQt5则可以用来构建用户界面,SQLite数据库则可用于存储人脸特征数据和识别结果等信息。

4、核心代码



import sys,os
from PyQt5.QtWidgets import QApplication,QWidget,QPushButton,QLabel,QLineEdit,QVBoxLayout,QGroupBox,QHBoxLayout,QRadioButton,QMessageBox
from PyQt5 import QtCore, QtGui, QtWidgets,uic
from PyQt5.QtCore import *
from PyQt5.QtGui import QImage, QIcon, QPixmap
from datetime import datetime
import time
import glob
from model.SSD import FaceMaskDetection
from model.FACENET import InceptionResnetV1
from model.Facecnn import FaceCNN
import torch
from PIL import Image,ImageDraw,ImageFont
import tqdm
import resource
import numpy as np
from statistics import mode
#调用opencv2
import cv2
import dlib
import imutils
from imutils import face_utils
from scipy.spatial import distance as dist
from jishiqi import jishi




# Create arrays of known face encodings and their names



class MyWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        # ###################### 窗口初始化 ######################
        self.ui=uic.loadUi("./ui/MainUI.ui")


        #print(self.ui.__init__)
        #显示所有控件
        #print(self.ui.__dict__)
        # for k,v in self.ui.__dict__.items():
        #     print(k)
        # print(self.ui.label_riqi.text())

        # 创建一个定时器
        timer = QTimer(self)
        # 每隔1000ms刷新一次
        timer.setInterval(1000)
        # 连接定时器信号到槽函数
        timer.timeout.connect(self.showTime)
        # 启动定时器
        timer.start()

        # ####################### 初始数据 ######################





        # ####################### 人脸参数 ######################
        # 加载检测模型
        face_mask_model_path = r'weights/SSD/face_mask_detection.pb'
        self.ssd_detector = FaceMaskDetection(face_mask_model_path, margin=0, GPU_ratio=0.1)

        # 加载识别模型
        self.device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
        # 实例化
        self.facenet = InceptionResnetV1(is_train=False, embedding_length=128, num_classes=14575).to(self.device)
        # 从训练文件中加载
        self.facenet.load_state_dict(
            torch.load(r'./weights/4.Chinese_CASIA_ALL_AG_epoch/facenet_best.pt', map_location=self.device))
        self.facenet.eval()

        # 加载目标人的特征
        # name_list支持:恩培,恩培_1,,恩培_2形式,与known_embedding对应
        self.name_list, self.known_embedding = self.loadFaceFeats()
        # 增加一个未知人员
        self.name_list.append('未知')
        # 生成每个人的名称PNG图片(以解决中文显示问题)
        self.name_png_list = self.getNamePngs(self.name_list)
        # 加载佩戴和未佩戴标志
        self.mask_class_overlay = self.getMaskClassPngs()




        # ###################### 摄像头初始化 ######################
        # 初始化摄像头,默认调用第一个摄像头
        # self.url = 0
        # 如果要调用笔记本外接USB摄像头,则设置为1,默认为0
        self.url = 0
        self.cap = cv2.VideoCapture()
        # self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 500)
        # self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 400)
        # self.cap.set(cv2.CAP_PROP_FPS, 20)


        # ###################### 按键的槽函数 ######################
        # 设置摄像头按键连接函数
        self.ui.bt_open_camera.clicked.connect(self.open_camera)
        self.ui.bt_close_camera.clicked.connect(self.close_camera)
        #检测ID
        self.ui.bt_start_check.clicked.connect(self.open_camera1)
        #检测表情
        self.ui.bt_gathering.clicked.connect(self.open_camera2)
        #疲劳检测
        self.ui.bt_pilao.clicked.connect(self.open_camera3)
        # 训练
        self.ui.bt_generator.clicked.connect(self.loadFaceFeats)
        self.ui.pushButton_3.clicked.connect(self.tuichu)

        # ###################### 数据库相关操作 ######################
        # 初始化需要记录的人名
        self.record_name = []
        # 设置更新人脸数据库的按键连接函数
        self.js = jishi()

    # 进入考勤模式,通过switch_bt进行控制的函数
    def auto_control(self):
        self.check_time_set = self.format_check_time_set()
        print( self.check_time_set)
        self.ui.label_start_time.setText("当前考勤开始时间为:"+str(self.check_time_set))
        # if self.check_time_set == '':
        #     QMessageBox.warning(self, "Warning", "请先设定考勤时间(例 08:00)!", QMessageBox.Ok)
        # else:
        if self.cap.isOpened():
            if self.switch_bt == 0:
                self.switch_bt = 1
                self.ui.bt_start_check.setText(u'退出考勤')
                self.show_camera()
            elif self.switch_bt == 1:
                self.switch_bt = 0
                self.ui.bt_start_check.setText(u'开始考勤')
                self.show_camera()
            else:
                print("[Error] The value of self.switch_bt must be zero or one!")
        else:
            QMessageBox.information(self, "提示", "请先打开摄像头!", QMessageBox.Ok)


    def open_camera(self):
        # 判断摄像头是否打开,如果打开则为true,反之为false
        print(self.cap.isOpened())
        if not self.cap.isOpened():
        #     # 默认打开Windows系统笔记本自带的摄像头,如果是外接USB,可将0改成1
            self.cap.open(self.url)
            self.ui.textBrowser_log.append("相机已打开...")
            self.show_camera1()

        else:
            #self.cap.release()
            #self.ui.label_logo.clear()
            print("相机已打开")
            self.ui.textBrowser_log.append("相机已打开...")
            #self.ui.label_camera.clear()
            #self.ui.bt_open_camera.setText(u'打开相机')

    def open_camera1(self):
        # 判断摄像头是否打开,如果打开则为true,反之为false
        print(self.cap.isOpened())
        if not self.cap.isOpened():
        #     # 默认打开Windows系统笔记本自带的摄像头,如果是外接USB,可将0改成1
            self.cap.open(self.url)
            self.ui.textBrowser_log.append("相机已打开...")
            self.show_camera()

        else:
            #self.cap.release()
            #self.ui.label_logo.clear()
            print("相机已打开")
            self.ui.textBrowser_log.append("相机已打开...")
            #self.ui.label_camera.clear()
            #self.ui.bt_open_camera.setText(u'打开相机')

    def open_camera2(self):
        # 判断摄像头是否打开,如果打开则为true,反之为false
        print(self.cap.isOpened())
        if not self.cap.isOpened():
            #     # 默认打开Windows系统笔记本自带的摄像头,如果是外接USB,可将0改成1
            self.cap.open(self.url)
            self.ui.textBrowser_log.append("相机已打开...")
            self.show_biaoqing()

        else:
            # self.cap.release()
            # self.ui.label_logo.clear()
            print("相机已打开")
            self.ui.textBrowser_log.append("相机已打开...")
            # self.ui.label_camera.clear()
            # self.ui.bt_open_camera.setText(u'打开相机')


    def open_camera3(self):
        # 判断摄像头是否打开,如果打开则为true,反之为false
        print(self.cap.isOpened())
        if not self.cap.isOpened():
            #     # 默认打开Windows系统笔记本自带的摄像头,如果是外接USB,可将0改成1
            self.cap.open(self.url)
            self.ui.textBrowser_log.append("相机已打开...")
            self.show_pilao()

        else:
            # self.cap.release()
            # self.ui.label_logo.clear()
            print("相机已打开")
            self.ui.textBrowser_log.append("相机已打开...")
            # self.ui.label_camera.clear()
            # self.ui.bt_open_camera.setText(u'打开相机')

    def getMaskClassPngs(self):
        '''
        加载佩戴和未佩戴标志
        '''
        labels = ['masked','without_mask']
        overlay_list = []
        for label in labels:
            fileName = './images/%s.png' % (label)
            overlay = cv2.imread(fileName,cv2.COLOR_RGB2BGR)
            overlay = cv2.resize(overlay,(0,0), fx=0.2, fy=0.2)
            overlay_list.append(overlay)
        return overlay_list

    def close_camera(self):
        if self.cap.isOpened():
            self.cap.release()
            self.ui.textBrowser_log.append("相机已关闭...")
        else:
            print("相机已关闭")
            self.ui.textBrowser_log.append("相机已关闭...")


    def readPngFile(self,fileName):
        '''
        读取PNG图片
        '''
        # 解决中文路径问题
        png_img = cv2.imdecode(np.fromfile(fileName,dtype=np.uint8),-1)
        # 转为BGR,变成3通道
        png_img = cv2.cvtColor(png_img,cv2.COLOR_RGB2BGR)
        png_img = cv2.resize(png_img,(0,0), fx=0.4, fy=0.4)
        return png_img

    def getNamePngs(self, name_list):
        '''
        生成每个人的名称PNG图片(以解决中文显示问题)
        '''
        # 先将['恩培','恩培_1','恩培_2','小明','小明_1','小明_2']变成['恩培','小明']
        real_name_list = []
        for name in name_list:
            real_name = name.split('_')[0]
            if real_name not in real_name_list:
                real_name_list.append(real_name)

if __name__=='__main__':
    app=QApplication(sys.argv)

    #创建Qwidget子类
    w=MyWindow()
    w.ui.show()

    #app.exec_()
    sys.exit(app.exec_())

5、源码获取方式

🍅由于篇幅限制,获取完整文章或源码、代做项目的,查看我的【用户名】、【专栏名称】、【顶部选题链接】就可以找到我啦🍅

感兴趣的可以先收藏起来,点赞、关注不迷路,下方查看👇🏻获取联系方式👇🏻

  • 27
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值