import time
import warnings
import functools
import base64
from PIL import Image
import numpy as np
import sqlite3
from io import BytesIO
from flaskr.facenet_keras import (
face_encodings
)
import click
import time
from flask import (
Blueprint, flash, g, redirect, render_template, request, session, url_for
)
from werkzeug.security import check_password_hash, generate_password_hash
from flaskr.db import get_db, init_db
bp = Blueprint('admin', __name__, url_prefix='/admin')
@bp.route('/')
def root() :
return redirect('/admin/index')
@bp.route('/index')
def index():
# session 中没有记录,重定向到登陆页面
if session.get('is_admin') is None :
return render_template('/admin/login.html')
# session 中的权限不足,给出提示并重定向
if session.get('is_admin') < 1 :
return render_template('/showmsg.html', title='无权访问!', msg='权限不足,请重新登陆。', jump='/admin/login')
db = get_db()
usertab = db.execute(
'SELECT id, username, is_admin, last_punch FROM user'
)
js_code = 'let datas = ' \
+ str(np.load('face_features.npy').tolist()) + ';'
try :
return render_template('admin/index.html',
username=session['username'], usertab=usertab, js_code=js_code)
# 当 session 不存在 'username' 字段时,重定向到登陆页面
except KeyError :
session.clear()
return redirect('/admin/login')
# 登陆页面
@bp.route('/login', methods=('GET', 'POST'))
def login() :
return render_template('/admin/login.html')
# 发送登陆请求
@bp.route('/login/login', methods=('GET', 'POST'))
def login_login():
if request.method == 'POST' :
session.clear()
username = request.form['username']
password = request.form['password']
db = get_db()
try :
user = db.execute(
'SELECT * FROM user WHERE username = ?', (username,)
).fetchone()
except sqlite3.OperationalError :
init_db()
return render_template('/showmsg.html', title='登陆失败!', msg='数据库尚未初始化,请稍后再试。', jump='/admin/login')
if user is None:
return render_template('/showmsg.html', title='登陆失败!', msg='用户不存在,请检查后重试。', jump='/admin/login')
elif not check_password_hash(user['password'], password):
return render_template('/showmsg.html', title='登陆失败!', msg='密码错误。', jump='/admin/login')
elif not user['is_admin'] >= 1 :
return render_template('/showmsg.html', title='登陆失败!', msg='权限不足。', jump='/admin/login')
session['id'] = user['id']
session['username'] = user['username']
session['is_admin'] = user['is_admin']
return redirect('/admin/index')
return render_template('/showmsg.html', title='登陆失败!', msg='request.method 应为 POST。', jump='/admin/login')
# 删除人脸数据
@bp.route('/delete', methods=('GET', 'POST'))
def delete() :
if request.method == 'POST' :
idx = request.json['idx']
db = get_db()
user = db.execute(
'SELECT * FROM user'
).fetchall()
features = np.load('face_features.npy')
features = np.delete(features, idx, axis=0)
np.save('face_features.npy', features)
# 数据库中的 id 到 np.ndarray 中的 index 的转换
idx = user[idx]['id']
db.execute(
'DELETE FROM user WHERE id = ?', (idx,))
db.commit()
return '{"msg" : "delete success"}'
return render_template('/showmsg.html', title='删除失败!', msg='request.method 应为 POST。', jump='/admin/index')
# 登出
@bp.route('/logout', methods=('GET', 'POST'))
def logout():
session.clear()
return redirect('/admin/login')
@bp.before_app_request
def load_logged_in_user():
is_admin = session.get('is_admin')
if is_admin is None:
g.is_admin = None
else:
g.is_admin = is_admin
def login_required(view):
@functools.wraps(view)
def wrapped_view(**kwargs):
if g.is_admin is None or g.is_admin <= 0:
return redirect('/admin/login')
return view(**kwargs)
return wrapped_view
# 注册新用户
@bp.route('/register', methods=('GET', 'POST'))
@login_required
def register() :
return render_template('/admin/register.html')
# 主页页面的基本信息
@bp.route('/register/basic_info', methods=('GET', 'POST'))
@login_required
def register_basic_info() :
if request.method == 'POST' :
session['basic_info'] = {
'username' : request.form['username'],
'is_admin' : request.form['is_admin'],
# 不储存密码明文
'password' : generate_password_hash(request.form['password']),
# 当前日期与时间
'last_punch' : time.strftime("%Y/%m/%d %H:%M:%S", time.localtime())
}
return render_template('/admin/face.html')
return render_template('/showmsg.html', title='注册失败!', msg='request.method 应为 POST。', jump='/admin/register')
@bp.before_app_request
def load_basic_info() :
basic_info = session.get('basic_info')
if basic_info is None :
g.basic_info = None
else :
g.basic_info = basic_info
def basic_info_registered(view) :
@functools.wraps(view)
def wrapped_view(**kwargs):
if g.basic_info is None :
return redirect('/admin/index')
return view(**kwargs)
return wrapped_view
# 注册页面的人脸录入
@bp.route('/register/recognize', methods=('GET', 'POST'))
@login_required
@basic_info_registered
def register_recognize():
if request.method == 'POST' :
data = request.json['data']
string_b64 = request.json['imgbase64']
if not data or not string_b64 :
return render_template('/showmsg.html', title='注册失败!', msg='图片解析错误,请检查后重试。',
jump='/admin/index')
img_data = base64.b64decode(string_b64[22:])
img = Image.open(BytesIO(img_data)).convert('RGB')
img = np.asarray(img)
try :
feature = face_encodings(img)
except IndexError :
return render_template('/showmsg.html', title='检测失败!', msg='未检测到人脸,请重试。',
jump='/admin/index')
feature = np.expand_dims(feature, axis=0)
features = np.load('face_features.npy')
features = np.concatenate([features, feature])
np.save('face_features.npy', features)
db = get_db()
db.execute(
"INSERT INTO user (username, password, is_admin, last_punch) \
VALUES (?, ?, ?, ?)", (
session['basic_info']['username'],
session['basic_info']['password'],
session['basic_info']['is_admin'],
session['basic_info']['last_punch'],))
try :
db.commit()
except sqlite3.OperationalError :
return render_template('/showmsg.html', title='注册失败!', msg='数据库被锁,请稍后再试。',
jump='/admin/index')
return render_template('/showmsg.html', title='注册成功!', msg='您的账户已经注册成功。',
jump='/admin/index')
return render_template('/showmsg.html', title='注册失败!', msg='request.method 应为 POST。',
jump='/admin/index')
# 修改密码
@bp.route('/change_password', methods=('GET', 'POST'))
@login_required
def change_password() :
return render_template('admin/change_password.html')
# 修改密码的请求
@bp.route('/change_password/change_password', methods=('GET', 'POST'))
def change_password_change_password() :
if request.method == 'POST' :
idx = session['id']
password = request.form['password']
db =
人脸识别考勤系统,用 Python 实现人脸识别考勤系统


