【项目设计】Facial-Hunter

目录

一、项目介绍

二、开发环境以及技术

三、项目架构设计

[3.1 项目总体架构](#3.1 项目总体架构)

[3.2 客户端架构](#3.2 客户端架构)

[3.3 主服务端架构](#3.3 主服务端架构)

[3.4 处理服务端架构](#3.4 处理服务端架构)

[3.5 数据库设计](#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

相关推荐
艾思科蓝-何老师【H8053】13 分钟前
【ACM出版】第四届信号处理与通信技术国际学术会议(SPCT 2024)
人工智能·信号处理·论文发表·香港中文大学
weixin_4526006941 分钟前
《青牛科技 GC6125:驱动芯片中的璀璨之星,点亮 IPcamera 和云台控制(替代 BU24025/ROHM)》
人工智能·科技·单片机·嵌入式硬件·新能源充电桩·智能充电枪
学术搬运工41 分钟前
【珠海科技学院主办,暨南大学协办 | IEEE出版 | EI检索稳定 】2024年健康大数据与智能医疗国际会议(ICHIH 2024)
大数据·图像处理·人工智能·科技·机器学习·自然语言处理
扣得君1 小时前
C++20 Coroutine Echo Server
运维·服务器·c++20
右恩1 小时前
AI大模型重塑软件开发:流程革新与未来展望
人工智能
keep__go1 小时前
Linux 批量配置互信
linux·运维·服务器·数据库·shell
矛取矛求1 小时前
Linux中给普通账户一次性提权
linux·运维·服务器
图片转成excel表格1 小时前
WPS Office Excel 转 PDF 后图片丢失的解决方法
人工智能·科技·深度学习
jieshenai2 小时前
使用VSCode远程连接服务器并解决Neo4j无法登陆问题
服务器·vscode·neo4j
ApiHug2 小时前
ApiSmart x Qwen2.5-Coder 开源旗舰编程模型媲美 GPT-4o, ApiSmart 实测!
人工智能·spring boot·spring·ai编程·apihug