目录
一、项目介绍
二、开发环境以及技术
三、项目架构设计
3.1 项目总体架构
3.2 客户端架构
3.3 主服务端架构
3.4 处理服务端架构
3.5 数据库设计
四、FaceNet
五、代码实现
一、项目介绍
该项目是基于深度学习与负载均衡的人脸识别系统
该项目主要由三个部分组成:
- 客户端:客户端进行人脸检测和图片预处理等功能
- 主服务端:主服务端负责数据库操作以及负载均衡分发
- 处理服务端:处理服务端通过模型推理进行人脸识别
二、开发环境以及技术
客户端(C++)
开发环境:Windows11、Qt Creator
所用技术:Qt、OpenCV C++
主服务端(C++)
开发环境:腾讯云轻量应用服务器(CentOS7.6)、VSCode
所用技术:MySQL C Connector、iniparser、nlohmann/json、cpp-httplib、boost
处理服务端(C++)
开发环境:腾讯云轻量应用服务器(CentOS7.6)、VSCode
所用技术:iniparser、nlohmann/json、cpp-httplib、ONNX Runtime、OpenCV C++
模型(Python)
开发环境:Windows11、Anaconda3
所用技术如下:
三、项目架构设计
3.1 项目总体架构
各个机器上的客户端的图片请求都发送到主服务端中;主服务端读取数据库后形成新的请求,负载均衡的发送到各个人脸识别服务端中;人脸识别服务端将两张图片信息进行人脸比对(人脸识别)后将结果返回给主服务端;主服务端将多个结果整合后返回给客户端,由客户端进行显示
3.2 客户端架构
客户端主要用于向用户展示人脸检测、人脸识别的结果。定时器每隔20ms触发一次,通过摄像头获取一帧图像;再对该图片进行人脸检测并将检测出的人脸框出(标识);将处理后图像显示出来,可以实时看到人脸检测的处理结果;将框出的人脸截取出来,进行预处理后发送给主服务端;主服务端返回结果后,客户端显示人脸识别处理的结果3s(由定时器实现时间控制);只有显示人脸识别处理结果这一步骤结束后,才会重新触发向发送主服务器这一步骤
本文中选择Haar级联检测器用作人脸检测,其速度快、资源消耗低
3.3 主服务端架构
主服务端由MVC结构修改而来,但裁剪了视图层模块,添加了负载均衡模块。当请求发送到服务器上的主服务端时,将图片信息交付至控制器;控制器向模型层请求数据,模型层向MySQL数据库进行请求;当控制器拿到图片数据后,加上请求中的图片信息,共两张图片数据。形成新的请求,通过负载均衡模块,发送给当前负载最小的人脸识别处理服务端
数据库中同一人存在多张人脸图片信息,当第一张图片命中后会继续与其他图片进行对比,达到一定阈值才判断为同一人,此操作在系统层面提高判断准确率,若使用场景中请求较为频繁,可以仅判断一次
负载均衡模块采用最小连接数调度。在这种方法中,负载均衡器会周期性地(轮询)选择当前连接数最少的服务器处理新请求。确保每个服务器的负载相对均衡,因为连接数少的服务器更有可能能够及时响应新的请求,从而有效地利用整体系统资源
进行网络发送时,采用异步任务进行发送。可以提高程序响应性和并发能力,提高系统资源利用率。相对于thread多线程编程而言,简化多线程编程,简化并发代码的编写和维护
3.4 处理服务端架构
在人脸识别服务端架构中,采用ONNX Runtime进行模型的部署推理。当请求发送到人脸识别服务端时,调用由ONNX Runtime部署加载完成的人脸识别模型Facenet进行处理,处理完成后返回给主服务端
3.5 数据库设计
数据库中定义了两张表,分别为PersonnelSummary和FacialInformation,分别存储了所有的人员基础信息和人脸信息
字段名 | 数据类型 | 宽度 | 是否主键 | 描述 |
---|---|---|---|---|
ID | Varchar | 30 | 是 | ID编号 |
name | Varchar | 20 | 否 | 姓名 |
目前在PersonnelSummary表中仅有name这一基础信息,是因为本系统设计识别成功后仅展示ID和name信息。若需展示更多新信息可后续自行添加
字段名 | 数据类型 | 宽度 | 是否主键 | 描述 |
---|---|---|---|---|
ID | Varchar | 30 | 是 | ID编号 |
faceDate | Mediumtext | 16MB | 否 | 人脸数据 |
四、FaceNet
主干特征提取网络
本项目中,FaceNet提供了两种主干特征提取网络的实现,分别是:Inception-ResNetV1和MobilenetV1
Loss
总体Loss由Triplet Loss和Cross-Entropy Loss组成,Triplet Loss用于进行不同人的人脸特征向量欧几里得距离的扩张,同一个人的不同状态的人脸特征向量欧几里得距离的缩小。Cross-Entropy Loss(交叉熵损失函数)用于人脸分类,具体作用是辅助Triplet Loss收敛。交叉熵损失在模型训练过程中表现出较好的稳定性和收敛性,特别是在优化过程中,其能够有效地指导模型在训练中逐步改进预测概率
数据集
本文中将CASIA-WebFace数据集划分为训练集、验证集,训练集用于训练模型的参数,验证集用于调整模型的超参数和监控模型的训练过程。本文中按照99:1的比例划分训练集与验证集,测试集则单独使用LFW数据集
resize
模型要求输入图像的大小固定为特定的尺寸。若原始图像的大小与模型期望的输入大小不匹配,则需将图像调整到合适的尺寸
同时,在训练过程中,为了保持输入数据的一致性,通常需要将所有图像调整为相同的尺寸。这样可以确保每张图像都有相同的特征表示,并且模型能够从中学习到一致的模式。本文中通过添加灰条进行不失真的resize
模型验证率与准确率
五、代码实现
GG-Bruse/Facial-Hunter: Facial Hunter (github.com)https://github.com/GG-Bruse/Facial-Hunter