【项目设计】Facial-Hunter

news2024/9/19 8:39:37

目录

一、项目介绍

二、开发环境以及技术

三、项目架构设计

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,分别存储了所有的人员基础信息和人脸信息

字段名数据类型宽度是否主键描述
IDVarchar30ID编号
nameVarchar20姓名

目前在PersonnelSummary表中仅有name这一基础信息,是因为本系统设计识别成功后仅展示ID和name信息。若需展示更多新信息可后续自行添加

字段名数据类型宽度是否主键描述
IDVarchar30ID编号
faceDateMediumtext16MB人脸数据

四、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)icon-default.png?t=O83Ahttps://github.com/GG-Bruse/Facial-Hunter

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2145898.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Elasticsearch系列十二】聚合-电视案例

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

反射的相关内容

目录 一、什么是反射 二、为什么会有反射 三、反射是如何工作的 获取类信息的三种方式: 例: 四、获取类信息并调用 1.获取 (1)获取变量 获取全部类信息 获取public修饰的 获取指定某一个 (2)…

【新手上路】衡石分析平台使用手册-租户管理

租户管理​ 衡石系统支持服务一个平台方和多个企业客户的租户模式,平台方管理租户,为租户提供数据,租户在系统内进行数据分析。 衡石系统增加工作空间的设计,在平台方和租户之间提供单向的传递通道,平台厂商可以轻松…

C++map,set,multiset,multimap详细介绍

目录 1. 关联式容器 2. 键值对 3. 树形结构的关联式容器 3.1 set set的介绍 set的使用 1. set的模板参数列表 2. set的构造 3. set的迭代器 4. set的容量 5. set的修改操作 6. set的使用举例 ​3.2 map map的介绍 map的使用 1. map的模板参数声明 2. map的构造 …

实例讲解电动汽车钥匙ON挡上下电控制策略及Simulink建模方法

在电动汽车VCU开发中,上下电控制是其中一个核心控制内容,也是其他控制功能的基础,而钥匙ON挡上下电又是整车上下电的基础。本文介绍电动汽车钥匙ON挡上下电的控制策略及Simulink建模方法。 目录 一、整车高压原理 二、钥匙ON挡上下电控制策…

计算机毕业设计 办公用品管理系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…

Aegisub字幕自动化及函数篇(图文教程附有gif动图展示)(一)

目录 自动化介绍 bord 边框宽度 随机函数 fsvp 随机颜色 move 自动化介绍 自动化介绍:简单来说自动化能让所有字幕行快速拥有你指定的同一种特效 对时间不同的行应用相同的效果 只要设计好一个模板,然后让所有行都执行这个模板上的特效就好了 首先制作模板行…

kafka消息发送几种方式

同步发送 or 异步发送 消息发送根据是否需要处理发送的结果分为同步发送、异步发送。 同步发送:等待发送结果返回,这种方式是可靠的,因为异常能及时处理,但同步发送需要阻塞等待一条消息发送完才处理下一条,吞吐量差。…

esp32核心跑分程序

https://github.com/ochrin/coremark/tree/esp32 最近一直捣腾esp32s3 (Sense) 做微型摄像。过程中发现一款不错的跑分软件,特此记一笔。 其中针对esp32s3各类参数设定(用idf.py menuconfig),做个记录。 CPU Frequency去240MHz&#xff08…

探索网络世界:TCP/IP协议、Python Socket编程及日常生活比喻

网络介绍 🌐 网络就像是一个无形的纽带,把我们所有人👫👫👫紧紧相连。没有网络的世界,就像是失去了色彩的画布,多么的单调和无趣啊!🎨 单机游戏 🎮 单机游…

ER 图 Entity-Relationship (ER) diagram 101 电子商城 数据库设计

起因, 目的: 客户需求, 就是要设计一个数据库。 过程, 关于工具: UI 设计,我最喜欢的工具其实是 Canva, 但是 Canva 没有合适的模板。我用的是 draw.io, 使用感受是,很垃圾。 各种快捷键不适应,箭头就是点不住&…

VuePress搭建文档网站/个人博客(详细配置)主题配置

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

JavaEE初阶——初识EE(Java诞生背景,CPU详解)

阿华代码,不是逆风,就是我疯,你们的点赞收藏是我前进最大的动力!!希望本文内容能帮到你! 目录 零:Java的发展背景介绍 一:EE的概念 二:计算机的构成 1:CU…

Python面试宝典第50题:分割等和子集

题目 给你一个只包含正整数的非空数组nums,请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 示例 1: 输入:nums [1, 5, 11, 5] 输出:True 解释:数组可以分割成[1, 5, 5]和[11]。 示…

C++之第十二课

课程列表 哎呀呀,失踪人口回归了!(前段时间跑去B站了,久等了) 今天来讲——数组 有一道题是这样的: 有n个数,请输出其中最大的数。 原来我们就要: int a,b,c... 但是——数组…

Golang开发的OCR-身份证号码识别(不依赖第三方)

身份证号码识别(golang) 使用golang的image库写的身份证号码识别,还有用了一个resize外部库,用来更改图片尺寸大小,将每个数字所在的图片的大小进行统一可以更好的进行数字识别,库名 :“github…

ARM 工业边缘计算机与 C# 编程的完美融合

在工业领域,随着智能化和数字化的不断推进,ARM 工业边缘计算机凭借其出色的性能和低功耗等优势,逐渐成为众多应用场景的重要支撑。而 C# 编程语言的强大功能和广泛适用性,使其在与 ARM 工业边缘计算机的结合中展现出了巨大的潜力。…

Python | Leetcode Python题解之第415题字符串相加

题目: 题解: class Solution:def addStrings(self, num1: str, num2: str) -> str:res ""i, j, carry len(num1) - 1, len(num2) - 1, 0while i > 0 or j > 0:n1 int(num1[i]) if i > 0 else 0n2 int(num2[j]) if j > 0 e…

C++ -命名空间-详解

博客主页:【夜泉_ly】 本文专栏:【C】 欢迎点赞👍收藏⭐关注❤️ C -命名空间-详解 1.C语言缺点之一 -- 命名冲突2.命名空间2.1定义2.2使用访问命名空间中的变量展开命名空间域指定访问命名空间域 2.3其他功能 3.C 标准库中的命名空间指定展开…

华为OD机试 - 二维伞的雨滴效应(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…