基于人脸识别的校园课堂考勤管理系统设计与实现(Python)

目 录
摘 要 I
Abstract II
第1章 绪论 1
1.1课题背景及意义 1
1.1.1 选题背景 1
1.1.2 选题意义 1
1.2 国内外研究现状及发展趋势 2
1.2.1 国内研究现状 2
1.2.2 国外研究现状 2
1.2.3 发展趋势 3
1.3 本文研究的主要内容 3
第2章 系统开发环境 5
2.1 python简介 5
2.1.1 Python的特点 5
2.1.2 Python的应用领域 5
2.1.3 Python在本项目中的应用 6
2.2 人脸识别简介 6
2.3 SQLite简介 6
2.4 Django简介 7
2.5 TensorFlow简介 8
第3章 系统分析 10
3.1 可行性分析 10
3.1.1 技术可行性 10
3.1.2 操作可行性 10
3.1.3 经济可行性 11
3.1.4 法律可行性 12
3.2需求分析 12
3.2.1 功能需求分析 13
3.2.2 性能需求分析 13
3.3开发环境分析 14
3.4界面需求 14
第4章 系统设计 16
4.1系统设计原则 16
4.2系统流程设计 16
4.2.1系统开发流程 16
4.2.2 添加信息流程 18
4.2.3 人脸识别流程 18
4.3 系统功能设计 19
4.4 数据库设计 22
4.4.1 数据库设计原则 22
4.4.2 数据库实体 22
4.4.3 数据库表设计 23
第5章 系统实现 25
5.1 登录 25
5.2 注册 26
5.3 识别签到 28
第6章 系统测试 33
6.1测试环境与条件 33
6.2功能测试 33
6.3可用性测试 34
6.4测试结果分析 35
结 论 36
致 谢 37
参考文献 38
1.3 本文研究的主要内容
本文的主要研究内容是设计和实现一个基于人脸识别的校园课堂考勤管理系统。该系统旨在利用先进的人脸识别技术,结合现代软件开发框架和数据库技术,为高校提供一套高效、准确、便捷的考勤管理解决方案。
具体研究内容如下:
需求分析:分析校园课堂考勤管理的实际需求,明确系统的功能和特点,为后续的设计和实现提供指导。
人脸识别技术研究:研究并选择合适的人脸识别算法,包括人脸检测、特征提取和识别等关键技术,确保系统的准确性和稳定性。
系统架构设计:设计系统的整体架构,包括前后端分离的设计、数据库的选择和设计、接口设计等,确保系统的可扩展性和可维护性。
系统实现:根据系统架构设计,实现系统的各个功能模块,包括用户管理、考勤管理、数据分析等,确保系统的功能完整和性能稳定。
系统测试与优化:对系统进行全面的测试,包括功能测试、性能测试、安全测试等,发现并修复潜在的问题,优化系统的性能和用户体验。
隐私保护与数据安全:在系统设计和实现过程中,充分考虑隐私保护和数据安全的问题,采取合适的措施保护用户的个人信息不被滥用和泄露。
通过本文的研究,期望能够开发出一套具有实际应用价值的基于人脸识别的校园课堂考勤管理系统,为高校的教学管理提供有力的技术支持。同时,也期望通过本文的研究,为人脸识别技术在其他领域的应用提供有益的参考和借鉴。

import cv2
import numpy as np
from .models import User
import sys

from numpy import expand_dims
import tensorflow as tf
import threading
from tensorflow.python.keras.backend import set_session
from keras.models import load_model
from keras.backend import clear_session

global mtcnn_model, face_model



# 程序开始时声明

sess = tf.compat.v1.Session()

graph = tf.compat.v1.get_default_graph()
from PIL import Image
import dlib

face_detector = dlib.get_frontal_face_detector()  # 获取人脸分类器

model_path = 'facenet_keras.h5'

"""主要 人脸识别代码"""
set_session(sess)
face_model = load_model(model_path)  ## 载入人脸特征提取神经网络


def get_face_encoding(imgs):
    """ 编码头像信息 可以是传 BytesIO对象 也可传多个图片BytesIO数组
    """


    def getencoding(img, ):
        required_size = (160, 160)
        pixels = np.array(img)  # 转换图片为数组矩阵

        results = face_detector(pixels, 1)  ## 使用dlib找出人脸
        if len(results) <= 0:
            return

        face_encodings = []
        for index, face in enumerate(results):
            x1 = face.left()
            y1 = face.top()
            x2 = face.right()
            y2 = face.bottom()

            face = pixels[y1:y2, x1:x2]  ## 切出人脸
            print(face.shape)
            if all(face.shape):

                face = cv2.resize(face, required_size).astype('float32')  # 转换人脸图片大小为160*160
                mean, std = face.mean(), face.std()

                face_pixels = (face - mean) / std  # 归一化
                samples = expand_dims(face_pixels, axis=0)  ## 增加一个图片数量维度
                global graph
                global sess
                with graph.as_default():
                    set_session(sess)
                    face_encoding = face_model.predict(samples)[0]  ##人脸特征提取的神经网络提取人脸特征
                face_encodings.append(face_encoding)

        return face_encodings



    encodings = []
    if isinstance(imgs, list):
        for x in imgs:
            img = Image.open(x).convert("RGB")  # 打开图片
            encoding = getencoding(img)
            if encoding:
                encodings = encodings + encoding
    else:
        img = Image.open(imgs).convert("RGB")
        encoding = getencoding(img)
        if encoding:
            encodings = encodings + encoding

    return encodings


def base_match_faces(face_encoding, known_face_encodings, known_face_names):
    """   传入人脸特征 将输出最匹配的人脸名称  如果没有最匹配的将返回None 使用欧式距离计算 """

    face_distances = np.linalg.norm(known_face_encodings - face_encoding, axis=1)
    best_match_index = np.argmin(face_distances)
    print(face_distances, face_distances[best_match_index])
    if face_distances[best_match_index] < 6:
        name = known_face_names[best_match_index]
        return name


def load_all_users():
    users = User.objects.all()
    known_face_names = []
    known_face_encodings = []
    for x in users:
        if len(x.feature1) > 5:
            face_encoding = np.array(eval(x.feature1))
            known_face_encodings.append(face_encoding)
            known_face_names.append(x.username)

            face_encoding = np.array(eval(x.feature2))
            known_face_encodings.append(face_encoding)
            known_face_names.append(x.username)

            face_encoding = np.array(eval(x.feature3))
            known_face_encodings.append(face_encoding)
            known_face_names.append(x.username)
    return known_face_names, known_face_encodings
    # np.save("known_face_names.npy", np.array(known_face_names))
    # np.save("known_face_encodings.npy", np.array(known_face_names))
    # return list(np.load("known_face_names.npy")), list(np.load("known_face_encodings.npy"))


if "runserver" in sys.argv:
    known_face_names, known_face_encodings = load_all_users()
    print("载入已知人脸", known_face_names)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值