【项目设计】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

相关推荐
张人玉1 小时前
人工智能——猴子摘香蕉问题
人工智能
草莓屁屁我不吃2 小时前
Siri因ChatGPT-4o升级:我们的个人信息还安全吗?
人工智能·安全·chatgpt·chatgpt-4o
小言从不摸鱼2 小时前
【AI大模型】ChatGPT模型原理介绍(下)
人工智能·python·深度学习·机器学习·自然语言处理·chatgpt
AI科研视界2 小时前
ChatGPT+2:修订初始AI安全性和超级智能假设
人工智能·chatgpt
霍格沃兹测试开发学社测试人社区2 小时前
人工智能 | 基于ChatGPT开发人工智能服务平台
软件测试·人工智能·测试开发·chatgpt
小R资源2 小时前
3款免费的GPT类工具
人工智能·gpt·chatgpt·ai作画·ai模型·国内免费
Karoku0663 小时前
【网站架构部署与优化】web服务与http协议
linux·运维·服务器·数据库·http·架构
geek_Chen013 小时前
虚拟机共享文件夹开启后mnt/hgfs/下无sharefiles? --已解决
linux·运维·服务器
(⊙o⊙)~哦4 小时前
linux 解压缩
linux·运维·服务器
artificiali5 小时前
Anaconda配置pytorch的基本操作
人工智能·pytorch·python