基于python实现的人脸识别考勤系统
一、设计内容
1、原型设计
版本A:
- 考勤系统分为员工端和管理者端。
- 管理者端可以增删改要签到的员工信息(录入新员工、删除员工等),查询签到历史,规定签到时间(如9:00前早签,17:00后晚签)等。
- 员工端负责拍照,人脸识别成功后签到。
- 自己的服务器接受管理者端的请求,存储员工信息,并提供增删改查员工信息的服务。同时转发员工端发送来的签到请求到Face++,得到人脸对比结果,反馈给员工端是否签到成功。
- 人脸识别提供商(Face++)的服务器存储人脸信息以及对应的员工的id。接受自己服务器的注册新人脸、对比人脸的请求,并返回结果。
版本B:
- 只有一个客户端,不仅负责增删改新员工(学生)的信息,还负责拍照、人脸识别签到。
- 服务器的情况与版本A类似,自己的服务器接受所有请求,并存储学生信息。
由于版本A存在重大漏洞:当员工没在公司时也能签到,而且工程量较大,课设时间有限。所以本项目采用版本B。
2、业务逻辑设计
主要功能有注册新用户和签到识别
最左边为客户端,中间的服务器是自己的服务器,右边是face++的服务器。
3、界面设计
- 界面整体采用谷歌推荐的 Meterial Design 设计原则,包含了视觉、运动、互动效果等特性,就是好看!
- 颜色上采用了 配色网 的" 花季少女的心 "配色方案,简单而融洽。
- 首先是主界面,采用一个带抽屉的布局,布局最上方为状态栏,剩下的部分为一个随抽屉中选项而切换的碎片,并在界面右下角嵌入一浮动按钮。
界面截图如下:
- 抽屉中的布局:上部分为用户头像,下半部分为功能选项按钮,每个按钮对应一个碎片。
- 在签到历史Fragment中,以每行2项的卡片式布局展示签到历史,每个记录项四周用阴影包围,显得更有层次感。
- 点击浮动按钮跳转到拍照页面,若拍照成功,进入上传页面;若失败则返回之前的页面。
截图如下:
- 学生列表Fragment主要用与注册新的用户,将新的人脸信息录入
- 点击学生列表浮动按钮跳转到拍照页面,若拍照成功,进入上传页面;若失败则返回之前的页面。
截图如下:
二、设计方法
1、数据库设计
主要有 学生信息表 和 签到记录表 。
学生信息表(stu_message):
名 | 类型 | 主键 | 非空 | 备注 |
---|---|---|---|---|
stu_id | int(10) | 是 | 是 | |
stu_name | varchar(255) | 否 | 是 |
此表还可扩展学生性别,学院,班级等项目,这里省略了。
签到记录表(check_on_records):
名 | 类型 | 主键 | 非空 | 备注 |
---|---|---|---|---|
co_id | int(10) | 是 | 是 | 自动递增 |
stu_id | varchar(255) | 否 | 是 | 执行签到的学生id |
co_time | datatime | 否 | 是 | 自动生成CURRENT_TIMESTAMP |
2、接口设计
(1)注册接口
接收客户端发来的注册学生的图片和姓名,转发给Face++,返回注册成功的信息。
方法:POST
uri:服务器地址/register
请求参数:
字段 | 说明 | 类型 | 备注 | 是否必填 |
---|---|---|---|---|
user_img | 注册用图片 | multipart/form-data | .jpg | 是 |
user_id | 注册学生的姓名 | multipart/form-data | 是 |
返回参数:
字段 | 说明 | 类型 | 备注 |
---|---|---|---|
user_id | 注册学生的姓名 | string |
错误情况:
字段 | 说明 | 类型 | 备注 |
---|---|---|---|
error_message | 已知错误 | string | 有错误码 |
other_error | 未知错误 | string | 网络不通等情况 |
(2)识别接口
接受用户发送来的要识别的人脸图片,转发给Face++,返回签到用户的id。
方法:POST
uri:服务器地址/transmit
请求参数:
字段 | 说明 | 类型 | 备注 | 是否必填 |
---|---|---|---|---|
user_img | 识别用图片 | multipart/form-data | .jpg | 是 |
返回参数:
字段 | 说明 | 类型 | 备注 |
---|---|---|---|
user_id | 验证得到的学生的姓名 | string |
错误情况:
字段 | 说明 | 类型 | 备注 |
---|---|---|---|
no_face | 未识别到人脸 | string | face++的返回值中没有faces字段 |
failed | 验证所得分数未达到阈值 | string | 分数低于80未验证失败 |
other_error | 未知错误 | string | 网络不通等情况 |
(3)查询历史接口
方法:GET
uri:服务器地址/history
请求参数:无
返回参数:
字段 | 说明 | 类型 | 备注 |
---|---|---|---|
history_data | 历史纪录 | json | 整体为一个json数组,每条记录为一个数据项。 |
三、实现方法
1.客户端的实现:
程序采用Android Studio开发,调试、运行环境为小米手机3(Android 6.0)。
(1)界面实现:
主界面抽屉布局采用
DrawerLayout
实现,浮动按钮为
FloatingActionButton
,状态栏为
ToolBar
。
历史界面采用
RecyclerView
配合
CardView
实现。
a.为实现在状态栏打开时按返回关闭而不是退出程序,重写
onBackPressed()
方法:
```java public void onBackPressed() {
if (drawerLayout.isDrawerOpen(GravityCompat.START)) {
drawerLayout.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
} ```
b.传统的单
Activity
对应多
Fragment
实现方法是:在一个
FrameLayout
中,每切换一个
Fragment
,就把要切换的
Fragment
放在最顶层,这种方法相当于新建了一个
Fragment
,被切换掉的
Fragment
在切换瞬间的数据并未被保存,所以这里需要改进:
为节省篇幅,不粘代码了,我参考的 这篇博客 。
c.在显示相机拍出来的照片时,有时文件过大(像素数过多)不能使用
BitMap
加载,这里用
SubsamplingScaleImageView
加载。
(2)业务逻辑实现:
-
与后台交互的逻辑:通过
OKHttp
开启新的线程向后台发送请求,用Hanlder
模块接受返回的数据,同时将相应逻辑返回给主线程,主线程更新界面UI。 -
历史
Fragment
界面在接受json
数据时使用Gson
模块解析,相当方便。
2.后台服务器的实现:
后台采用python语言编写,主要运用模块有
pymysql
(连接
mysql
数据库)、
flask
(Web应用框架)以及Face++官方的SDK。
一些基本概念:
-
face_token
:当对一张图片进行人脸检测时,会将检测到的人脸记录下来,包括人脸在图片中的位置,用一个系统标识face_token来表示。注意:对同一张图片进行多次人脸检测,对同一个人脸会得到不同的face_token。 -
FaceSet
:人脸集合(FaceSet
)是用来存储检测到人脸的存储对象。一个FaceSet
内face_token
是不重复的。
后台服务器与Face++服务器的交互时主要用到的API:
名称 | 功能 |
---|---|
Detect API | 可以检测图片内的所有人脸,对于每个检测出的人脸,会给出其唯一标识 face_token,可用于后续的人脸分析、人脸比对等操作。 |
Search API |
在一个已有的
FaceSet
中找出与目标人脸最相似的一张或多张人脸,返回置信度和不同误识率下的阈值,识别到的
user_id
。
|
Face SetUserID API | 为检测出的某一个人脸添加标识信息,该信息会在Search接口结果中返回,用来确定用户身份。 |
FaceSet AddFace API |
为一个已经创建的
FaceSet
添加人脸标识
face_token
。
|
参考资料: face++官方API
服务器主要操作逻辑:
-
使用Detect API获取
facetoken
。 -
根据步骤1得到的
face_token
,使用Face SetUserID
API设置user_id
-
利用
FaceSet AddFace
API 将步骤2中的图片上传到已创建好的FaceSet
-
用户拍照对比时,利用
Search
API 方法比对,成功后获得user_id
,利用此user_id
判断哪一个员工签到了。
服务器后台的启动:
本地MySQL、本地web服务程序启动后,使用 natapp 内网穿透使App能正常上传数据。
四、心得体会
-
了解了在网络通信中数据的传输方法(
mutipart-formdata
),学习了http协议中不同的请求方法和请求头的功能和作用。 - 界面设计不易,美工和细节的打磨需要耗费时间。
- 第一次写简单的后台处理程序,基础功能实现很简单,但完善需要花费功夫。
- 不同版本的安卓、不同的手机在运行同一个app时会存在差异。相比ios,Android开发在适配上的成本要高些。
- 本以为看了《第一行代码》就能搞定安卓,实际做的时候才发现自己懂得只是皮毛。
- 时光荏苒,大学时光早已过半,且行且珍惜。
参考文献
- 火电厂检修管理系统的设计与实现(西安电子科技大学·段鑫)
- 人脸识别课堂考勤系统的研究与实现(浙江工业大学·李远)
- 基于云的统一身份智能信息管理系统设计实现(华南理工大学·水凯凯)
- 提供人脸识别服务的计费管理系统设计与实现(大连理工大学·宋一凡)
- 基于SpringBoot和人脸识别的企业考勤管理系统设计与实现(阜阳师范大学·汪涛)
- 中创软件企业协同管理平台考勤管理子系统的设计与实现(山东大学·孙晓莹)
- 基于人脸识别的人员通行信息管理系统的设计与实现(电子科技大学·袁寿柠)
- 提供人脸识别服务的计费管理系统设计与实现(大连理工大学·宋一凡)
- 人脸识别课堂考勤系统的研究与实现(浙江工业大学·李远)
- 交通民警自动诚信考勤系统设计与实现(西华大学·宋剑)
- 基于人脸验证的协同管理平台的设计与实现(北京邮电大学·郭映泽)
- 基于ARM的动态人脸识别考勤系统的研究与设计(福州大学·罗昊南)
- 基于人脸识别的人员通行信息管理系统的设计与实现(电子科技大学·袁寿柠)
- 基于微小人脸识别的智能考勤管理系统(电子科技大学·蔡李生)
- 企业考勤系统的设计与实现(吉林大学·梁赫)
本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:毕设工厂 ,原文地址:https://bishedaima.com/yuanma/35595.html