python人脸识别系统 Tensorflow 人脸检测 facenet人脸识别算法 毕业设计(源码)✅

199 篇文章 10 订阅
191 篇文章 89 订阅
本文详细介绍了2023-2024年计算机专业的毕业设计选题——基于Python、facenet、Tensorflow和MySQL的人脸识别系统。涵盖了系统的技术栈、界面设计、功能模块(如人脸录入、识别与记录查询),并展示了核心代码片段,展示了如何利用这些技术构建一个完整的人脸识别系统。
摘要由CSDN通过智能技术生成

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

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

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

1、项目介绍

技术栈:
Python语言、facenet人脸识别算法 Tensorflow MySQL数据库,
可实现人脸的录入,人脸识别,识别记录查询,
基于Tensorflow和mysql数据库实现的人脸识别系统
Python语言提供了丰富的图像处理和机器学习库,如OpenCV、dlib、Tensorflow等,这些库可以辅助实现人脸检测、对齐、特征提取等功能;而facenet是一种基于深度学习的人脸识别算法,可以实现高精度的特征提取。MySQL数据库提供了数据存储和查询的功能,可以方便地存储和管理人脸识别系统中的数据。

综上所述,Python语言、facenet人脸识别算法、Tensorflow和MySQL数据库合作使用,可以搭建出一个完整的人脸识别系统。

2、项目界面

(1)人脸识别界面

在这里插入图片描述

(2)识别记录统计

在这里插入图片描述

(3)人脸识别记录

在这里插入图片描述

(4)录入人脸
在这里插入图片描述

(5)管理员登录
在这里插入图片描述

(6)人脸识别检测

在这里插入图片描述

(7)MySQL数据库数据管理

在这里插入图片描述

3、项目说明

人脸识别系统是一种通过计算机视觉技术,对人脸进行采集、特征提取、特征匹配等处理,实现自动识别的系统。通常包括人脸采集、人脸检测、人脸对齐、特征提取、特征匹配等模块。Python语言和facenet人脸识别算法是实现该系统的关键技术。

人脸识别系统一般包括以下几个步骤:

人脸采集:使用摄像头或者照片等方式采集人脸图像数据。

人脸检测:使用OpenCV等库,对采集到的图像进行人脸检测,找出图像中的人脸区域。

人脸对齐:使用dlib等库,对人脸图像进行对齐操作,将人脸图像转换为标准姿态。

特征提取:使用facenet等人脸识别算法,对人脸图像进行特征提取,生成对应的128维特征向量。

特征匹配:使用L2距离等方法,对查询人脸图像和数据库中已知人脸图像的特征向量进行比对,找出最相似的人脸。

识别记录查询:将识别结果保存在MySQL数据库中,用户可以通过查询数据库,查看历史识别记录。

Python语言提供了丰富的图像处理和机器学习库,如OpenCV、dlib、Tensorflow等,这些库可以辅助实现人脸检测、对齐、特征提取等功能;而facenet是一种基于深度学习的人脸识别算法,可以实现高精度的特征提取。MySQL数据库提供了数据存储和查询的功能,可以方便地存储和管理人脸识别系统中的数据。

综上所述,Python语言、facenet人脸识别算法、Tensorflow和MySQL数据库合作使用,可以搭建出一个完整的人脸识别系统。

4、核心代码

import sys, cv2, os, pickle
import numpy as np
import time
from datetime import datetime
from database.dataMess import *
from ui import win, add_inf, login, admin
from face_detect.cap_detect import capture_face
from face_detect.image_detect import image_face
from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog, QMessageBox, QFileDialog, QTableWidgetItem
from PyQt5.QtCore import QTimer,  QPoint
from PyQt5.QtGui import QImage, QPixmap
from PyQt5 import Qt, QtWidgets, QtGui, QtCore
#from matplotlib import pyplot as plt
from face_recog.recog import recg
from image_train.data_train import train


image_path = "./image/"


class LoginWin(QDialog, login.Ui_LoginWin):
    def __init__(self):
        super(LoginWin, self).__init__()
        self.setupUi(self)

    def showAdmin(self):
        account_num = self.numEdit.text()
        passwd = self.passwdEdit.text()
        dBase = dataBase()
        sql = "select count(*) from admin where account_num='%s' and passwd='%s'"%(account_num, passwd)
        result = dBase.fetchall(sql)[0]
        count = result[0]
        if count == 0:
            QMessageBox.information(self, '提示', '用户名或者密码错误', QMessageBox.Yes)
        else:
            self.close()
            adm = AdminWin()
            adm.show()
            adm.exec_()


