目录
一、简介
1.1 项目背景
1.2 相关技术介绍
1.2.1 OpenCV库
1.2.2 SeeTaaS平台
1.2.3 深度学习
二、需求分析
2.1 系统概述
2.2 系统功能模块分析
2.2.1 参会人员注册
2.2.2 参会人信息管理
2.2.3 现场人脸识别签到
2.2.4 会议管理
三、系统设计
3.1设计思路
3.2 数据库表设计
3.2.1 主表
3.2.2 关联表
3.3 系统实现技术
3.3.1前端设计
3.3.2 后端设计
3.3.3人脸识别端设计
3.4 系统实现流程
3.4.1会议流程
3.4.2人脸识别开发流程
3.4.3人脸识别签到流程
四、系统实现
4.1 项目概述
4.2 基于OpenCV的图像预处理技术
4.1.1 处理图像过暗
4.1.2 处理图像过亮
4.3 基于retinaface的人脸检测
4.4 人脸对齐
4.5 基于facenet的人脸识别
4.6 人脸识别及人脸检测实现
4.6.1 数据采集
4.6.2 模型选取和配置
4.7 前端实现
4.8 后端实现
4.9 人脸识别实现
五、运行条件和环境说明
5.1 环境搭建
5.1.1 运行环境
5.1.2 Anaconda的安装
5.1.3 TensorFlow的安装
5.2 SeeTaaS平台训练模型
六、项目特色与创新
6.1活体检测
6.1.1活体测试
6.2 动态更新人脸库
6.3 实现多个闸机并发签到
6.4 批量导入用户
6.5 管理功能多样化
6.6 简洁大方的可视化界面
会议是人们为了解决问题而进行的交流活动,随着社会的不断发展,各行各业以及政府机构之间的交流越来越频繁,每天大量的会议被召开,参加会议的人数持续上升,这对会议签到方式提出了很大挑战。一个快速、有效的会议签到方式能够节省大量的时间,提升参会人员体验的同时保证会议流程的高效运行。传统的人工会议签到方法存在着很多的缺陷,在参会人数较多时,往往需要安排大量的工作人员以及志愿者才能保证会议签到的顺利进行,签到速度缓慢,容易造成会议签到现场的拥堵,给参会人员带来不好的体验,由于没有身份认证机制,代签、漏签的情况时有发生。
人体面部特征作为一种生物学特征,具有唯一性,不易被复制。早期由于计算机技术以及硬件的限制,并没有得到很好的发展,随着深度学习方法被广泛应用于人工智能乃至计算机视觉领域,人脸识别的速度以及准确率得到了极大的提高,目前人脸识别准确率已经超过了人眼识别所能达到的极限,这些都为人脸识别技术的普及打下了坚实的基础。随着人脸识别技术的不断进步,该技术在许多领域被广泛应用于身份认证,例如企业的门禁系统、火车站的安检系统等。
本项目设计了一种基于深度学习的人脸识别会议签到系统,不仅避免了传统的会议签到中人工签到、刷卡签到的各种缺陷,更利用人脸识别速度上的优势将会议签到转变为秒级签到,系统还实现数据统计分析功能,真正的做到智能化签到。项目基于B/S模式进行开发,系统可快速部署至服务器,并可在任意连接互联网的客户端进行访问,方便快捷。能够适应各类不同会议场景,包括一些公司年会以及大型学术会议。
Opencv(Open Source Computer Vision Library)是一个基于开源发行的跨平台计算机视觉库,它实现了图像处理和计算机视觉方面的很多通用算法,已成为计算机视觉领域最有力的研究工具。在这里我们要区分两个概念:图像处理和计算机视觉的区别:图像处理侧重于“处理”图像–如增强,还原,去噪,分割等等;而计算机视觉重点在于使用计算机来模拟人的视觉,因此模拟才是计算机视觉领域的最终目标。 OpenCV用C++语言编写,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS, 如今也提供对于C#、Ch、Ruby,GO的支持。
SeeTaaS是中科视拓推出的面向AI开发和应用的一站式人工智能开发生产平台,实现了对数据、算法、算力资源进行统一调度管理,构建了完善的开发软件栈,支持数据处理、算法开发、模型训练、模型部署的全流程业务,并提供了大规模分布式训练、自动化模型生成等功能,满足不同开发层次的需要,有效提高计算资源利用率,提升AI开发效率,实现系统的平滑、稳定、可靠运行。 使用SeeTaaS,您可以在不关心算法细节的情况下,只需要提供数据以模板化的方式进行简单高效的算法迭代训练,落地算法应用,也可以使用Jupyter Notebook或SSH远程开发的方式进行算法研发等。
深度学习是一类模式分析方法的统称,就具体研究内容而言,主要涉及三类方法:
我们采用了卷积神经网络模式分析方法,这是一种前馈神经网络,由卷积层、池化层、全连接层组成。它的人工神经元可以响应一部分覆盖范围内的周围单元,可以应用于语音识别、图像处理和图像识别等领域。目前市面上大多数的深度学习框架都为python语言提供了接口,例如TensorFlow、Keras等,方便初学者和专家在Windows和Linus等操作系统上部署使用。本项目的人脸识别部分是基于Keras框架设计并实现的。
图1-2 CNN基本结构图
图1-3 深度学习流程图
随着信息技术的发展,许多行业都面临着向信息化和智能化方向过渡的问题,人脸识别技术作为人工智能领域的一个分支,已经在许多行业得到了广泛应用。开发一款基于人脸识别技术可以应用于会议管理的会议签到系统,能够很大程度上优化传统的会议签到流程,提高会议签到效率,提升参会人员体验。此外,本系统基于B/S模式进行开发,具有容易部署、可移植性强、兼容性好等优势,并且能够适应各种类型会议的不同需求。只需一台连接互联网的计算机,便可随时随地进行参会注册、签到等操作,方便快捷。
本系统根据功能可分为四个模块:针对参会人员的注册模块、针对会议管理者的参会人信息管理模块、针对现场人脸识别签到模块、针对会议管理者的会议管理模块,其中现场签到模块集成了人脸识别功能。
用户输入QQ邮箱获取验证码,填写完个人基本信息(真实姓名、性别、部门、手机号码......),再通过照片或者拍照上传人脸照片后即可注册成功。
图2-1 用户注册模块流程
参会者在进入会议室前经过门口的闸机设备进行刷脸签到,用户只需正脸面对闸机摄像头,原地停留2-3秒后若在信息显示屏上看见有绿色提示框弹出证明签到成功,若是红色提示框弹出则签到失败,需联系会议管理员进行人脸重录或代签。
此外,如果参会人员因某些原因不能准时到达会议室,还可以向管理员申请补签,即延长人脸识别签到时间。
管理员有权创建会议(指明会议主题、开始时间和结束时间......)并指定线下会议室和闸机系统,可以根据需求修改会议信息,实时与数据库交互获得参会数据,实现智能化管理会议。
图2-2 会议管理模块
传统的会议签到主要采用人工统计的方式进行,会议前会务组工作人员拿着参会人员名册,根据现场签到人的相关信息进行查找后签字确认,工作繁琐、容易出错且存在着汇总数据不及时的问题。硬件与软件技术的发展,计算机视觉识别逐渐成为软件行业的热门技术,其中人脸识别作为最普遍、热门的应用技术受到了众多机构的关注目前,国内外多家厂商和科研机构推出了比较成熟的商用系统或解决方案,其中 Orbeus、 Face++等已具备工业级别的人脸识别能力。但是这些商用的解决方案授权费用普遍较高,同时由于其只提供服务,源代码不开源,很难对其进行灵活的定制化改动。
针对本项目的需求制定了以下实现流程:首先采集数据集、同时对数据集进行清洗和标注;接着选取合适的模型,对模型进行网络搭配以及参数的调整;然后在SeeTaas平台上训练模型,训练结束后对模型进行验证评估,根据评估结果不断调整参数,经过多次训练和评估,得到合适的模型,并且将模型导出;接着将模型集成PyCharm上;最后,将预测数据导入部署好的模型,开启服务器并与后端数据库进行交互,同时检测出预测结果。
系统整体基于B/S模式进行架构和开发,用户只需进入浏览器输入网址,登录系统后即可进行刷脸签到,无需下载桌面端软件,这种方式部署便捷,操作简单。系统以及数据库部署在服务器上,只需一台连接互联网的计算机作为客户端便可对系统进行访问,大大提高用户的体验感,也方便日后系统管理员对系统的维护。
字段 |
字段类型 |
释义 |
备注 |
id |
int(8) |
用户的唯一描述 |
主键,自增 |
|
varchar(30) |
qq邮箱 |
非空 |
password |
varchar(50) |
用户密码 |
非空 |
username |
varchar(20) |
用户名 |
非空 |
power |
varchar(4) |
用户权限 |
非空,默认为普通用户 |
nickname |
varchar(40) |
备注名 |
|
sex |
char(4) |
性别 |
|
age |
int(3) |
年龄 |
|
phone |
varchar(20) |
电话号码 |
|
face_url |
varchar(200) |
人脸照片存放地址,图片命名:邮箱_名称.jpg |
|
head_url |
varchar(200) |
头像照片存放地址 |
|
introduce |
varchar(250) |
用户描述 |
|
ip |
varchar(15) |
ip地址 |
·用户名、密码为非空字段,密码必须由数字、英文字母组成组成,且长度为15
·introduce为用户描述,可以包括简历、个人说明等等
·线上会议可根据用户ip查询归属地(暂未实现)
字段 |
字段类型 |
释义 |
备注 |
id |
int(1) |
角色编号 |
主键,自增,普通用户id的外键,角色编号 |
power |
int(1) |
权限等级 |
默认值为1 |
·power管理员全选分为:1为普通用户,2为联席主持人,3为主持人
字段 |
字段类型 |
释义 |
备注 |
id |
Int(2) |
主键,部门的唯一标识 |
|
partment |
Varchar(255) |
部门名字 |
字段 |
字段类型 |
释义 |
备注 |
id |
int(4) |
菜单编号标识 |
主键,自增 |
name |
varchar(10) |
菜单名 |
非空 |
path |
varchar(30) |
菜单路径 |
|
parent_id |
int(0) |
父菜单id |
|
icon |
varchar(30) |
||
introduce |
varchar(200) |
菜单描述 |
·parent_id为外键,对应主键是本表中的id字段
字段 |
字段类型 |
释义 |
备注 |
id |
int(8) |
会议标号标识 |
主键,自增 |
create_time |
datetime(6) |
会议创建时间 |
|
name |
varchar(40) |
会议名 |
默认(xx预订的会议) |
link |
varchar(100) |
会议链接 |
|
introduce |
varchar(300) |
会议介绍 |
|
update_time |
datetime(0) |
会议更新时间 |
|
start_time |
datetime(0) |
会议开始时间 |
非空 |
end_time |
datetime(0) |
会议结束时间 |
非空 |
sign_number |
int(4) |
签到人数 |
|
user_number |
int(4) |
到会人数 |
|
file_url |
varchar(255) |
会议信息 |
|
online |
tinyint(1) |
是否为线上会议 |
非空,默认为1,线上 |
deleted |
int |
逻辑删除 |
·会议链接在创建会议后自动生成
字段 |
字段类型 |
释义 |
备注 |
id |
int(1) |
主键,表的唯一标识 |
|
power |
varchar(4) |
会议中的角色 |
普通用户,管理员 |
·power默认为1即普通用户,2为系统管理员
字段 |
字段类型 |
释义 |
备注 |
id |
int(2) |
会议标号标识 |
主键,自增 |
room_name |
varchar(255) |
会议室名 |
非空 |
room_addr |
varchar(255) |
会议室地址 |
非空 |
peoples |
int(2) |
容纳人数 |
非空 |
meetroom_state |
int(1) |
会议室状态 |
默认1为可用 |
·meetroom_state默认数字1表示空闲,0表示占用状态
字段 |
字段类型 |
释义 |
备注 |
id |
int(2) |
会议标号标识 |
主键,自增 |
facility_name |
varchar(255) |
设备名称 |
|
facility_state |
varchar(4) |
设备状态 |
非空 |
buy_time |
Datetime(0) |
设备购入时间 |
·facility_state默认'空闲'标识
字段 |
字段类型 |
释义 |
备注 |
user_id |
int(8) |
用户表id |
非空 |
role_id |
int(1) |
角色表id |
非空 |
·user_id为外键,对应主键是m_user表中的id字段
·role_id为外键,对应主键是m_role表中的id字段
字段 |
字段类型 |
释义 |
备注 |
powr_id |
int(1) |
权限表id |
非空 |
menu_id |
int(1) |
菜单表id |
非空 |
·power_id为外键,对应主键是m_power表中的id字段
·menu_id为外键,对应主键是m_menu表中的id字段
字段 |
字段类型 |
释义 |
备注 |
id |
int(8) |
会议数据标识 |
主键 |
um_power |
int(1) |
用户在本会议的权限 |
|
create_time |
datetime(0) |
会议数据创建时间 |
|
user_id |
int(8) |
非空,外键,关联用户id |
|
metting_id |
int(8) |
非空,外键,关联会议id |
|
update_time |
datetime(0) |
会议数据更新时间 |
|
satrt_time |
datetime(0) |
签到或进入会议时间 |
|
state |
int(2) |
签到状态 |
默认0未签到,1为刷脸签到,2为管理员代签 |
end_time |
datetime(0) |
签退或离开会议时间 |
|
deleted |
int(1) |
逻辑删除 |
·um_power,默认1为参会者,2管理员,3主持人,
·satrt_time和end_time主要用于线上会议
·state有三种状态,0为未签到、1为刷脸签到,2为管理员代签
·datetime类型最大长度为0,这样才能去除毫秒
字段 |
字段类型 |
释义 |
备注 |
meetingid |
int(2) |
会议id |
非空 |
roomid |
int(2) |
会议室id |
非空 |
·meetingid为外键,对应主键是m_meeting表中的id字段
·roomid为外键,对应主键是m_room表中的id字段
字段 |
字段类型 |
释义 |
备注 |
facilityid |
int(2) |
闸机id |
非空 |
roomid |
int(2) |
会议室id |
非空 |
·facilityid为外键,对应主键是m_facility表中的id字段
·roomid为外键,对应主键是m_room表中的id字段
字段 |
字段类型 |
释义 |
备注 |
userid |
int(8) |
用户id |
非空 |
departmentid |
int(2) |
部门id |
非空 |
·userid为外键,对应主键是m_user表中的id字段
·departmentid为外键,对应主键是m_department表中的id字段
字段 |
字段类型 |
释义 |
备注 |
facilityid |
int(2) |
闸机id |
非空 |
roomid |
int(2) |
会议室id |
非空 |
·facilityid为外键,对应主键是m_facility表中的id字段
·roomid为外键,对应主键是m_room表中的id字段
在web开发中,表现层涉及到的技术统称为前端开发技术,现就本系统中所用到的前端技术介绍如下:
CSS,层叠样式表的简称,英文全称Cascading Style Sheets,它是一种用来修饰静态网页的语言,定义了HTML中元素的显示方式。CSS的出现是为了将web设计的结构与样式进行分离,因此CSS作为HTML的补充,极大的丰富了HTML的表现形式。 CSS为HTML提供了丰富多样的样式,允许对HTML任何元素进行设计,改变元素的大小、修饰方式以及其它界面效果。CSS代码一般放入后缀为“.css”的文本文件中,然后在HTML文件中加入style标签进行引用。
HTML,超文本标记语言的简称,英文名全称“Hyper Text Markup Language”,它并不是一种编程语言,而是一种用于网页创建的标准标记语言,由浏览器解释和执行。HTML文件本质上是一个文本文件,这个文本文件中包含许多不同的标签,浏览器通过识别不同的标签进行解释,然后展示给用户不同的界面。一个HTML文本文件可以分为三个部分:html标签,文件所有代码均放在html标签内,head标签,包含网页的标题名称以及说明,不会显示在浏览器窗体中,body标签,该部分代码负责浏览器窗体的显示。
JavaScript是一种直译式的客户端脚本语言,其代码在计算机中不进行预编译,作用主要是为浏览器窗体添加交互行为,这样就实现了前端设计结构、样式、行为的分离。JavaScript的出现使得网页内容更加的生动丰富,用户与网页之间的交互性得到了明显的改善。作为一种前端语言,JavaScript代码在浏览器中执行,从而极大地减轻了服务器的压力。JavaScript代码与CSS代码类似,通常封装于一个单独的文件,在HTML文件中通过标签script进行调用。JavaScript具有跨平台特性,支持市场上绝大多数的浏览器。
Vue.js 是一套用于构建用户界面的渐进式 JavaScript 框架,也是一个创建单页应用的 Web 应用框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还非常容易与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。相对于 Angular 来说,Vue 更加灵活,它可以让你以期望的方式组织应用程序,而不是任何时候都必须遵循 Angular 制定的规则。且它仅是一个视图层,所以你可以将它嵌入一个现有页面,而不一定要做成一个庞大的单页应用
Element是一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库。它是由饿了么前端团队推出的基于 Vue 封装的 UI 组件库,提供了丰富的 PC 端组件,简化了常用组件的封装,大大降低了开发难度。
异步刷新技术[38],英文全称Asynchronous Javascript And XML。以前的web设计中要涉及到大量的界面刷新,当界面上的链接被点击后,前端会传递请求至服务器,服务器根据用户请求返回整个页面,即使只有一小部分变化,浏览器也会加载整个页面。Ajax的主要优势在于用户请求以异步的方式发送至服务器,针对服务器返回的数据以局部刷新的方式更新页面,这种方式极大的提升了用户体验。Ajax的技术核心是JavaScript的XMLHttpRequest对象,浏览器通过该对象发送请求并接收服务器返回数据。
后端采用java语言和MySQL数据库搭建成项目结构,使用SpringBoot和Mybatics-Plus框架进行数据持久化,通过API框架-Swagger定义接口文档。此外,后端应用WebSocket协议与闸机系统进行全双工通信,实时接收前端发送的文字消息与图片流,使得客户端和服务器之间的数据交互变得更加简单,允许服务端主动向客户端主动推送数据,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。后端应用Http超文本传输协议与人脸识别模块进行数据交互,基于请求/响应的形式使得数据简单传输并及时反馈给服务器。两种通信方式相辅相成,使得用户并发刷脸签到的完成时间控制在2-3秒以内,大大提高了客户端与服务器端的请求响应速率。
MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
无侵入、损耗小,强大的 CRUD 操作。支持 Lambda 形式调用主键自动生成、ActiveRecord 模式、自定义全局通用操作。
此外还内置代码生成器、内置分页插件、分页插件支持多种数据库,其中支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库内置性能分析插件、内置全局拦截插件。
图3-1 MP实现流程图
较少的控制开销。在连接创建后,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对较小。在不包含扩展的情况下,对于服务器到客户端的内容,此头部大小只有2至10字节(和数据包长度有关);对于客户端到服务器的内容,此头部还需要加上额外的4字节的掩码。相对于HTTP请求每次都要携带完整的头部,此项开销显著减少了。
更强的实时性。由于协议是全双工的,所以服务器可以随时主动给客户端下发数据。相对于HTTP请求需要等待客户端发起请求服务端才能响应,延迟明显更少;即使是和Comet等类似的长轮询比较,其也能在短时间内更多次地传递数据。
保持连接状态。与HTTP不同的是,Websocket需要先创建连接,这就使得其成为一种有状态的协议,之后通信时可以省略部分状态信息。而HTTP请求可能需要在每个请求都携带状态信息(如身份认证等)。
更好的二进制支持。Websocket定义了二进制帧,相对HTTP,可以更轻松地处理二进制内容。
可以支持扩展。Websocket定义了扩展,用户可以扩展协议、实现部分自定义的子协议。如部分浏览器支持压缩等。
更好的压缩效果。相对于HTTP压缩,Websocket在适当的扩展支持下,可以沿用之前内容的上下文,在传递类似的数据时,可以显著地提高压缩率。
图3-2 Java后端逻辑流程图
近几年来,深度学习方法被广泛应用于计算机视觉领域,深度学习框架为人脸识别的开发提供了丰富的接口,大大增加了开发效率。我们选择了将传统的OpenCV计算机视觉库与Keras框架相结合,这为我们的人脸识别奠定了基础。同时为了更好的将JAVA后端与Python人脸识别进行衔接,我们采用了基于Python编程语言的Flask框架进行设计实现。Flask[43]是一款基于python进行开发的轻量级web框架,依赖于Jinja2模板引擎和Werkzeug的WSGI服务。图3-3为后端Flask框架处理模块流程图,Werkzeug本质上是一个Socket服务端,其作用在于接收前端发送的HTTP请求并进行相应的预处理,然后触发Flask程序,设计者根据Flask框架以及其扩展功能对请求进行数据处理,最后返回给前端,如果要返回给前端复杂的内容时,需要使用Jinja2模板对HTML模板进行渲染,将渲染后的模板返回前端。
图3-3 Flask工作流程过程图
总结各类会议的不同需求,本系统设计的工作流程如图3-4所示:
(1)会议管理员在会议前确定会议的相关信息,包括会议的举办日期、签到有效期以及会议的简要介绍,然后通过本系统后台进行会议发布。
(2)参会人员网上填写个人的必要信息进行会议注册,根据要求上传本人正面人脸照片至服务器。
(3)在规定的会议签到日期内,参会人员前往会议签到地点通过闸机摄像头进行现场刷脸签到,开会过程中管理员也可对特殊人员进行补签-手动代签。签到结束后,会议管理员通过后台对签到人员信息进行统计,并导出保存Excel文件,保证后续其它会议内容的顺利进行。
图3-4 会议流程图
人脸识别开发流程如图3-5所示。
图3-5 开发流程图
人脸识别进行会议签到流程如图3-6所示。
图3-6人脸识别签到流程图
本项目是一个基于深度学习下的人脸识别会议签到系统。前端采用Vue3框架和ElementUI组件搭建数据可视化页面,后端基于java语言使用SpringBoot+Mybatics Plus框架进行数据持久化,核心技术是以python语言的基于OpenCV的图像预处理、Retinaface的人脸检测和Facenet的人脸识别,使用Flask框架封装为API接口给JAVA后端调用实现人脸识别。
系统采用静默活体检测,样本数据集采用开源的活体检测数据集CASIA-FASD,人脸检测采用Wider Face数据集进行训练,包含32,203张图片,总共标注393,703个人脸数据。在模型预训练阶段,采用mobilefacenet网络与ArcFace损失函数相结合的方式在数据集CISIA-WebFace(包含上万个人共计约44万张图像)上进行初训练120代,后采用OpenCV图像处理技术对数据集进行清洗再训练30代。人脸识别采用CISIA-WebFace数据集进行训练,包含上10575个人共计约452960张图像。最终模型在LFW数据集上进行测试得到了99.8%的准确率。前后端通过WebSocket协议通信进行数据实时交互,实现了线上线下参会人员管理和人脸识别会议签到。
基于深度学习的人脸识别方法很大程度上克服了传统方法对光照以及面部表情敏感的问题,但现实应用场景中由于光线影响造成的面部图像过暗或者面部光照分布不均很大程度上影响了人脸识别的准确率,因此在摄像头采集的人脸图像送入人脸检测网络前需要对图像进行预处理,这样对后续的人脸检测以及识别有很大的帮助。
图像直方图常用来描述图像中的亮度分布情况,其中横坐标表示单通道中的像素值,纵坐标表示图像中对应像素值的个数,直方图均衡化的目的是通过调节图像直方图的均衡分布来增强图像的对比度。 现实图像采集场景中,由于光照的影响,经常会发生直方图不均匀造成的面部区域过亮或过暗的情况,对后期的特征提取以及特征比对造成影响。一般情况直方图针对的是单通道灰度图像,由于本系统通过摄像头网络采集到的图片为RGB三通道图像,因此图像预处理中将对三个通道分别进行直方图均衡化。首先对采集图像的平均亮度进行统计,与设定的阈值进行对比,对未达到阈值的图像进行直方图均衡化处理,最后将处理后的图像送入人脸检测网络。 直方图表示数字图像中每一个像素值出现频率的统计关系,直方图均衡化实质上是对图像像素进行的非线性拉伸,重新分配每个单元的像素值,使的一定灰度范围内每个像素值的数目大致相等。图2-3,图2-4展示了图像直方图均衡化前后的对比,可以明显看出,处理后的面部图像特征更加的清晰。
(a)原始图像 (b)直方图均衡化后图像
图4-1 直方图平衡化效果
(c)原始图像 (d)直方图均衡化后图像
图4-2 直方图平衡化效果
人脸检测,顾名思义,检测数字图像中是否包含人脸的一种计算机技术,从大方向来说,人脸检测可以分为三种方向:
本项目采用统计的人脸检测技术,从wider face官网下载开源的人脸数据集进行训练。Retinaface是优秀的人脸检测算法,基于one-stage的人脸检测网络。Retinaface以MobilenetV1-0.25(核心思想:深度可分离卷积,减少参数)和Resnet两种网络作为主干特征提取网络。对于待检测图片,我们应用了mobilenet0.25进行特征提取,FPN(Feature Pyramid Network)构建图像特征金字塔,得到三个有效特征层,SSH(Single Stage Headless)加强特征提取。通过加强的有效特征层可获得预测结果,对预测结果进行解码操作,同时进行非极大值抑制筛选出得分最高的框,从而得到最终结果。
图4-3 人脸检测过程
利用Retinaface我们可以获得一张图片中人脸的位置,但是我们有时截取下来的人脸是这样的:
图4-4 直接截取人脸
我们可以很明显的看出来人脸是歪着的,我们如果人脸可以正过来,那么将对人脸的特征提取非常有好处,所以在我们在人脸截取前在Retinaface预测后将图片以鼻子所在的特征点坐标为中心,两只眼睛坐标连线与水平的夹角为旋转角度对图片进行旋转处理后再截取人脸,保证图片不失真以及人脸的对齐。
图4-5 对图片进行矫正后截取人脸
FaceNet是Google在2015年CVPR会议上提出的一种用于面部特征提取的网络结构,如图4-6所示,将一批图像训练样本送入卷积神经网络,对得到的特征向量进行L2归一化,这样所有的人脸图像特征被映射到一个半径为1的超球面上,最后使用Triplet Loss计算损失更新网络参数。
图4-6 Facenet网络结构
模型训练中将FaceNet传统的Triplet Loss修改为ArcFace Softmax损失函数。ArcFace由Jiankang Deng等人于2018年提出,是Softmax Loss函数的改进版本。
Softmax Loss函数的定义如下:
人脸检测采用Wider Face数据集进行训练,包含32,203张图片,总共标注393,703个人脸数据。
人脸识别采用CISIA-WebFace数据集进行训练,包含上10575个人共计约452960张图像。
之前考虑了MTCNN和retinaFace这两种模型,但是MTCNN模型有一个缺点,就是当图像中的人脸数目比较多的时候,MTCNN的性能下降的比较快,而retinaFace不受人脸数量的限制,这是由于MTCNN使用了图像金字塔算法,需要对图像进行多次缩放,导致前向运算次数比较多,严重拖慢了检测速度,而retinaFace是基于FPN的,无需进行图像金字塔,仅需要前向运算一次即可。而且从AP的角度来说,retinaFace在所有的验证集和测试集都达到的最好的AP,所以我们选取了retinaFace这种模型。
RetinaFace在实际训练的时候使用两种网络作为主干特征提取网络。分别是MobilenetV1-0.25和Resnet。使用Resnet可以实现更高的精度,使用MobilenetV1-0.25可以在CPU上实现实时检测。
我们选取了MobilenetV1-0.25作为主干特征提取网络,MobileNet模型是Google针对手机等嵌入式设备提出的一种轻量级的深层神经网络,其使用的核心思想便是depthwise separable convolution。对于传统卷积而言,假设其输入通道数为m,输出通道数为n,卷积层大小为a×a,可计算出卷积层的参数数量y1=a×a×m×n,对于dsc而言,其卷积层的参数数量y2=m×a×a+1×1×m×n,显然,y2:y1=1:3,因此,在参数量相同的前提下,采用Separable Convolution的神经网络层数可以做的更深。
近年来,MobilenetV1,ShuffleNet和MobileNetV2等轻量级网络多用于移动终端的视觉识别任务,但是由于人脸结构的特殊性,这些网络在人脸识别任务上并没有获得满意的效果。针对这一问题,北京交通大学的Sheng Chen等人在论文《MobileFaceNets: Efficient CNNs for Accurate RealTime Face Verification on Mobile Devices》提出了一种专门针对人脸识别的轻量级网络MobileFaceNet。
训练代数为150代,将每代模型的loss值以折线图的形式呈现,最终得出模型在loss值为32.1-32.3时较为收敛,如下图所示。
对于loss值在32.1-32.3的模型全部进行模型评估,在同等测试样本的条件下,可得到AP最高的模型,易区分样本AP值为89%,中等区分样本AP值为86%,难区分样本AP值为72%。因此选用该模型。
图4-14 各类型样本最高AP值
在模型预训练阶段,采用mobilefacenet网络与ArcFace损失函数相结合的方式在数据集CISIA-WebFace上进行初训练120代,后采用opencv图像处理技术对数据集进行清洗再训练30代,最后选择测试结果中最好的模型进行构建源码,数据集CISIA-WebFace包含上万个人共计约44万张图像。
本系统采用前后端分离的架构,前端采用VUE框架实现。考虑系统需要与人进行交互,前端界面设计应务求简洁、美观、实用,操作界面需切合大多数人的使用习惯,对各个模块的操作需要有详细的说明,前后端的数据交互需要通过Ajax异步刷新技术完成,尽量避免刷新全部界面,造成不好的用户体验。
后端选择IDEA平台上集成开发,采用Java语言和MySQL数据库搭建成项目结构,使用SpringBoot和MybaticsPlus框架进行数据持久化,通过API框架-Swagger定义接口文档。此外,后端应用WebSocket协议与闸机系统进行全双工通信,实时接收前端发送的文字消息与图片流,使得客户端和服务器之间的数据交互变得更加简单,允许服务端主动向客户端主动推送数据,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。后端应用Http超文本传输协议与人脸识别模块进行数据交互,基于请求/响应的形式使得数据简单传输并及时反馈给服务器。两种通信方式相辅相成,使得用户并发刷脸签到的完成时间控制在2-3秒以内,大大提高了客户端与服务器端的请求响应速率。
人脸图片可通过URL链接或者base64图片编码格式进行传输,将解析出来的人脸图片传进人脸检测模型进行人脸检测,再进人脸对齐截取,之后吧截取后的人脸传入facenet网络进行预测,得到人脸的128位编码再与face_encodings_default.npy中的人脸进行比较并且从中获取人脸用户信息,返回人脸距离最小并且大于识别阈值的人脸用户名字与用户ID。
人脸识别端采用Python编写,使用Flask封装成人脸识别对应功能接口,对请求进行数据处理,然后返回给Java后端。
由于anaconda官网下载速度较慢,我们选择在清华镜像官网进行下载。地址为:Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror ,选择anaconda3-2019.10进行下载。
图5-1 anaconda下载
根据指引安装anaconda,安装过程中需要勾选如下图所示的第一个单选框(第二个默认选中),以此来将anaconda加入环境变量中。
图5-2 anaconda安装
首先,依次选择:开始->Anaconda3(64-bit)->Anaconda Prompt(Anaconda3)。
图5-3 打开Anaconda Prompt
输入conda create -n TF2.1 python=3.7新建一个名为TF2.1的环境,python版本为3.7。
图5-4 创建环境
安装过程遇到如图所示的选择请输入y表示同意安装相关软件包。
图5-5 安装软件包
输入conda activate TF2.1进入TF2.1环境。
图5-6 进入环境
输入conda install cudatoolkit=10.1安装英伟达的SDK 10.1版本。
图5-7 安装英伟达SDK
输入conda install cudnn=7.6安装英伟达深度学习软件包7.6版本。
图5-8 安装英伟达深度学习软件包
输入pip install tensorflow==2.1 -i https://pypi.douban.com/simple使用豆瓣的tensorflow镜像加速安装2.1版本的tensorflow即可。
图5-9 安装tensorflow
安装完成之后,我们进入python,输入import tensorflow as tf,然后输入tf.__version__查看tensorflow版本,如果显示2.1.0,即为安装成功。
图5-10 tensorflow安装成功
在tensorflow2.1的环境下,依次安装Keras、Tensorflow-gpu、Sklearn、Opencv-python、H5py、Requests、Tqdm、Numpy、Flask、Flask-cors 、Protobuf 、Matplotlib、Pillow,其对应的版本号如图1所示,输入pip install 安装包==版本号 -i https://pypi.douban.com/simple,图5-11以安装Keras为例。
图5-11 安装Keras
图5-12 所需安装包
Jupyter Notebook使用对应数据集和人脸算法对人脸检测模型和人脸识别模型进行训练。
图5-14 SeeTaaS平台上进行训练
在一些身份验证场景确定对象真实生理特征的方法,可有效抵御照片、换脸、面具、遮挡以及屏幕翻拍等常见的攻击手段,从而帮助用户甄别欺诈行为,保障用户的利益。目前活体检测分为三种:
本项目采用静默活体检测,样本数据集采用开源的活体检测数据集CASIA-FASD,通过mobilenet二分类进行模型训练,正样本为真人,负样本包括但不仅限于视频、图片、面具等。通过人脸检测可得到人脸框左上和右下的坐标信息,然后进行放大操作,仅留下人脸部分,然后传入网络中进行预测,可得到预测结果,即得分,得分大于预设阈值的图片为真人,反之为假人。(注:光线或亮度要求较高)
图6-1 活体检测过程
我们的测试分为两个阶段,以此来进行对照实验,以同学A为例。
我们让A同学亲自进行会议签到,如图所示,可以看到界面显示签到成功,A同学本人的活体得分为0.9998802,即为真人。
图6-2 活体检测签到演示
图6-3 活体检测得分
我们让A同学拿着手机照片(他本人)完全覆盖摄像头进行会议签到,如图所示,可以看到界面没有显示签到成功,A同学照片的活体得分为0.00514308,即为假人。
图6-4 活体检测签到演示
图6-5 照片检测得分
每个用户的人脸库容量为十张图片,后台对识别成功并且确认为当前人脸的个人已有人脸信息进行动态更新,当库满时再次更新时后端会剃除达标率最低的一张人脸。
图6-6 识别时人脸库信息
图6-7 更新后用户人脸库信息
如图6-6,图6-7所示,识别成功后在该用户人脸库达标率达到80%(大于设置阈值70%),剔除人脸库中与闸机识别成功人脸欧氏距离最大的一个该用户人脸信息,添加闸机识别时的人脸,对该用户人脸库进行动态更新。
通过设置指定阈值动态更新人脸库操作,让用户的人脸信息可靠地动态更新,进而提升人脸识别的准确性。
闸机前后端通过WebSockt协议进行全双工通信使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,不用频繁打开关闭HTTP请求,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输,从而大大提高响应速率。
此外,后端通过多线程为每一个请求数据交互的闸机提供独立空间,在同一时间多个请求下也就是多人并发签到能并行执行任务,避免排队等候并且快速返回结果。
图6-8 闸机界面
图6-9 批量导入未注册参会人员信息
图6-10 功能菜单
图6-11 登录页面
图6-12 个人中心