2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)

在本项目中,我们利用 Python 实现了一个高效且精准的人脸识别考勤系统。这个系统融合了前端与后端的先进技术,旨在提供一种自动化、无接触的员工考勤解决方案。以下将详细介绍系统的各个组成部分和涉及的技术。 前端部分: 前端采用了 HTML、CSS 和 JavaScript 进行开发,构建用户界面。HTML 用于定义页面结构,CSS 负责样式设计,提升用户体验,而 JavaScript 则是实现页面动态交互的关键。此外,还引入了 p5.js 这个JavaScript库,它提供了一套丰富的绘图功能,可以用于在网页上实时处理和显示人脸图像,实现人脸检测和追踪的可视化。 后端部分: 后端主要由 Python 和 Flask 框架构建。Flask 是一个轻量级的Web服务程序,适合快速开发小型应用。在这个项目中,Flask 被用来处理 HTTP 请求,接收前端发送的人脸图片,并调用相应的算法进行处理。 人脸识别技术: 核心的人脸识别算法基于 TensorFlow 和 Keras。TensorFlow 是一个强大的开源机器学习框架,Keras 则是它的高级神经网络API,使得构建和训练深度学习模型变得更加简便。在这里,我们可能使用预训练的模型(如 VGGFace 或 FaceNet)对输入的人脸图片进行特征提取,然后通过比较特征向量来识别人脸。这种比对过程能实现高精度的人脸匹配,从而实现考勤签到。 数据库管理: MySQL 作为关系型数据库管理系统,用于存储员工信息、考勤记录等数据。在系统中,Python 可以通过 SQLAlchemy 这样的 ORM 工具与 MySQL 数据库进行交互,方便地执行增删改查操作,保持数据的一致性和完整性。 工作流程: 1. 用户通过前端界面上传包含人脸的图片。 2. 图片被发送至后端,Flask 接收到请求并调用 TensorFlow 和 Keras 的模型进行人脸检测和识别。 3. 识别结果与数据库中的员工信息进行匹配,生成考勤记录。 4. 结果反馈给前端,更新考勤状态和统计信息。 5. 数据库实时更新,确保考勤数据的准确性。 总结: 这个项目展示了 Python 在开发人脸识别考勤系统中的强大能力,结合现代前端技术和深度学习模型,实现了高效、准确的考勤管理。同时,MySQL 的使用保证了数据的安全存储和高效查询,整个系统具有良好的可扩展性和实用性。通过学习和理解这些技术,开发者可以为各种应用场景构建类似的人脸识别解决方案。


















































































- 1

- #完美解决问题
- #运行顺畅
- #内容详尽
- #全网独家
- #注释完整
- weixin_409812342024-09-20资源很受用,资源主总结的很全面,内容与描述一致,解决了我当下的问题。
- m0_639383732025-02-18资源使用价值高,内容详实,给了我很多新想法,感谢大佬分享~

- 粉丝: 1w+
- 资源: 7719
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 云餐厅_APP-毕业设计资源
- 2024年电赛E题三字棋游戏-电赛资源
- (源码)基于CC++编程语言的Ledger Crypto.com Chain应用.zip
- mumicm_dlut-美赛资源
- (源码)基于Arduino和MQTT协议的手势控制智能车系统.zip
- InnovationAndEntrepreneurship-大创资源
- COOCOX旗下的CoIDE,可以取代Keil 官网已经没有更新,不能下载了 最新只支持到MDK4.2,非常可惜,希望给大家带来帮助
- (源码)基于DFL168A设备的J1939J1708及OBD2通信库.zip
- 蓝桥杯单片机真题代码-蓝桥杯资源
- (源码)基于ROS和Arduino的rosserial配置工具.zip
- kis-flow-活动资源
- KeyMouseHook-活动资源
- (源码)基于CC++编程语言的键盘安全通信协议实现.zip
- (源码)基于C语言的Redis 3.0源码注释项目.zip
- (源码)基于Python的智能微信聊天机器人.zip
- jeewx-boot-活动资源