class AddWin(QDialog, add_inf.Ui_AddWin):
    def __init__(self):
        super(AddWin, self).__init__()
        self.setupUi(self)

    # 添加员工
    def addStaff(self):
        dBase = dataBase()
        staffName = self.nameEdit.toPlainText()
        staffNum = self.numEdit.toPlainText()
        if staffName == '' or staffNum == '':
            QMessageBox.information(self, "信息录入", "请完善个人信息")
        else:
            flag = True
            sql = 'SELECT * FROM employees'
            result = dBase.fetchall(sql)
            for i in range(len(result)):
                if result[i][1] == staffNum:
                    flag = False
                    QMessageBox.information(self, "信息录入", "编号重复了!")
            if flag:
                if os.path.exists(image_path + staffNum):
                    if os.listdir(image_path + staffNum):
                        try:
                            sql = "insert into employees values('{0}', '{1}')".format(staffName, staffNum)
                            dBase.execute(sql)
                            face_feature, dimension = train()
                            bytes_feature = face_feature.tobytes()
                            matrix_dimension = pickle.dumps(dimension)
                            sql = "insert into facefeat (feature) values(%s)"
                            dBase.execute(sql, bytes_feature)
                            sql = "update facefeat set dimension=%s where id in (select a.id from (select max(id) as id from facefeat)a)"
                            dBase.execute(sql, matrix_dimension)
                            QMessageBox.information(self, "信息录入", "信息录入成功")
                        except:
                            QMessageBox.information(self, "信息录入", "信息录入失败")
                    else:
                        QMessageBox.information(self, "信息录入", "请录入个人照片")
                else:
                    QMessageBox.information(self, "信息录入", "请录入个人照片")

    # 录入照片
    def capFace(self):
        name = self.nameEdit.toPlainText()  # 获取普通文本
        num = self.numEdit.toPlainText()
        if not os.path.exists(image_path):
            os.mkdir(image_path)  # 如果没有存储相片的目录,则进行创建
        flag = True
        if name != '' and num != '':
            dBase = dataBase()
            sql = 'SELECT * FROM employees'
            result = dBase.fetchall(sql)
            for i in range(len(result)):
                if result[i][1] == num:
                    flag = False
                    QMessageBox.information(self, "信息录入", "编号重复了!")
            if flag:
                if not os.path.exists(image_path + num):
                    os.mkdir(image_path + num)  # 如果没有员工照片个人目录,则创建
                capture_face(num)
        else:
            QMessageBox.information(self, "信息录入", "请完善个人信息")  # 必须拥有两个参


# 人脸识别
def face_rec():
    dBase = dataBase()
    sql = 'SELECT * FROM employees'
    result = dBase.fetchall(sql)  # result 是一个元组
    sql = 'SELECT * FROM facefeat where id=(select max(id) from facefeat)'
    res = dBase.fetchall(sql)[0]  # dBase.fetchall(sql2)返回的形式类((b'[[[-5.77707522e+03]]]','(390,21,20)'),)
    feature = res[1]  # 获取特征
    feature = np.frombuffer(feature)  # 还原成一维数组
    print('feature.shape', feature.shape)
    dimension = res[2]
    dim = pickle.loads(dimension)  # 还原成数组
    print('dim', dim)
    feat = feature.reshape(dim)  # 将数组还原成多为数组
    print('feat.shape', feat.shape)
    label = []
    for i in range(len(result)):
        label.append(result[i][1])
    capture = cv2.VideoCapture(0)
    # capture.set(3, 400)
    # capture.set(3, 300)
    while(capture.isOpened()):
        ret, frame = capture.read()
        frame, staff_num = recg(frame, feat)
        for i in range(len(label)):
            if label[i] == staff_num:
                flag = addRecord(staff_num)
                if flag:
                    cv2.putText(frame, 'Success', (50, 80), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2, cv2.LINE_AA, )
        cv2.imshow('camera', frame)
        if cv2.waitKey(1) & 0xFF == 27:
            break

    capture.release()
    cv2.destroyAllWindows()


# 识别记录
def addRecord(staffnum):   # 识别记录
    dt = datetime.now().strftime("%Y-%m-%d")  # 获取当前时间
    dBase = dataBase()
    sql = "select * from record"
    result = dBase.fetchall(sql)
    if result:
        sql = "select id ,dates from record where staffNum='%s' order by id desc limit 1" %staffnum
        result = dBase.fetchall(sql)
        if result:
            resu = result[0]
            record_time = resu[1]
            if dt != record_time:
                sql = "insert into record (staffNum) values(%s)"
                dBase.execute(sql, staffnum)
                sql = "update record set dates=%s where id in (select a.id from (select max(id) as id from record)a)"
                flag = dBase.execute(sql, dt)
                print('识别成功!')
                return flag
        else:
            sql = "insert into record (staffNum) values(%s)"
            dBase.execute(sql, staffnum)
            sql = "update record set dates=%s where id in (select a.id from (select max(id) as id from record)a)"
            flag = dBase.execute(sql, dt)
            print('识别成功!')
            return flag
    else:
        sql = "insert into record (staffNum) values(%s)"
        dBase.execute(sql, staffnum)
        sql = "update record set dates=%s where id in (select a.id from (select max(id) as id from record)a)"
        flag = dBase.execute(sql, dt)
        print('识别成功!')
        return flag

if __name__ == '__main__':
    app = QApplication(sys.argv)
    MainWin = faceWin()
    MainWin.show()
    sys.exit(app.exec_())

5、源码获取方式

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值